Revision 146874:
http://gcc.gnu.org/ml/gcc-cvs/2009-04/msg01518.html
breaks %z on x87 insns:
[...@gnu-16 float-1]$ cat foo.c
#define fp_to_int(func,ftype,itype) \
itype \
__attribute__((noinline)) \
func (ftype value) \
{ \
itype res; \
__asm__ __volatile__ ("fistp%z0 %0" : "=m" (res) : "t" (value) : "st"); \
return res; \
}
#define int_to_fp(func,itype,ftype) \
ftype \
__attribute__((noinline)) \
func (itype value) \
{ \
ftype res; \
__asm__ __volatile__ ("fild%z1 %1" : "=t" (res) : "m" (value)); \
return res; \
}
fp_to_int (float_to_short, float, short);
fp_to_int (float_to_int, float, int);
fp_to_int (float_to_long_long, float, long long);
int_to_fp (short_to_float, short, float);
int_to_fp (int_to_float, int, float);
int_to_fp (long_long_to_float, long long, float);
extern void abort (void);
int
main ()
{
float f = -2.0;
short s = float_to_short (f);
int i = float_to_int (f);
long long l = float_to_long_long (f);
if (f != short_to_float (s)
|| f != int_to_float (i)
|| f != long_long_to_float (i))
abort ();
return 0;
}
[...@gnu-16 float-1]$ make
/export/build/gnu/gcc/build-x86_64-linux/gcc/xgcc
-B/export/build/gnu/gcc/build-x86_64-linux/gcc/ -o foo -O2 -m32 foo.c
foo.c: Assembler messages:
foo.c:21: Error: suffix or operands invalid for `fistp'
foo.c:25: Error: suffix or operands invalid for `fild'
make: *** [foo] Error 1
[...@gnu-16 float-1]$
--
Summary: [4.5 regression] Revision 146874 breaks %z on x87 insns
Product: gcc
Version: 4.5.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: target
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: hjl dot tools at gmail dot com
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=39949