On 08/05/2018 04:41 AM, Mark Cave-Ayland wrote: > On 06/07/18 10:03, Mark Cave-Ayland wrote: > >> On 05/07/18 17:48, Richard Henderson wrote: >> >>> On 07/05/2018 09:31 AM, Programmingkid wrote: >>>>> On Jul 3, 2018, at 11:17 AM, Richard Henderson >>>>> <richard.hender...@linaro.org> wrote: >>>>> >>>>> Memory operations have no side effects on fp state. >>>>> The use of a "real" conversions between float64 and float32 >>>>> would raise exceptions for SNaN and out-of-range inputs. >>>> >>>> Would you have any documentation that tells us about converting >>>> between 64 bit and 32 bit floating points? >>> >>> Spelled out right at the beginning of sections 4.6 (load) and 4.7 (store) of >>> Book 1 of the Power ISA manual (version 3.0B) [0]. >>> >>> I've double-checked vs RISU[1] testing of LFS and STFS, with master traces >>> generated on Power 8 ppc64le, so I don't see anything immediately wrong with >>> the patch. But I haven't had time to look further than that. >> >> I've had a quick look at this with the attached patch to compare the helper >> results before your patch and after, writing any differences to the console. >> >> With this patch applied to ppc-for-3.1 I've booted MacOS 9 and recorded the >> output below: >> >> >> $ ./qemu-system-ppc -cdrom MacOS921-macsbug.iso -boot d -M mac99 >> >> helper_todouble diff for arg: 3f800000 d.ll: 3ff0000000000000 ret: >> 3bf0000000000000 >> helper_todouble diff for arg: 3f800000 d.ll: 3ff0000000000000 ret: >> 3bf0000000000000 >> >> (note: MacOS 9 will hang here unless the line marked "Uncommenting this >> allows MacOS to run" in my patch is enabled) >> >> helper_todouble diff for arg: 3f000000 d.ll: 3fe0000000000000 ret: >> 3be0000000000000 >> helper_todouble diff for arg: 3f000000 d.ll: 3fe0000000000000 ret: >> 3be0000000000000 >> helper_todouble diff for arg: 3f800000 d.ll: 3ff0000000000000 ret: >> 3bf0000000000000 >> helper_todouble diff for arg: 3f800000 d.ll: 3ff0000000000000 ret: >> 3bf0000000000000 >> helper_tosingle diff for arg: 3ff0000000000000 f.l: 3f800000 ret: 1f800000 >> helper_tosingle diff for arg: 3ff0000000000000 f.l: 3f800000 ret: 1f800000 >> helper_tosingle diff for arg: 3ff0000000000000 f.l: 3f800000 ret: 1f800000 >> helper_tosingle diff for arg: 3ff0000000000000 f.l: 3f800000 ret: 1f800000 >> helper_tosingle diff for arg: 3ff0000000000000 f.l: 3f800000 ret: 1f800000 >> helper_tosingle diff for arg: 3ff0000000000000 f.l: 3f800000 ret: 1f800000 >> helper_tosingle diff for arg: 3ff0000000000000 f.l: 3f800000 ret: 1f800000 >> helper_tosingle diff for arg: 3ff0000000000000 f.l: 3f800000 ret: 1f800000 >> helper_tosingle diff for arg: 3ff0000000000000 f.l: 3f800000 ret: 1f800000 >> helper_tosingle diff for arg: 3ff0000000000000 f.l: 3f800000 ret: 1f800000 >> helper_tosingle diff for arg: 3ff0000000000000 f.l: 3f800000 ret: 1f800000 >> helper_tosingle diff for arg: 3ff0000000000000 f.l: 3f800000 ret: 1f800000 >> helper_tosingle diff for arg: 3ff0000000000000 f.l: 3f800000 ret: 1f800000 >> helper_tosingle diff for arg: 3ff0000000000000 f.l: 3f800000 ret: 1f800000 >> helper_tosingle diff for arg: 3ff0000000000000 f.l: 3f800000 ret: 1f800000 >> helper_tosingle diff for arg: 3ff0000000000000 f.l: 3f800000 ret: 1f800000 >> helper_todouble diff for arg: be61b08a d.ll: bfcc361140000000 ret: >> bbcc361140000000 >> helper_todouble diff for arg: 3fdf81a5 d.ll: 3ffbf034a0000000 ret: >> 3bfbf034a0000000 >> helper_todouble diff for arg: bf402647 d.ll: bfe804c8e0000000 ret: >> bbe804c8e0000000 >> helper_todouble diff for arg: 3e61b08a d.ll: 3fcc361140000000 ret: >> 3bcc361140000000 >> helper_tosingle diff for arg: bfcc361140000000 f.l: be61b08a ret: 9e61b08a >> helper_todouble diff for arg: 3f0ccccd d.ll: 3fe19999a0000000 ret: >> 3be19999a0000000 >> helper_tosingle diff for arg: 3ffbf034a0000000 f.l: 3fdf81a5 ret: 1fdf81a5 >> helper_tosingle diff for arg: bfe804c8e0000000 f.l: bf402647 ret: 9f402647 >> helper_tosingle diff for arg: 3fcc361140000000 f.l: 3e61b08a ret: 1e61b08a >> helper_tosingle diff for arg: 3fe19999a0000000 f.l: 3f0ccccd ret: 1f0ccccd >> helper_todouble diff for arg: 3b800000 d.ll: 3f70000000000000 ret: >> 3b70000000000000 >> helper_tosingle diff for arg: 3ff0000000000000 f.l: 3f800000 ret: 1f800000 >> helper_tosingle diff for arg: 3ff0000000000000 f.l: 3f800000 ret: 1f800000 >> helper_todouble diff for arg: 3b800000 d.ll: 3f70000000000000 ret: >> 3b70000000000000 >> helper_tosingle diff for arg: 3ff0000000000000 f.l: 3f800000 ret: 1f800000 >> helper_tosingle diff for arg: 3ff0000000000000 f.l: 3f800000 ret: 1f800000 >> >> >> It looks like the differences are related to a flag or flags in the MSB byte >> of ret. > > Hi Richard, > > Have you had a chance to look at this yet? I've been working on top of David's > ppc-for-3.1 branch over the weekend and ran into this again during my testing > :/
Thanks for the reminder and the test cases. I've posted a fix for this now. r~