diff options
author | Uros Bizjak <ubizjak@gmail.com> | 2006-11-04 23:12:16 +0000 |
---|---|---|
committer | Uros Bizjak <ubizjak@gmail.com> | 2006-11-04 23:12:16 +0000 |
commit | 0ba13e19cbcdf5471fb31405e3281fba1167657d (patch) | |
tree | 1f29387249718cd32722242f7c6193731a127f13 | |
parent | 9bee1ad1dfeaf393011dc537f47d89e468d3fcad (diff) |
PR target/26915
* config/i386/i386.c (standard_80387_constant_p): Treat -0.0 and -1.0
as a valid 80387 constant.
(standard_80387_constant_opcode): Return "#" for -0.0 and -1.0.
* config/i386/i386.md (unnamed splitter): Split the load of
constant -0.0 or -1.0 into the load of 0.0 or 1.0, followed
by negation.
testsuite/ChangeLog:
PR target/26915
* gcc.target/i386/387-12.c: New test.
~
git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@118484 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/config/i386/i386.c | 16 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 20 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/387-12.c | 17 |
5 files changed, 66 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d77ae3e67df..81ae94fc47c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2006-11-04 Uros Bizjak <ubizjak@gmail.com> + + PR target/26915 + * config/i386/i386.c (standard_80387_constant_p): Treat -0.0 and -1.0 + as a valid 80387 constant. + (standard_80387_constant_opcode): Return "#" for -0.0 and -1.0. + * config/i386/i386.md (unnamed splitter): Split the load of + constant -0.0 or -1.0 into the load of 0.0 or 1.0, followed + by negation. + 2006-11-04 Richard Earnshaw <rearnsha@arm.com> * arm.c (thumb_legitimate_addres_p): Allow any constant offset @@ -8,7 +18,6 @@ * config/i386/i386.md (*movxf_nointeger, *movxf_integer): Enable patterns for standard 80387 constants. - 2006-11-03 Paolo Bonzini <bonzini@gnu.org> Steven Bosscher <steven@gcc.gnu.org> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index d2e19a0c293..cd416286015 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -4575,6 +4575,8 @@ init_ext_80387_constants (void) int standard_80387_constant_p (rtx x) { + REAL_VALUE_TYPE r; + if (GET_CODE (x) != CONST_DOUBLE || !FLOAT_MODE_P (GET_MODE (x))) return -1; @@ -4583,23 +4585,30 @@ standard_80387_constant_p (rtx x) if (x == CONST1_RTX (GET_MODE (x))) return 2; + REAL_VALUE_FROM_CONST_DOUBLE (r, x); + /* For XFmode constants, try to find a special 80387 instruction when optimizing for size or on those CPUs that benefit from them. */ if (GET_MODE (x) == XFmode && (optimize_size || x86_ext_80387_constants & TUNEMASK)) { - REAL_VALUE_TYPE r; int i; if (! ext_80387_constants_init) init_ext_80387_constants (); - REAL_VALUE_FROM_CONST_DOUBLE (r, x); for (i = 0; i < 5; i++) if (real_identical (&r, &ext_80387_constants_table[i])) return i + 3; } + /* Load of the constant -0.0 or -1.0 will be split as + fldz;fchs or fld1;fchs sequence. */ + if (real_isnegzero (&r)) + return 8; + if (real_identical (&r, &dconstm1)) + return 9; + return 0; } @@ -4625,6 +4634,9 @@ standard_80387_constant_opcode (rtx x) return "fldl2t"; case 7: return "fldpi"; + case 8: + case 9: + return "#"; default: gcc_unreachable (); } diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 94f9f57ca7a..28de0a4b7d7 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -2914,6 +2914,26 @@ [(set_attr "type" "fxch") (set_attr "mode" "XF")]) +;; Split the load of -0.0 or -1.0 into fldz;fchs or fld1;fchs sequence +(define_split + [(set (match_operand:X87MODEF 0 "register_operand" "") + (match_operand:X87MODEF 1 "immediate_operand" ""))] + "reload_completed && FP_REGNO_P (REGNO (operands[0])) + && (standard_80387_constant_p (operands[1]) == 8 + || standard_80387_constant_p (operands[1]) == 9)" + [(set (match_dup 0)(match_dup 1)) + (set (match_dup 0) + (neg:X87MODEF (match_dup 0)))] +{ + REAL_VALUE_TYPE r; + + REAL_VALUE_FROM_CONST_DOUBLE (r, operands[1]); + if (real_isnegzero (&r)) + operands[1] = CONST0_RTX (<MODE>mode); + else + operands[1] = CONST1_RTX (<MODE>mode); +}) + (define_expand "movtf" [(set (match_operand:TF 0 "nonimmediate_operand" "") (match_operand:TF 1 "nonimmediate_operand" ""))] diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6ca95da9743..925f5b3d38e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2006-11-04 Uros Bizjak <ubizjak@gmail.com> + + PR target/26915 + * gcc.target/i386/387-12.c: New test. + 2006-11-04 Francois-Xavier Coudert <coudert@clipper.ens.fr> PR libfortran/29713 diff --git a/gcc/testsuite/gcc.target/i386/387-12.c b/gcc/testsuite/gcc.target/i386/387-12.c new file mode 100644 index 00000000000..c653974a2d3 --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/387-12.c @@ -0,0 +1,17 @@ +/* PR target/26915 */ +/* { dg-do compile { target i?86-*-* x86_64-*-* } } */ +/* { dg-require-effective-target ilp32 } */ +/* { dg-options "-O" } */ + +double testm0(void) +{ + return -0.0; +} + +double testm1(void) +{ + return -1.0; +} + +/* { dg-final { scan-assembler "fldz" } } */ +/* { dg-final { scan-assembler "fld1" } } */ |