Re: [Qemu-devel] [PATCH 15/19] Add VSX xmax/xmin Instructions

2013-10-25 Thread Tom Musta

On 10/24/2013 5:10 PM, Peter Maydell wrote:

Can't you use the min and max softfloat functions? Those are
there specifically because the corner cases mean you can't
implement them using the comparisons. (For instance for
the example you quote of max(-0.0, +0.0) they return +0.0
as you require.)


I tried this but didn't have much luck getting results to match
the P7 hardware.  Unfortunately, I don't recall the details.
Let me try this approach again.






Re: [Qemu-devel] [PATCH 15/19] Add VSX xmax/xmin Instructions

2013-10-25 Thread Peter Maydell
On 25 October 2013 14:52, Tom Musta tommu...@gmail.com wrote:
 On 10/24/2013 5:10 PM, Peter Maydell wrote:

 Can't you use the min and max softfloat functions? Those are
 there specifically because the corner cases mean you can't
 implement them using the comparisons. (For instance for
 the example you quote of max(-0.0, +0.0) they return +0.0
 as you require.)

 I tried this but didn't have much luck getting results to match
 the P7 hardware.  Unfortunately, I don't recall the details.
 Let me try this approach again.

The functions are supposed to match the IEEE mandated min/max
behaviour, and I tested the ARM instructions that use them,
so unless the PPC chip designers have gone rather off-piste
they ought to work :-) (It can happen, though, IIRC x86 has
some rather weird non-IEEE min/max insns.)

-- PMM



Re: [Qemu-devel] [PATCH 15/19] Add VSX xmax/xmin Instructions

2013-10-24 Thread Richard Henderson
On 10/24/2013 09:26 AM, Tom Musta wrote:
 Because of the Power ISA definitions of maximum and minimum
 on various boundary cases, the standard softfloat comparison
 routines (e.g. float64_lt) do not work as well as one might
 think.  Therefore specific routines for comparing 64 and 32
 bit floating point numbers are implemented in the PowerPC
 helper code.

Really?  All I see in the document is fp, used both here
in the minmax insn and in the cmp insn.

If the softfloat compare isn't good enough for minmax, how
can it be good enough for cmp?


r~



Re: [Qemu-devel] [PATCH 15/19] Add VSX xmax/xmin Instructions

2013-10-24 Thread Tom Musta

On 10/24/2013 3:45 PM, Richard Henderson wrote:

On 10/24/2013 09:26 AM, Tom Musta wrote:

Because of the Power ISA definitions of maximum and minimum
on various boundary cases, the standard softfloat comparison
routines (e.g. float64_lt) do not work as well as one might
think.  Therefore specific routines for comparing 64 and 32
bit floating point numbers are implemented in the PowerPC
helper code.


Really?  All I see in the document is fp, used both here
in the minmax insn and in the cmp insn.

If the softfloat compare isn't good enough for minmax, how
can it be good enough for cmp?


Example:

The ISA is very explicit that max(-0.0, +0.0) = +0.0.

But the comparison operations (and instructions) both consider
-0.0 == +0.0.  Because of this, I do not see how it is possible
to implement max using float*_eq, float*_lt and float*_le.

See, for example, table 58 (Actions for xsmaxdp) on p. 369 of the
V2.06 ISA.




Re: [Qemu-devel] [PATCH 15/19] Add VSX xmax/xmin Instructions

2013-10-24 Thread Richard Henderson
On 10/24/2013 02:07 PM, Tom Musta wrote:
 
 See, for example, table 58 (Actions for xsmaxdp) on p. 369 of the
 V2.06 ISA.

Bah, I typoed my search in the document and looked at the Altivec insn, which
is only one letter different, and doesn't have the same guarantees.

Reviewed-by: Richard Henderson r...@twiddle.net


r~



Re: [Qemu-devel] [PATCH 15/19] Add VSX xmax/xmin Instructions

2013-10-24 Thread Peter Maydell
On 24 October 2013 17:26, Tom Musta tommu...@gmail.com wrote:
 This patch adds the VSX floating point maximum and minimum
 instructions:

   - xsmaxdp, xvmaxdp, xvmaxsp
   - xsmindp, xvmindp, xvminsp

 Because of the Power ISA definitions of maximum and minimum
 on various boundary cases, the standard softfloat comparison
 routines (e.g. float64_lt) do not work as well as one might
 think.  Therefore specific routines for comparing 64 and 32
 bit floating point numbers are implemented in the PowerPC
 helper code.

Can't you use the min and max softfloat functions? Those are
there specifically because the corner cases mean you can't
implement them using the comparisons. (For instance for
the example you quote of max(-0.0, +0.0) they return +0.0
as you require.)

thanks
-- PMM