optabs.c (prepare_float_lib_cmp): Use libgcc_cmp_return_mode instead of word_mode.
authorAndrew Pinski <pinskia@gcc.gnu.org>
Fri, 31 Aug 2007 22:45:43 +0000 (15:45 -0700)
committerAndrew Pinski <pinskia@gcc.gnu.org>
Fri, 31 Aug 2007 22:45:43 +0000 (15:45 -0700)
2007-08-31  Andrew Pinski  <andrew_pinski@playstation.sony.com>

        * optabs.c (prepare_float_lib_cmp): Use
        libgcc_cmp_return_mode instead of word_mode.
        * config/dfp-bit.h: Likewise.
        * config/fp-bit.h: Likewise.
        * config/spu/spu.c (spu_libgcc_cmp_return_mode):
        New function.
        (spu_libgcc_shift_count_mode): New function.
        (TARGET_LIBGCC_CMP_RETURN_MODE): Define.
        (TARGET_LIBGCC_SHIFT_COUNT_MODE): Define.

From-SVN: r128005

gcc/ChangeLog
gcc/config/dfp-bit.h
gcc/config/fp-bit.h
gcc/config/spu/spu.c
gcc/optabs.c

index bed7f667d027a94d4f42d0249c1372678521fe20..8edd7f4d5e9c089102c60b4988412c0558373faf 100644 (file)
@@ -1,3 +1,15 @@
+2007-08-31  Andrew Pinski  <andrew_pinski@playstation.sony.com>
+
+       * optabs.c (prepare_float_lib_cmp): Use
+       libgcc_cmp_return_mode instead of word_mode.
+       * config/dfp-bit.h: Likewise.
+       * config/fp-bit.h: Likewise.
+       * config/spu/spu.c (spu_libgcc_cmp_return_mode):
+       New function.
+       (spu_libgcc_shift_count_mode): New function.
+       (TARGET_LIBGCC_CMP_RETURN_MODE): Define.
+       (TARGET_LIBGCC_SHIFT_COUNT_MODE): Define.
+
 2007-08-31  Joseph Myers  <joseph@codesourcery.com>
 
        * tree-pretty-print.c: Include output.h.
@@ -39,6 +51,7 @@
        split out from expand_binop.
        (avoid_expensive_constant): New function.
        (expand_binop_directly): Remove commutative_op argument and
+       (expand_binop_directly): Remove commutative_op argument and
        call cummutative_optab_p instead.  Do not change op0 or op1
        when swapping xop0 and xop1.  Apply avoid_expensive_constant
        to each argument after potential swapping.  Enforce the
