extern void abort (void); long double __attribute__ ((noinline)) foo (long double x) { return __builtin_signbit (x) ? 3.1415926535897932384626433832795029L : 0.0; }
int main (void) { if (foo (-1.0L) != 3.1415926535897932384626433832795029L) abort (); return 0; } is miscompiled with -O2 -m64 -mlong-double-128. Both doubles of the long double return value from foo as the high double of PI. The assembly loads this long double value into 0/11 register pair using: ld 11,[EMAIL PROTECTED](2) ld 0,[EMAIL PROTECTED](2) In RTL there is actually the +8 for the first insn present, but with double negation: (insn:TI 40 20 39 t.c:5 (set (reg:DI 11 11 [orig:132 D.1237+8 ] [132]) (mem/u/c/i:DI (plus:DI (reg:DI 2 2) (const:DI (minus:DI (symbol_ref/u:DI ("*.LC1") [flags 0x2]) (const:DI (plus:DI (symbol_ref:DI ("*.LCTOC1")) (const_int -8 [0xfffffffffffffff8])))))) [2 S8 A64])) 334 {*movdi_internal64} (nil)) (insn 39 40 23 t.c:5 (set (reg:DI 0 0 [orig:131 D.1237 ] [131]) (mem/u/c/i:DI (plus:DI (reg:DI 2 2) (const:DI (minus:DI (symbol_ref/u:DI ("*.LC1") [flags 0x2]) (symbol_ref:DI ("*.LCTOC1"))))) [2 S8 A128])) 334 {*movdi_internal64} (expr_list:REG_DEAD (reg:DI 2 2) (nil))) So, either the output routines need to be fixed to handle even this weirdo addressing correctly and output [EMAIL PROTECTED](2), or the pass that generate this needs to be changed to generate something better. -- Summary: [4.3/4.4 Regression] ppc64 cacoshl miscompilation Product: gcc Version: 4.3.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: target AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: jakub at gcc dot gnu dot org GCC target triplet: powerpc64-linux http://gcc.gnu.org/bugzilla/show_bug.cgi?id=36090