rx.c (rx_function_value): Do not promote vector types.
authorNick Clifton <nickc@redhat.com>
Mon, 8 Jun 2015 13:57:58 +0000 (13:57 +0000)
committerNick Clifton <nickc@gcc.gnu.org>
Mon, 8 Jun 2015 13:57:58 +0000 (13:57 +0000)
* config/rx/rx.c (rx_function_value): Do not promote vector types.
(rx_promote_function_mode): Likewise.
* config/rx/rx.h (LIBCALL_VALUE): Likewise.

From-SVN: r224228

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

index 1831c64be61f5da4083dfbf79492b098396f7888..9908efd58d8b0b8a537124460d5f2e29e07d478e 100644 (file)
@@ -1,3 +1,9 @@
+2015-06-08  Nick Clifton  <nickc@redhat.com>
+
+       * config/rx/rx.c (rx_function_value): Do not promote vector types.
+       (rx_promote_function_mode): Likewise.
+       * config/rx/rx.h (LIBCALL_VALUE): Likewise.
+
 2015-06-08  Jakub Jelinek  <jakub@redhat.com>
 
        * genattrtab.c (insn_alternatives): Change type from int *
index 5262fbf84ca5caff1dce43a0c1cb9cd8277859a6..5bf38dfbb43cd64024c7ad2c41634af32fec082d 100644 (file)
@@ -477,11 +477,18 @@ rx_print_operand_address (FILE * file, rtx addr)
          addr = XEXP (addr, 0);
          gcc_assert (XINT (addr, 1) == UNSPEC_CONST);
 
-         /* FIXME: Putting this case label here is an appalling abuse of the C language.  */
-       case UNSPEC:
           addr = XVECEXP (addr, 0, 0);
          gcc_assert (CONST_INT_P (addr));
+         fprintf (file, "#");
+         output_addr_const (file, addr);
+         break;
        }
+      fprintf (file, "#");
+      output_addr_const (file, XEXP (addr, 0));
+      break;
+
+    case UNSPEC:
+      addr = XVECEXP (addr, 0, 0);
       /* Fall through.  */
     case LABEL_REF:
     case SYMBOL_REF:
@@ -1174,6 +1181,8 @@ rx_function_value (const_tree ret_type,
   if (GET_MODE_SIZE (mode) > 0
       && GET_MODE_SIZE (mode) < 4
       && ! COMPLEX_MODE_P (mode)
+      && ! VECTOR_TYPE_P (ret_type)
+      && ! VECTOR_MODE_P (mode)
       )
     return gen_rtx_REG (SImode, FUNC_RETURN_REGNUM);
     
@@ -1193,6 +1202,8 @@ rx_promote_function_mode (const_tree type ATTRIBUTE_UNUSED,
   if (for_return != 1
       || GET_MODE_SIZE (mode) >= 4
       || COMPLEX_MODE_P (mode)
+      || VECTOR_MODE_P (mode)
+      || VECTOR_TYPE_P (type)
       || GET_MODE_SIZE (mode) < 1)
     return mode;
 
@@ -1712,7 +1723,6 @@ gen_safe_add (rtx dest, rtx src, rtx val, bool is_frame_related)
 
   if (is_frame_related)
     RTX_FRAME_RELATED_P (insn) = 1;
-  return;
 }
 
 static void
@@ -1746,7 +1756,7 @@ rx_expand_prologue (void)
 
   if (flag_stack_usage_info)
     current_function_static_stack_size = frame_size + stack_size;
-  
+
   /* If we use any of the callee-saved registers, save them now.  */
   if (mask)
     {
@@ -1852,7 +1862,7 @@ rx_expand_prologue (void)
                      GEN_INT (- (HOST_WIDE_INT) frame_size), true);
       else
        gen_safe_add (stack_pointer_rtx, frame_pointer_rtx, NULL_RTX,
-                     true);
+                     false /* False because the epilogue will use the FP not the SP.  */);
     }
 }
 
index 8391b5b25b0ee3e0b3690c2908f77385344acda0..d2d6bce48c808672ad512fdd82f585043ca06f37 100644 (file)
@@ -267,6 +267,7 @@ enum reg_class
 #define LIBCALL_VALUE(MODE)                            \
   gen_rtx_REG (((GET_MODE_CLASS (MODE) != MODE_INT     \
                  || COMPLEX_MODE_P (MODE)              \
+                 || VECTOR_MODE_P (MODE)               \
                 || GET_MODE_SIZE (MODE) >= 4)          \
                ? (MODE)                                \
                : SImode),                              \