i386.md (logsf2, [...]): New patterns to implement log, logf and logl built-ins as...
authorRoger Sayle <roger@eyesopen.com>
Mon, 12 May 2003 02:51:40 +0000 (02:51 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Mon, 12 May 2003 02:51:40 +0000 (02:51 +0000)
* config/i386/i386.md (logsf2, logdf2, logxf2, logdf2): New patterns
to implement log, logf and logl built-ins as inline x87 intrinsics.
(UNSPEC_FYL2X): New unspec to represent x87's "fyl2x" instruction.
(*fyl2x_sfxf3, *fyl2x_dfxf3, *fyl2x_xf3, *fyl2x_tfxf3): New insn
patterns for x87's "fyl2x" instruction, used by log?f2 patterns.

* reg-stack.c (subst_stack_regs_pat): Handle UNSPEC_FYL2X like
UNSPEC_FPATAN, i.e. replaces two stack operands with single result.

* gcc.dg/i386-387-1.c: Update to also test log.
* gcc.dg/i386-387-2.c: Likewise.

From-SVN: r66709

gcc/ChangeLog
gcc/config/i386/i386.md
gcc/reg-stack.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/i386-387-1.c
gcc/testsuite/gcc.dg/i386-387-2.c

index 0f63ac8b14506c229dbbf290a2b1f5ef9273b00f..cfdc86108448d47653a9fe6cbae5636e9632f90b 100644 (file)
@@ -1,3 +1,14 @@
+2003-05-11  Roger Sayle  <roger@eyesopen.com>
+
+       * config/i386/i386.md (logsf2, logdf2, logxf2, logdf2): New patterns
+       to implement log, logf and logl built-ins as inline x87 intrinsics.
+       (UNSPEC_FYL2X): New unspec to represent x87's "fyl2x" instruction.
+       (*fyl2x_sfxf3, *fyl2x_dfxf3, *fyl2x_xf3, *fyl2x_tfxf3): New insn
+       patterns for x87's "fyl2x" instruction, used by log?f2 patterns.
+
+       * reg-stack.c (subst_stack_regs_pat): Handle UNSPEC_FYL2X like
+       UNSPEC_FPATAN, i.e. replaces two stack operands with single result.
+
 2003-05-11  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
        * Makefile.in (out_object_file): Don't set -Wno-error for ${cpu}.o. 
index 64d37f608824051e5911cf54ec0a8e0c9589a199..ad8909f939baaae1ea9c8e1ae7e70956eb335688 100644 (file)
 
    ; x87 Floating point
    (UNSPEC_FPATAN              65)
+   (UNSPEC_FYL2X               66)
   ])
 
 (define_constants
   "fpatan"
   [(set_attr "type" "fpspc")
    (set_attr "mode" "XF")])
