]> gcc.gnu.org Git - gcc.git/commitdiff
optabs.h (enum optab_index): Add new OTI_log10 and OTI_log2.
authorUros Bizjak <uros@kss-loka.si>
Wed, 11 Feb 2004 23:39:41 +0000 (00:39 +0100)
committerRoger Sayle <sayle@gcc.gnu.org>
Wed, 11 Feb 2004 23:39:41 +0000 (23:39 +0000)
2004-02-11  Uros Bizjak  <uros@kss-loka.si>

* optabs.h (enum optab_index): Add new OTI_log10 and OTI_log2.
(log10_optab, log2_optab): Define corresponding macros.
* optabs.c (init_optabs): Initialize log10_optab and log2_optab.
* genopinit.c (optabs): Implement log10_optab and log2_optab
using log10?f2 and log2?f2 patterns.
* builtins.c (expand_builtin_mathfn): Handle BUILT_IN_LOG10{,F,L}
using log10_optab, and BUILT_IN_LOG2{,F,L} using log2_optab.
(expand_builtin): Expand BUILT_IN_LOG10{,F,L} and BUILT_IN_LOG2{,F,L}
using expand_builtin_mathfn if flag_unsafe_math_optimizations is set.

* config/i386/i386.md (log10sf2, log10df2, log10xf2, log2sf2,
log2df2, log2xf2): New patterns to implement log10, log10f, log10l,
log2, log2f and log2l built-ins as inline x87 intrinsics.

* gcc.dg/builtins-33.c: New test.

From-SVN: r77675

gcc/ChangeLog
gcc/builtins.c
gcc/config/i386/i386.md
gcc/genopinit.c
gcc/optabs.c
gcc/optabs.h
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/builtins-33.c [new file with mode: 0644]

index 9c734409a7265a1f717bafbeeae7eae05da3518e..22d06d6ee8a3cf8eb5e19851aa088ea490288c53 100644 (file)
@@ -1,3 +1,19 @@
+2004-02-11  Uros Bizjak  <uros@kss-loka.si>
+
+       * optabs.h (enum optab_index): Add new OTI_log10 and OTI_log2.
+       (log10_optab, log2_optab): Define corresponding macros.
+       * optabs.c (init_optabs): Initialize log10_optab and log2_optab.
+       * genopinit.c (optabs): Implement log10_optab and log2_optab
+       using log10?f2 and log2?f2 patterns.
+       * builtins.c (expand_builtin_mathfn): Handle BUILT_IN_LOG10{,F,L}
+       using log10_optab, and BUILT_IN_LOG2{,F,L} using log2_optab.
+       (expand_builtin): Expand BUILT_IN_LOG10{,F,L} and BUILT_IN_LOG2{,F,L}
+       using expand_builtin_mathfn if flag_unsafe_math_optimizations is set.
+
+       * config/i386/i386.md (log10sf2, log10df2, log10xf2, log2sf2,
+       log2df2, log2xf2): New patterns to implement log10, log10f, log10l,
+       log2, log2f and log2l built-ins as inline x87 intrinsics.
+
 2004-02-11  Richard Henderson  <rth@redhat.com>
 
        * flow.c (insn_dead_p): A clobber of a dead hard register is a
index 2fdc370fc0f5b984f277b3ffc1a8bbb216583974..a5520a3b97c4dd0a9062487fd4c22f5849d961be 100644 (file)
@@ -1662,6 +1662,14 @@ expand_builtin_mathfn (tree exp, rtx target, rtx subtarget)
     case BUILT_IN_LOGF:
     case BUILT_IN_LOGL:
       errno_set = true; builtin_optab = log_optab; break;
+    case BUILT_IN_LOG10:
+    case BUILT_IN_LOG10F:
+    case BUILT_IN_LOG10L:
+      errno_set = true; builtin_optab = log10_optab; break;
+    case BUILT_IN_LOG2:
+    case BUILT_IN_LOG2F:
+    case BUILT_IN_LOG2L:
+      errno_set = true; builtin_optab = log2_optab; break;
     case BUILT_IN_TAN:
     case BUILT_IN_TANF:
     case BUILT_IN_TANL:
