]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
Import this fix from the mainline:
authorNick Clifton <nickc@redhat.com>
Thu, 13 Jan 2011 17:20:20 +0000 (17:20 +0000)
committerNick Clifton <nickc@gcc.gnu.org>
Thu, 13 Jan 2011 17:20:20 +0000 (17:20 +0000)
2010-10-19  Nick Clifton  <nickc@redhat.com>

* config/rx/rx.c (rx_function_value): Small integer types are
promoted to SImode.
(rx_promote_function_mode): New function.
(TARGET_PROMOTE_FUNCTION_MODE): Define.

From-SVN: r168754

gcc/ChangeLog
gcc/config/rx/rx.c

index e531cac02d15da3532450de8df030dc3f8c53b2f..fb32568e36d85002b0270aec1ec12818fbf116b3 100644 (file)
@@ -1,3 +1,13 @@
+2011-01-13  Nick Clifton  <nickc@redhat.com>
+
+       Import this fix from the mainline:
+       2010-10-19  Nick Clifton  <nickc@redhat.com>
+
+       * config/rx/rx.c (rx_function_value): Small integer types are
+       promoted to SImode.
+       (rx_promote_function_mode): New function.
+       (TARGET_PROMOTE_FUNCTION_MODE): Define.
+
 2011-01-07  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
        Backport from mainline:
index 6847d4b2e413d3fb3f120c88690a03d254ce85f6..77e3fcfc47851e42e8f298283f54574ae4673dd1 100644 (file)
@@ -821,7 +821,32 @@ rx_function_value (const_tree ret_type,
                   const_tree fn_decl_or_type ATTRIBUTE_UNUSED,
                   bool       outgoing ATTRIBUTE_UNUSED)
 {
-  return gen_rtx_REG (TYPE_MODE (ret_type), FUNC_RETURN_REGNUM);
+  enum machine_mode mode = TYPE_MODE (ret_type);
+
+  /* RX ABI specifies that small integer types are
+     promoted to int when returned by a function.  */
+  if (GET_MODE_SIZE (mode) > 0 && GET_MODE_SIZE (mode) < 4)
+    return gen_rtx_REG (SImode, FUNC_RETURN_REGNUM);
+    
+  return gen_rtx_REG (mode, FUNC_RETURN_REGNUM);
+}
+
+/* TARGET_PROMOTE_FUNCTION_MODE must behave in the same way with
+   regard to function returns as does TARGET_FUNCTION_VALUE.  */
+
+static enum machine_mode
+rx_promote_function_mode (const_tree type ATTRIBUTE_UNUSED,
+                         enum machine_mode mode,
+                         int * punsignedp ATTRIBUTE_UNUSED,
+                         const_tree funtype ATTRIBUTE_UNUSED,
+                         int for_return)
+{
+  if (for_return != 1
+      || GET_MODE_SIZE (mode) >= 4
+      || GET_MODE_SIZE (mode) < 1)
+    return mode;
+
+  return SImode;
 }
 
 static bool
@@ -2759,6 +2784,9 @@ rx_compare_redundant (rtx cmp)
 #undef  TARGET_CC_MODES_COMPATIBLE
 #define TARGET_CC_MODES_COMPATIBLE             rx_cc_modes_compatible
 
+#undef  TARGET_PROMOTE_FUNCTION_MODE
+#define TARGET_PROMOTE_FUNCTION_MODE           rx_promote_function_mode
+
 struct gcc_target targetm = TARGET_INITIALIZER;
 
 /* #include "gt-rx.h" */