From e50869f7a638328f609afc0cbfa77ccaa2cbe01a Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Mon, 8 Jun 2015 13:57:58 +0000 Subject: [PATCH] rx.c (rx_function_value): Do not promote vector types. * 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 | 6 ++++++ gcc/config/rx/rx.c | 20 +++++++++++++++----- gcc/config/rx/rx.h | 1 + 3 files changed, 22 insertions(+), 5 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 1831c64be61..9908efd58d8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2015-06-08 Nick Clifton + + * 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 * genattrtab.c (insn_alternatives): Change type from int * diff --git a/gcc/config/rx/rx.c b/gcc/config/rx/rx.c index 5262fbf84ca..5bf38dfbb43 100644 --- a/gcc/config/rx/rx.c +++ b/gcc/config/rx/rx.c @@ -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. */); } } diff --git a/gcc/config/rx/rx.h b/gcc/config/rx/rx.h index 8391b5b25b0..d2d6bce48c8 100644 --- a/gcc/config/rx/rx.h +++ b/gcc/config/rx/rx.h @@ -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), \ -- 2.30.2