index 5238a2b3765a25b542f3fb92adac2551c82cdbe7..dfbf4f4833804c2be2597b257ac3a243a48e119a 100644 (file)
@@ -454,9 +454,9 @@ typedef unsigned int USItype __attribute__ ((mode (SI)));
 typedef unsigned int UDItype __attribute__ ((mode (DI)));
 
 /* The type of the result of a decimal float comparison.  This must
-   match `word_mode' in GCC for the target.  */
+   match `__libgcc_cmp_return__' in GCC for the target.  */
 
-typedef int CMPtype __attribute__ ((mode (word)));
+typedef int CMPtype __attribute__ ((mode (__libgcc_cmp_return__)));
 
 /* Prototypes.  */
 
index 0f03f87ee1a769d85d9425d5f22ae6679dd72f7a..5f9082cd301c458de2d0f23b510b5511d7aabc91 100644 (file)
@@ -108,9 +108,9 @@ typedef int TItype __attribute__ ((mode (TI)));
 #endif
 
 /* The type of the result of a floating point comparison.  This must
-   match `word_mode' in GCC for the target.  */
+   match `__libgcc_cmp_return__' in GCC for the target.  */
 #ifndef CMPtype
-typedef int CMPtype __attribute__ ((mode (word)));
+typedef int CMPtype __attribute__ ((mode (__libgcc_cmp_return__)));
 #endif
 
 typedef unsigned int UHItype __attribute__ ((mode (HI)));
index eda0de03813e38f0c46bf5fed04a4c2c26f405cc..7fcc942931027ee4704162d6580804b95fbafa9d 100644 (file)
@@ -174,6 +174,12 @@ static int cpat_info(unsigned char *arr, int size, int *prun, int *pstart);
 static enum immediate_class classify_immediate (rtx op,
                                                enum machine_mode mode);
 
+static enum machine_mode
+spu_libgcc_cmp_return_mode (void);
+
+static enum machine_mode
+spu_libgcc_shift_count_mode (void);
+
 /* Built in types.  */
 tree spu_builtin_types[SPU_BTI_MAX];
 \f
@@ -275,6 +281,12 @@ const struct attribute_spec spu_attribute_table[];
 #undef TARGET_VECTOR_ALIGNMENT_REACHABLE
 #define TARGET_VECTOR_ALIGNMENT_REACHABLE spu_vector_alignment_reachable
 
+#undef TARGET_LIBGCC_CMP_RETURN_MODE
+#define TARGET_LIBGCC_CMP_RETURN_MODE spu_libgcc_cmp_return_mode
+
+#undef TARGET_LIBGCC_SHIFT_COUNT_MODE
+#define TARGET_LIBGCC_SHIFT_COUNT_MODE spu_libgcc_shift_count_mode
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 void
@@ -5502,4 +5514,21 @@ spu_init_expanders (void)
    * expanding the prologue. */
   if (cfun)
     REGNO_POINTER_ALIGN (HARD_FRAME_POINTER_REGNUM) = 8;
-}       
+}
+
+static enum machine_mode
+spu_libgcc_cmp_return_mode (void)
+{
+
+/* For SPU word mode is TI mode so it is better to use SImode
+   for compare returns.  */
+  return SImode;
+}
+
+static enum machine_mode
+spu_libgcc_shift_count_mode (void)
+{
+/* For SPU word mode is TI mode so it is better to use SImode
+   for shift counts.  */
+  return SImode;
+}
index 6b292638c8967ad56e68fb12d743566e29489bfd..97319714fa5c8d57daedd1f835e83f0969b39648 100644 (file)
@@ -4232,10 +4232,11 @@ prepare_float_lib_cmp (rtx *px, rtx *py, enum rtx_code *pcomparison,
   rtx x = *px;
   rtx y = *py;
   enum machine_mode orig_mode = GET_MODE (x);
-  enum machine_mode mode;
+  enum machine_mode mode, cmp_mode;
   rtx value, target, insns, equiv;
   rtx libfunc = 0;
   bool reversed_p = false;
+  cmp_mode = targetm.libgcc_cmp_return_mode ();
 
   for (mode = orig_mode;
        mode != VOIDmode;
@@ -4274,14 +4275,14 @@ prepare_float_lib_cmp (rtx *px, rtx *py, enum rtx_code *pcomparison,
      condition can be determined at compile-time.  */
   if (comparison == UNORDERED)
     {
-      rtx temp = simplify_gen_relational (NE, word_mode, mode, x, x);
-      equiv = simplify_gen_relational (NE, word_mode, mode, y, y);
-      equiv = simplify_gen_ternary (IF_THEN_ELSE, word_mode, word_mode,
+      rtx temp = simplify_gen_relational (NE, cmp_mode, mode, x, x);
+      equiv = simplify_gen_relational (NE, cmp_mode, mode, y, y);
+      equiv = simplify_gen_ternary (IF_THEN_ELSE, cmp_mode, cmp_mode,
                                    temp, const_true_rtx, equiv);
     }
   else
     {
-      equiv = simplify_gen_relational (comparison, word_mode, mode, x, y);
+      equiv = simplify_gen_relational (comparison, cmp_mode, mode, x, y);
       if (! FLOAT_LIB_COMPARE_RETURNS_BOOL (mode, comparison))
        {
          rtx true_rtx, false_rtx;
@@ -4321,18 +4322,18 @@ prepare_float_lib_cmp (rtx *px, rtx *py, enum rtx_code *pcomparison,
            default:
              gcc_unreachable ();
            }
-         equiv = simplify_gen_ternary (IF_THEN_ELSE, word_mode, word_mode,
+         equiv = simplify_gen_ternary (IF_THEN_ELSE, cmp_mode, cmp_mode,
                                        equiv, true_rtx, false_rtx);
        }
     }
 
   start_sequence ();
   value = emit_library_call_value (libfunc, NULL_RTX, LCT_CONST,
-                                  word_mode, 2, x, mode, y, mode);
+                                  cmp_mode, 2, x, mode, y, mode);
   insns = get_insns ();
   end_sequence ();
 
-  target = gen_reg_rtx (word_mode);
+  target = gen_reg_rtx (cmp_mode);
   emit_libcall_block (insns, target, value, equiv);
 
   if (comparison == UNORDERED
@@ -4341,7 +4342,7 @@ prepare_float_lib_cmp (rtx *px, rtx *py, enum rtx_code *pcomparison,
 
   *px = target;
   *py = const0_rtx;
-  *pmode = word_mode;
+  *pmode = cmp_mode;
   *pcomparison = comparison;
   *punsignedp = 0;
 }