From 06d69cd3f36436b61e85a71caf2ab4cf75316b42 Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Sat, 14 Aug 2004 00:41:21 -0700 Subject: [PATCH] alpha.h (PROMOTE_MODE): Don't promote vector types. * config/alpha/alpha.h (PROMOTE_MODE): Don't promote vector types. * config/alpha/alpha.c (function_value): Use PROMOTE_MODE. From-SVN: r85989 --- gcc/ChangeLog | 5 +++++ gcc/config/alpha/alpha.c | 5 ++--- gcc/config/alpha/alpha.h | 26 ++++++++++++++++---------- 3 files changed, 23 insertions(+), 13 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 415c0fc6ddd..21ae7f928e2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2004-08-14 Richard Henderson + + * config/alpha/alpha.h (PROMOTE_MODE): Don't promote vector types. + * config/alpha/alpha.c (function_value): Use PROMOTE_MODE. + 2004-08-13 Richard Henderson * config/i386/i386.md (call_1, sibcall_1, call_1_rex64): Use Pmode diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c index d9dc7591070..9238ab61d75 100644 --- a/gcc/config/alpha/alpha.c +++ b/gcc/config/alpha/alpha.c @@ -5160,7 +5160,7 @@ rtx function_value (tree valtype, tree func ATTRIBUTE_UNUSED, enum machine_mode mode) { - unsigned int regnum; + unsigned int regnum, dummy; enum mode_class class; #ifdef ENABLE_CHECKING @@ -5175,8 +5175,7 @@ function_value (tree valtype, tree func ATTRIBUTE_UNUSED, switch (class) { case MODE_INT: - /* Do the same thing as PROMOTE_MODE. */ - mode = DImode; + PROMOTE_MODE (mode, dummy, valtype); /* FALLTHRU */ case MODE_COMPLEX_INT: diff --git a/gcc/config/alpha/alpha.h b/gcc/config/alpha/alpha.h index 43cdfff7f2a..d2ab9332289 100644 --- a/gcc/config/alpha/alpha.h +++ b/gcc/config/alpha/alpha.h @@ -471,16 +471,22 @@ extern const char *alpha_tls_size_string; /* For -mtls-size= */ type, but kept valid in the wider mode. The signedness of the extension may differ from that of the type. - For Alpha, we always store objects in a full register. 32-bit objects - are always sign-extended, but smaller objects retain their signedness. */ - -#define PROMOTE_MODE(MODE,UNSIGNEDP,TYPE) \ - if (GET_MODE_CLASS (MODE) == MODE_INT \ - && GET_MODE_SIZE (MODE) < UNITS_PER_WORD) \ - { \ - if ((MODE) == SImode) \ - (UNSIGNEDP) = 0; \ - (MODE) = DImode; \ + For Alpha, we always store objects in a full register. 32-bit integers + are always sign-extended, but smaller objects retain their signedness. + + Note that small vector types can get mapped onto integer modes at the + whim of not appearing in alpha-modes.def. We never promoted these + values before; don't do so now that we've trimed the set of modes to + those actually implemented in the backend. */ + +#define PROMOTE_MODE(MODE,UNSIGNEDP,TYPE) \ + if (GET_MODE_CLASS (MODE) == MODE_INT \ + && (TYPE == NULL || TREE_CODE (TYPE) != VECTOR_TYPE) \ + && GET_MODE_SIZE (MODE) < UNITS_PER_WORD) \ + { \ + if ((MODE) == SImode) \ + (UNSIGNEDP) = 0; \ + (MODE) = DImode; \ } /* Define this if most significant bit is lowest numbered -- 2.30.2