+
+(define_insn "*fyl2x_sfxf3"
+  [(set (match_operand:SF 0 "register_operand" "=f")
+       (unspec:SF [(match_operand:SF 2 "register_operand" "0")
+                   (match_operand:XF 1 "register_operand" "u")]
+        UNSPEC_FYL2X))]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+  "fyl2x"
+  [(set_attr "type" "fpspc")
+   (set_attr "mode" "SF")])
+
+(define_insn "*fyl2x_dfxf3"
+  [(set (match_operand:DF 0 "register_operand" "=f")
+       (unspec:DF [(match_operand:DF 2 "register_operand" "0")
+                   (match_operand:XF 1 "register_operand" "u")]
+        UNSPEC_FYL2X))]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+  "fyl2x"
+  [(set_attr "type" "fpspc")
+   (set_attr "mode" "DF")])
+
+(define_insn "*fyl2x_xf3"
+  [(set (match_operand:XF 0 "register_operand" "=f")
+       (unspec:XF [(match_operand:XF 2 "register_operand" "0")
+                   (match_operand:XF 1 "register_operand" "u")]
+        UNSPEC_FYL2X))]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+  "fyl2x"
+  [(set_attr "type" "fpspc")
+   (set_attr "mode" "XF")])
+
+(define_insn "*fyl2x_tfxf3"
+  [(set (match_operand:TF 0 "register_operand" "=f")
+       (unspec:TF [(match_operand:TF 2 "register_operand" "0")
+                   (match_operand:XF 1 "register_operand" "u")]
+        UNSPEC_FYL2X))]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+  "fyl2x"
+  [(set_attr "type" "fpspc")
+   (set_attr "mode" "XF")])
+
+(define_expand "logsf2"
+  [(set (match_operand:SF 0 "register_operand" "")
+       (unspec:SF [(match_operand:SF 1 "register_operand" "")
+                   (match_dup 2)] UNSPEC_FYL2X))]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+{
+  rtx temp;
+
+  operands[2] = gen_reg_rtx (XFmode);
+  temp = standard_80387_constant_rtx (4); /* fldln2 */
+  emit_move_insn (operands[2], temp);
+})
+
+(define_expand "logdf2"
+  [(set (match_operand:DF 0 "register_operand" "")
+       (unspec:DF [(match_operand:DF 1 "register_operand" "")
+                   (match_dup 2)] UNSPEC_FYL2X))]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+{
+  rtx temp;
+
+  operands[2] = gen_reg_rtx (XFmode);
+  temp = standard_80387_constant_rtx (4); /* fldln2 */
+  emit_move_insn (operands[2], temp);
+})
+
+(define_expand "logxf2"
+  [(set (match_operand:XF 0 "register_operand" "")
+       (unspec:XF [(match_operand:XF 1 "register_operand" "")
+                   (match_dup 2)] UNSPEC_FYL2X))]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+{
+  rtx temp;
+
+  operands[2] = gen_reg_rtx (XFmode);
+  temp = standard_80387_constant_rtx (4); /* fldln2 */
+  emit_move_insn (operands[2], temp);
+})
+
+(define_expand "logtf2"
+  [(set (match_operand:TF 0 "register_operand" "")
+       (unspec:TF [(match_operand:TF 1 "register_operand" "")
+                   (match_dup 2)] UNSPEC_FYL2X))]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+{
+  rtx temp;
+
+  operands[2] = gen_reg_rtx (XFmode);
+  temp = standard_80387_constant_rtx (4); /* fldln2 */
+  emit_move_insn (operands[2], temp);
+})
 \f
 ;; Block operation instructions
 
index 525d06694408b514c852c8e55c8827941977ff6b..75a59e687275ad3fb0414ba094ea1e7315965439 100644 (file)
@@ -1729,6 +1729,7 @@ subst_stack_regs_pat (insn, regstack, pat)
                break;
 
              case UNSPEC_FPATAN:
+             case UNSPEC_FYL2X:
                /* These insns operate on the top two stack slots.  */
 
                src1 = get_true_reg (&XVECEXP (pat_src, 0, 0));
index 926f01d2f0a69f27ee2b3f5e28a1d5d74cdbe2ca..e2a4a06b3ca75ea02b23061ad6418f78e50d219d 100644 (file)
@@ -1,3 +1,8 @@
+2003-05-11  Roger Sayle  <roger@eyesopen.com>
+
+       * gcc.dg/i386-387-1.c: Update to also test log.
+       * gcc.dg/i386-387-2.c: Likewise.
+
 2003-05-11  Toon Moene  <toon@moene.indiv.nluug.nl>
 
        * g77.f-torture/execute/int8421.f: New test.
index f28fd8bbdcf44d5ca5bf6f7cb8088dc357d28967..07389106f506034a7121132963033811e00019e4 100644 (file)
@@ -5,8 +5,10 @@
 /* { dg-final { scan-assembler "call\t_?cos" } } */
 /* { dg-final { scan-assembler "call\t_?sqrt" } } */
 /* { dg-final { scan-assembler "call\t_?atan2" } } */
+/* { dg-final { scan-assembler "call\t_?log" } } */
 
 double f1(double x) { return __builtin_sin(x); }
 double f2(double x) { return __builtin_cos(x); }
 double f3(double x) { return __builtin_sqrt(x); }
 double f4(double x, double y) { return __builtin_atan2(x,y); }
+double f5(double x) { return __builtin_log(x); }
index c73cb92c5f31d915e42862f7a2362155ac411f2f..3bebc758f2a30bbc05716c54aa4fed768e391e39 100644 (file)
@@ -5,8 +5,10 @@
 /* { dg-final { scan-assembler "fcos" } } */
 /* { dg-final { scan-assembler "fsqrt" } } */
 /* { dg-final { scan-assembler "fpatan" } } */
+/* { dg-final { scan-assembler "fyl2x" } } */
 
 double f1(double x) { return __builtin_sin(x); }
 double f2(double x) { return __builtin_cos(x); }
 double f3(double x) { return __builtin_sqrt(x); }
 double f4(double x, double y) { return __builtin_atan2(x,y); }
+double f5(double x) { return __builtin_log(x); }