https://gcc.gnu.org/bugzilla/show_bug.cgi?id=70465
Uroš Bizjak <ubizjak at gmail dot com> changed: What |Removed |Added ---------------------------------------------------------------------------- Status|RESOLVED |REOPENED Resolution|FIXED |--- --- Comment #16 from Uroš Bizjak <ubizjak at gmail dot com> --- Looking at some other PR, I have noticed that following testcase: --cut here-- extern float global_data[1024]; static long double MIN (long double a, long double b) { return a < b ? a : b; } static long double MAX (long double a, long double b) { return a > b ? a : b; } float bar (void) { long double delta = (global_data[0]); return (MIN (MAX (delta, 0.0l), 1.0l)); } --cut here-- compiles with -Ofast -mfpmath=387 to: bar: flds global_data(%rip) fldz fxch %st(1) The above shows that we can also consider x87 constants and float-extend from memory when avoiding fxchs: __.297r.stack: (insn:TI 6 13 37 2 (set (reg:XF 8 st) (float_extend:XF (mem/c:SF (symbol_ref:DI ("global_data") [flags 0x40] <var_decl 0x2ac721f3ae10 global_data>) [1 global_data+0 S4 A32]))) "pr79593.c":12 153 {*extendsfxf2_i387} (nil)) (insn:TI 37 6 46 2 (set (reg:XF 8 st) (const_double:XF 0.0 [0x0.0p+0])) "pr79593.c":8 123 {*movxf_internal} (expr_list:REG_EQUAL (const_double:XF 0.0 [0x0.0p+0]) (nil))) (insn 46 37 11 2 (parallel [ (set (reg:XF 9 st(1)) (reg:XF 8 st)) (set (reg:XF 8 st) (reg:XF 9 st(1))) ]) "pr79593.c":8 -1 (nil))