diff mbox

RX: Import patch

Message ID m3ei8gyb3k.fsf@redhat.com
State New
Headers show

Commit Message

Nick Clifton Jan. 13, 2011, 5:20 p.m. UTC
Hi Guys,

  I am importing a RX backend patch from the mainline to the 4.5 branch.
  This patch fixes the promotion of returned small integer types:

Cheers
  Nick
  
gcc/ChangeLog
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.
diff mbox

Patch

Index: gcc/config/rx/rx.c
===================================================================
--- gcc/config/rx/rx.c	(revision 168743)
+++ gcc/config/rx/rx.c	(working copy)
@@ -821,9 +821,34 @@ 
 		   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
 rx_return_in_memory (const_tree type, const_tree fntype ATTRIBUTE_UNUSED)
 {
@@ -2759,6 +2784,9 @@ 
 #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" */