Re: [Qemu-devel] [PATCH 15/19] Add VSX xmax/xmin Instructions
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
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
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
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
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
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