@@ -5130,6 +5138,12 @@ expand_builtin (tree exp, rtx target, rtx subtarget, enum machine_mode mode,
     case BUILT_IN_LOG:
     case BUILT_IN_LOGF:
     case BUILT_IN_LOGL:
+    case BUILT_IN_LOG10:
+    case BUILT_IN_LOG10F:
+    case BUILT_IN_LOG10L:
+    case BUILT_IN_LOG2:
+    case BUILT_IN_LOG2F:
+    case BUILT_IN_LOG2L:
     case BUILT_IN_TAN:
     case BUILT_IN_TANF:
     case BUILT_IN_TANL:
index 2c7bbb4a1ffe79b7ec79accbb89087416e8c0218..70c21f8fb981a2a20a5f4820d12f49bde8ad4329 100644 (file)
   emit_move_insn (operands[2], temp);
 })
 
+(define_expand "log10sf2"
+  [(parallel [(set (match_operand:SF 0 "register_operand" "")
+                  (unspec:SF [(match_operand:SF 1 "register_operand" "")
+                              (match_dup 2)] UNSPEC_FYL2X))
+             (clobber (match_scratch:SF 3 ""))])]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+{
+  rtx temp;
+
+  operands[2] = gen_reg_rtx (XFmode);
+  temp = standard_80387_constant_rtx (3); /* fldlg2 */
+  emit_move_insn (operands[2], temp);
+})
+
+(define_expand "log10df2"
+  [(parallel [(set (match_operand:DF 0 "register_operand" "")
+                  (unspec:DF [(match_operand:DF 1 "register_operand" "")
+                              (match_dup 2)] UNSPEC_FYL2X))
+             (clobber (match_scratch:DF 3 ""))])]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+{
+  rtx temp;
+
+  operands[2] = gen_reg_rtx (XFmode);
+  temp = standard_80387_constant_rtx (3); /* fldlg2 */
+  emit_move_insn (operands[2], temp);
+})
+
+(define_expand "log10xf2"
+  [(parallel [(set (match_operand:XF 0 "register_operand" "")
+                  (unspec:XF [(match_operand:XF 1 "register_operand" "")
+                              (match_dup 2)] UNSPEC_FYL2X))
+             (clobber (match_scratch:XF 3 ""))])]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+{
+  rtx temp;
+
+  operands[2] = gen_reg_rtx (XFmode);
+  temp = standard_80387_constant_rtx (3); /* fldlg2 */
+  emit_move_insn (operands[2], temp);
+})
+
+(define_expand "log2sf2"
+  [(parallel [(set (match_operand:SF 0 "register_operand" "")
+                  (unspec:SF [(match_operand:SF 1 "register_operand" "")
+                              (match_dup 2)] UNSPEC_FYL2X))
+             (clobber (match_scratch:SF 3 ""))])]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+{
+  operands[2] = gen_reg_rtx (XFmode);
+  emit_move_insn (operands[2], CONST1_RTX (XFmode));  /* fld1 */
+
+})
+
+(define_expand "log2df2"
+  [(parallel [(set (match_operand:DF 0 "register_operand" "")
+                  (unspec:DF [(match_operand:DF 1 "register_operand" "")
+                              (match_dup 2)] UNSPEC_FYL2X))
+             (clobber (match_scratch:DF 3 ""))])]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+{
+  operands[2] = gen_reg_rtx (XFmode);
+  emit_move_insn (operands[2], CONST1_RTX (XFmode));  /* fld1 */
+})
+
+(define_expand "log2xf2"
+  [(parallel [(set (match_operand:XF 0 "register_operand" "")
+                  (unspec:XF [(match_operand:XF 1 "register_operand" "")
+                              (match_dup 2)] UNSPEC_FYL2X))
+             (clobber (match_scratch:XF 3 ""))])]
+  "! TARGET_NO_FANCY_MATH_387 && TARGET_80387
+   && flag_unsafe_math_optimizations"
+{
+  operands[2] = gen_reg_rtx (XFmode);
+  emit_move_insn (operands[2], CONST1_RTX (XFmode));  /* fld1 */
+})
+
 (define_insn "*fscale_sfxf3"
   [(set (match_operand:SF 0 "register_operand" "=f")
         (unspec:SF [(match_operand:XF 2 "register_operand" "0")
index 5e1599ad80f1ff24e6e66f3b9be882411e375cb4..cbdc3dd8d777a3206b1d3d99eb989a7de8f12a3a 100644 (file)
@@ -126,6 +126,8 @@ static const char * const optabs[] =
   "cos_optab->handlers[$A].insn_code = CODE_FOR_$(cos$a2$)",
   "exp_optab->handlers[$A].insn_code = CODE_FOR_$(exp$a2$)",
   "log_optab->handlers[$A].insn_code = CODE_FOR_$(log$a2$)",
+  "log10_optab->handlers[$A].insn_code = CODE_FOR_$(log10$a2$)",  
+  "log2_optab->handlers[$A].insn_code = CODE_FOR_$(log2$a2$)",  
   "tan_optab->handlers[$A].insn_code = CODE_FOR_$(tan$a2$)",
   "atan_optab->handlers[$A].insn_code = CODE_FOR_$(atan$a2$)",
   "strlen_optab->handlers[$A].insn_code = CODE_FOR_$(strlen$a$)",
index e748c15a18e1bc599d48205b7c3e86dd474fc65b..7a47a6fd61cf7577dc938e1ff118d8c95f270721 100644 (file)
@@ -5263,6 +5263,8 @@ init_optabs (void)
   cos_optab = init_optab (UNKNOWN);
   exp_optab = init_optab (UNKNOWN);
   log_optab = init_optab (UNKNOWN);
+  log10_optab = init_optab (UNKNOWN);
+  log2_optab = init_optab (UNKNOWN);
   tan_optab = init_optab (UNKNOWN);
   atan_optab = init_optab (UNKNOWN);
   strlen_optab = init_optab (UNKNOWN);
index 4f39e359b79a3870da1fb73cdec12680464d3a6c..496ba1a6fc8e21a41a2beb034a726df1b160941f 100644 (file)
@@ -156,6 +156,10 @@ enum optab_index
   OTI_exp,
   /* Natural Logarithm */
   OTI_log,
+  /* Base-10 Logarithm */
+  OTI_log10,
+  /* Base-2 Logarithm */
+  OTI_log2,
   /* Rounding functions */
   OTI_floor,
   OTI_ceil,
@@ -260,6 +264,8 @@ extern GTY(()) optab optab_table[OTI_MAX];
 #define cos_optab (optab_table[OTI_cos])
 #define exp_optab (optab_table[OTI_exp])
 #define log_optab (optab_table[OTI_log])
+#define log10_optab (optab_table[OTI_log10])
+#define log2_optab (optab_table[OTI_log2])
 #define floor_optab (optab_table[OTI_floor])
 #define ceil_optab (optab_table[OTI_ceil])
 #define btrunc_optab (optab_table[OTI_trunc])
index be07e1ff45b7919d24d249a304bdf743c3a47dcd..7c1aa663a8fc7642cf876650263b2735031f40df 100644 (file)
@@ -1,3 +1,7 @@
+2004-02-11  Uros Bizjak  <uros@kss-loka.si>
+
+       * gcc.dg/builtins-33.c: New test.
+
 2004-02-11  Paolo Bonzini  <bonzini@gnu.org>
 
        * gcc.dg/pr14092-1.c: Use intptr_t for the cast.
diff --git a/gcc/testsuite/gcc.dg/builtins-33.c b/gcc/testsuite/gcc.dg/builtins-33.c
new file mode 100644 (file)
index 0000000..758978f
--- /dev/null
@@ -0,0 +1,48 @@
+/* Copyright (C) 2004 Free Software Foundation.
+
+   Check that log10, log10f, log10l, log2, log2f and log2l
+   built-in functions compile.
+
+   Written by Uros Bizjak, 11th February 2004.  */
+
+/* { dg-do compile } */
+/* { dg-options "-O2 -ffast-math" } */
+
+extern double log10(double);
+extern double log2(double);
+extern float log10f(float);
+extern float log2f(float);
+extern long double log10l(long double);
+extern long double log2l(long double);
+
+
+double test1(double x)
+{
+  return log10(x);
+}
+
+double test2(double x)
+{
+  return log2(x);
+}
+
+float test1f(float x)
+{
+  return log10f(x);
+}
+
+float test2f(float x)
+{
+  return log2f(x);
+}
+
+long double test1l(long double x)
+{
+  return log10l(x);
+}
+
+long double test2l(long double x)
+{
+  return log2l(x);
+}
+
This page took 0.113103 seconds and 5 git commands to generate.