diff options
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/spu/spu.md | 52 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/fastmath-2.c | 18 |
4 files changed, 27 insertions, 52 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f873898..039edb6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2008-09-02 Victor Kaplansky <victork@il.ibm.com> + + * gcc/config/spu/spu.md (divdf3): Removed. + + 2008-09-02 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/37095 diff --git a/gcc/config/spu/spu.md b/gcc/config/spu/spu.md index 89f2109..7b4b743 100644 --- a/gcc/config/spu/spu.md +++ b/gcc/config/spu/spu.md @@ -1864,58 +1864,6 @@ DONE; }) -;; Taken from STI's gcc -;; Does not correctly handle INF or NAN. -(define_expand "divdf3" - [(set (match_operand:DF 0 "register_operand" "=r") - (div:DF (match_operand:DF 1 "register_operand" "r") - (match_operand:DF 2 "register_operand" "r")))] - "flag_finite_math_only" - "{ - /* - double - divdf3 (double x, double y) - { - float x0; - float y_f = (float) y; - double x1, x2; - - x0 = spu_extract(spu_re(spu_promote(y_f, 0)), 0); - x1 = (double)(x0 * (2.0f - y_f * x0)); - x2 = x1 * (2.0 - y * x1); - return (x * x2 * (2.0 - y * x2)); - } - */ - - rtx dst = operands[0]; - rtx x = operands[1]; - rtx y = operands[2]; - rtx y_f = gen_reg_rtx(SFmode); - rtx x0_f = gen_reg_rtx(SFmode); - rtx x1_f = gen_reg_rtx(SFmode); - rtx x1 = gen_reg_rtx(DFmode); - rtx x2 = gen_reg_rtx(DFmode); - rtx t1_f = gen_reg_rtx(SFmode); - rtx t1 = gen_reg_rtx(DFmode); - rtx two = gen_reg_rtx(DFmode); - rtx two_f = gen_reg_rtx(SFmode); - - emit_insn (gen_truncdfsf2 (y_f, y)); - emit_insn (gen_frest_sf (x0_f, y_f)); - emit_insn (gen_fi_sf (x0_f, y_f, x0_f)); - emit_insn (gen_movsf (two_f, spu_float_const(\"2.0\",SFmode))); - emit_insn (gen_fnms_sf (t1_f, y_f, x0_f, two_f)); - emit_insn (gen_mulsf3 (x1_f, t1_f, x0_f)); - emit_insn (gen_extendsfdf2 (x1, x1_f)); - emit_insn (gen_extendsfdf2 (two, two_f)); - emit_insn (gen_movdf (t1, two)); - emit_insn (gen_fnms_df (t1, y, x1, t1)); - emit_insn (gen_muldf3 (x2, x1, t1)); - emit_insn (gen_fnms_df (two, y, x2, two)); - emit_insn (gen_muldf3 (dst, x2, two)); - emit_insn (gen_muldf3 (dst, dst, x)); - DONE; -}") ;; sqrt diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2b4495c..304e76c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2008-09-02 Victor Kaplansky <victork@il.ibm.com> + + * gcc.dg/fastmath-2.c: New. + 2008-09-02 Jakub Jelinek <jakub@redhat.com> PR tree-optimization/37095 diff --git a/gcc/testsuite/gcc.dg/fastmath-2.c b/gcc/testsuite/gcc.dg/fastmath-2.c new file mode 100644 index 0000000..2003cf9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/fastmath-2.c @@ -0,0 +1,18 @@ +/* { dg-do run } */ +/* { dg-options "-O2 -ffast-math" } */ + +extern void abort (void); + +volatile double a = 2.002083e-146; +double b; + +int +main() +{ + b = 1. / a; + + if (b != (1. / 2.002083e-146)) + abort (); + return 0; +} + |