Commit 6b67572e by Uros Bizjak

re PR target/39228 (387 optimised __builtin_isinf() gives incorrect result)

	PR target/39228
	* config/i386/i386.md (isinfxf2): Split from isinf<mode>2.
	(UNSPEC_FXAM_MEM): New unspec.
	(fxam<mode>2_i387_with_temp): New insn and split pattern.
	(isinf<mode>2): Use MODEF mode iterator.  Force operand[1] through
	memory using fxam<mode>2_i387_with_temp to remove excess precision.

testsuite/ChangeLog:

	PR target/39228
	* gcc.c-torture/execute/pr39228.c: New test.

From-SVN: r144293
parent 9e39dba6
2009-02-19 Uros Bizjak <ubizjak@gmail.com>
PR target/39228
* config/i386/i386.md (isinfxf2): Split from isinf<mode>2.
(UNSPEC_FXAM_MEM): New unspec.
(fxam<mode>2_i387_with_temp): New insn and split pattern.
(isinf<mode>2): Use MODEF mode iterator. Force operand[1] through
memory using fxam<mode>2_i387_with_temp to remove excess precision.
2009-02-19 Richard Guenther <rguenther@suse.de> 2009-02-19 Richard Guenther <rguenther@suse.de>
PR tree-optimization/39207 PR tree-optimization/39207
...@@ -5,8 +14,7 @@ ...@@ -5,8 +14,7 @@
* tree-ssa-structalias.c (storedanything_id, var_storedanything, * tree-ssa-structalias.c (storedanything_id, var_storedanything,
storedanything_tree): New. storedanything_tree): New.
(do_ds_constraint): Simplify ANYTHING shortcutting. Update (do_ds_constraint): Simplify ANYTHING shortcutting. Update
the STOREDANYTHING solution if the lhs solution contains the STOREDANYTHING solution if the lhs solution contains ANYTHING.
ANYTHING.
(build_succ_graph): Add edges from STOREDANYTHING to all (build_succ_graph): Add edges from STOREDANYTHING to all
non-direct nodes. non-direct nodes.
(init_base_vars): Initialize STOREDANYTHING. (init_base_vars): Initialize STOREDANYTHING.
...@@ -29,8 +37,7 @@ ...@@ -29,8 +37,7 @@
2009-02-18 H.J. Lu <hongjiu.lu@intel.com> 2009-02-18 H.J. Lu <hongjiu.lu@intel.com>
PR target/39224 PR target/39224
* config/i386/i386.c (ix86_return_in_memory): Properly check * config/i386/i386.c (ix86_return_in_memory): Properly check ABI.
ABI.
2009-02-18 Jason Merrill <jason@redhat.com> 2009-02-18 Jason Merrill <jason@redhat.com>
...@@ -197,8 +204,7 @@ ...@@ -197,8 +204,7 @@
PR target/39149 PR target/39149
* config/i386/i386.c (override_options): Correct warning * config/i386/i386.c (override_options): Correct warning
messages for -malign-loops, -malign-jumps and messages for -malign-loops, -malign-jumps and -malign-functions.
-malign-functions.
2009-02-13 H.J. Lu <hongjiu.lu@intel.com> 2009-02-13 H.J. Lu <hongjiu.lu@intel.com>
...@@ -210,8 +216,7 @@ ...@@ -210,8 +216,7 @@
PR target/39162 PR target/39162
* config/i386/i386.c (type_natural_mode): Add a new argument. * config/i386/i386.c (type_natural_mode): Add a new argument.
Return the original mode and warn ABI change if vector size Return the original mode and warn ABI change if vector size is 32byte.
is 32byte.
(function_arg_advance): Updated. (function_arg_advance): Updated.
(function_arg): Likewise. (function_arg): Likewise.
(ix86_function_value): Likewise. (ix86_function_value): Likewise.
...@@ -290,7 +295,7 @@ ...@@ -290,7 +295,7 @@
(TARGET_INIT_LIBFUNCS): Likewise. (TARGET_INIT_LIBFUNCS): Likewise.
* config/ia64/t-glibc (SHLINB_MAPFILES): * config/ia64/t-glibc (SHLINB_MAPFILES):
Add $(srcdir)/config/ia64/libgcc-glibc.ver, Add $(srcdir)/config/ia64/libgcc-glibc.ver.
2009-02-12 H.J. Lu <hongjiu.lu@intel.com> 2009-02-12 H.J. Lu <hongjiu.lu@intel.com>
...@@ -736,7 +741,7 @@ ...@@ -736,7 +741,7 @@
* c-decl.c (pop_scope): Set DECL_EXTERNAL for functions declared * c-decl.c (pop_scope): Set DECL_EXTERNAL for functions declared
inline but never defined. inline but never defined.
2009-01-30 Wolfgang Gellerich <gellerich@de,ibm.com> 2009-01-30 Wolfgang Gellerich <gellerich@de.ibm.com>
* config/s390/s390.md (*insv<mode>_reg_extimm): Removed. * config/s390/s390.md (*insv<mode>_reg_extimm): Removed.
(*insv_h_di_reg_extimm): New insn. (*insv_h_di_reg_extimm): New insn.
...@@ -875,7 +880,7 @@ ...@@ -875,7 +880,7 @@
* reload1.c (compute_use_by_pseudos, reload, count_pseudo, * reload1.c (compute_use_by_pseudos, reload, count_pseudo,
count_spilled_pseudo, find_reg, alter_reg, delete_output_reload): count_spilled_pseudo, find_reg, alter_reg, delete_output_reload):
Remove flag_ira. Remove flag_ira.
(finish_spills): Ditto. Remove code for !flga_ira. (finish_spills): Ditto. Remove code for !flag_ira.
2009-01-29 Kenneth Zadeck <zadeck@naturalbridge.com> 2009-01-29 Kenneth Zadeck <zadeck@naturalbridge.com>
...@@ -978,7 +983,8 @@ ...@@ -978,7 +983,8 @@
2009-01-28 Jakub Jelinek <jakub@redhat.com> 2009-01-28 Jakub Jelinek <jakub@redhat.com>
PR rtl-optimization/38740 PR rtl-optimization/38740
* reorg.c (gate_handle_delay_slots): Avoid dbr scheduling if !optimize. * reorg.c (gate_handle_delay_slots): Avoid dbr scheduling
if !optimize.
* config/mips/mips.c (mips_reorg): Likewise. * config/mips/mips.c (mips_reorg): Likewise.
2009-01-28 Richard Guenther <rguenther@suse.de> 2009-01-28 Richard Guenther <rguenther@suse.de>
...@@ -1242,8 +1248,8 @@ ...@@ -1242,8 +1248,8 @@
2009-01-20 Joseph Myers <joseph@codesourcery.com> 2009-01-20 Joseph Myers <joseph@codesourcery.com>
PR other/38758 PR other/38758
* longlong.h: Update copyright years. Use soft-fp license * longlong.h: Update copyright years. Use soft-fp license notice.
notice. Sync __clz_tab declaration with glibc. Sync __clz_tab declaration with glibc.
2009-01-20 Steve Ellcey <sje@cup.hp.com> 2009-01-20 Steve Ellcey <sje@cup.hp.com>
......
...@@ -146,6 +146,7 @@ ...@@ -146,6 +146,7 @@
(UNSPEC_FPREM1_U 91) (UNSPEC_FPREM1_U 91)
(UNSPEC_C2_FLAG 95) (UNSPEC_C2_FLAG 95)
(UNSPEC_FXAM_MEM 96)
; SSP patterns ; SSP patterns
(UNSPEC_SP_SET 100) (UNSPEC_SP_SET 100)
...@@ -18811,9 +18812,56 @@ ...@@ -18811,9 +18812,56 @@
(set_attr "unit" "i387") (set_attr "unit" "i387")
(set_attr "mode" "<MODE>")]) (set_attr "mode" "<MODE>")])
(define_insn_and_split "fxam<mode>2_i387_with_temp"
[(set (match_operand:HI 0 "register_operand" "")
(unspec:HI
[(match_operand:MODEF 1 "memory_operand" "")]
UNSPEC_FXAM_MEM))]
"TARGET_USE_FANCY_MATH_387
&& !(reload_completed || reload_in_progress)"
"#"
"&& 1"
[(set (match_dup 2)(match_dup 1))
(set (match_dup 0)
(unspec:HI [(match_dup 2)] UNSPEC_FXAM))]
{
operands[2] = gen_reg_rtx (<MODE>mode);
MEM_VOLATILE_P (operands[1]) = 1;
}
[(set_attr "type" "multi")
(set_attr "unit" "i387")
(set_attr "mode" "<MODE>")])
(define_expand "isinfxf2"
[(use (match_operand:SI 0 "register_operand" ""))
(use (match_operand:XF 1 "register_operand" ""))]
"TARGET_USE_FANCY_MATH_387
&& TARGET_C99_FUNCTIONS"
{
rtx mask = GEN_INT (0x45);
rtx val = GEN_INT (0x05);
rtx cond;
rtx scratch = gen_reg_rtx (HImode);
rtx res = gen_reg_rtx (QImode);
emit_insn (gen_fxamxf2_i387 (scratch, operands[1]));
emit_insn (gen_andqi_ext_0 (scratch, scratch, mask));
emit_insn (gen_cmpqi_ext_3 (scratch, val));
cond = gen_rtx_fmt_ee (EQ, QImode,
gen_rtx_REG (CCmode, FLAGS_REG),
const0_rtx);
emit_insn (gen_rtx_SET (VOIDmode, res, cond));
emit_insn (gen_zero_extendqisi2 (operands[0], res));
DONE;
})
(define_expand "isinf<mode>2" (define_expand "isinf<mode>2"
[(use (match_operand:SI 0 "register_operand" "")) [(use (match_operand:SI 0 "register_operand" ""))
(use (match_operand:X87MODEF 1 "register_operand" ""))] (use (match_operand:MODEF 1 "nonimmediate_operand" ""))]
"TARGET_USE_FANCY_MATH_387 "TARGET_USE_FANCY_MATH_387
&& TARGET_C99_FUNCTIONS && TARGET_C99_FUNCTIONS
&& !(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)" && !(SSE_FLOAT_MODE_P (<MODE>mode) && TARGET_SSE_MATH)"
...@@ -18826,7 +18874,18 @@ ...@@ -18826,7 +18874,18 @@
rtx scratch = gen_reg_rtx (HImode); rtx scratch = gen_reg_rtx (HImode);
rtx res = gen_reg_rtx (QImode); rtx res = gen_reg_rtx (QImode);
emit_insn (gen_fxam<mode>2_i387 (scratch, operands[1])); /* Remove excess precision by forcing value through memory. */
if (memory_operand (operands[1], VOIDmode))
emit_insn (gen_fxam<mode>2_i387_with_temp (scratch, operands[1]));
else
{
int slot = virtuals_instantiated ? SLOT_TEMP : SLOT_VIRTUAL;
rtx temp = assign_386_stack_local (<MODE>mode, slot);
emit_move_insn (temp, operands[1]);
emit_insn (gen_fxam<mode>2_i387_with_temp (scratch, temp));
}
emit_insn (gen_andqi_ext_0 (scratch, scratch, mask)); emit_insn (gen_andqi_ext_0 (scratch, scratch, mask));
emit_insn (gen_cmpqi_ext_3 (scratch, val)); emit_insn (gen_cmpqi_ext_3 (scratch, val));
cond = gen_rtx_fmt_ee (EQ, QImode, cond = gen_rtx_fmt_ee (EQ, QImode,
......
2009-02-19 Uros Bizjak <ubizjak@gmail.com>
PR target/39228
* gcc.c-torture/execute/pr39228.c: New test.
2009-02-19 Richard Guenther <rguenther@suse.de> 2009-02-19 Richard Guenther <rguenther@suse.de>
PR tree-optimization/39074 PR tree-optimization/39074
......
extern void abort (void);
static int __attribute__((always_inline)) testf (float b)
{
float c = 1.01f * b;
return __builtin_isinff (c);
}
static int __attribute__((always_inline)) test (double b)
{
double c = 1.01 * b;
return __builtin_isinf (c);
}
static int __attribute__((always_inline)) testl (long double b)
{
long double c = 1.01L * b;
return __builtin_isinfl (c);
}
int main()
{
if (testf (__FLT_MAX__) < 1)
abort ();
if (test (__DBL_MAX__) < 1)
abort ();
if (testl (__LDBL_MAX__) < 1)
abort ();
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment