pack test failures with long doubles on x86/gcc
authorDavid Mitchell <davem@iabyn.com>
Mon, 21 Mar 2011 14:14:52 +0000 (14:14 +0000)
committerDavid Mitchell <davem@iabyn.com>
Mon, 21 Mar 2011 14:30:20 +0000 (14:30 +0000)
commitcd07c537987a76c934f141ca5bc0309e5a6b2609
treee874b1968d5f287ff655a6517abeabff306926ab
parentc34fab5fe3b5d2b8932d2f199a30b80c85950b75
pack test failures with long doubles on x86/gcc

[perl #86534]

When using 80-bit extended precision floats, gcc-generated code
can sometimes copy 10 bytes and sometimes 12. This can lead to 2 random
bytes something appearing in the output of pack('F') and pack('D').

Work around this by using sv_2nv() rather than SvNV()
(which expands to (SvNOK(sv) ? SvNVX(sv) : sv_2nv(sv) )

The basic issue is that the NV return value of a function is returned
in a floating point register, which is then written to memory as 10 bytes,
whereas a direct assignment, e.g. NV nv1 = nv2, is done by a 12-byte
memory copy.

However, when the sv_2nv() function is called as part of the ?:
expression, its returned value is written as *10* bytes to a temp location
on the stack, which is then copied as a *12* byte value to its final
destination, picking up 2 bytes of random data from the stack, which then
appears in the output of pack(), and ultimately leads to a test failure.
pp_pack.c