diff options
author | Zack Weinberg <zack@gcc.gnu.org> | 2004-01-27 22:48:11 +0000 |
---|---|---|
committer | Zack Weinberg <zack@gcc.gnu.org> | 2004-01-27 22:48:11 +0000 |
commit | 826b47cc77a9b9ffb6489fd361be217cb024313f (patch) | |
tree | de2e6b4ca935caee7553a3235f294bda6ed65743 /gcc/config | |
parent | 272c310d1376adba9d8e29e4b6bc0270043dfdb6 (diff) | |
download | gcc-826b47cc77a9b9ffb6489fd361be217cb024313f.zip gcc-826b47cc77a9b9ffb6489fd361be217cb024313f.tar.gz gcc-826b47cc77a9b9ffb6489fd361be217cb024313f.tar.bz2 |
ia64.c (ia64_function_arg): When placing HFAs in integer registers...
* ia64.c (ia64_function_arg): When placing HFAs in integer
registers, do not special case the mode used for complex
types. Do not advance int_regs until the current register
is full.
From-SVN: r76758
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/ia64/ia64.c | 15 |
1 files changed, 9 insertions, 6 deletions
diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index b97dcd2..5271081 100644 --- a/gcc/config/ia64/ia64.c +++ b/gcc/config/ia64/ia64.c @@ -3623,6 +3623,7 @@ ia64_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type, for (; offset < byte_size && int_regs < MAX_ARGUMENT_SLOTS; i++) { enum machine_mode gr_mode = DImode; + unsigned int gr_size; /* If we have an odd 4 byte hunk because we ran out of FR regs, then this goes in a GR reg left adjusted/little endian, right @@ -3636,17 +3637,19 @@ ia64_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type, adjusted/little endian. */ else if (byte_size - offset == 4) gr_mode = SImode; - /* Complex floats need to have float mode. */ - if (GET_MODE_CLASS (mode) == MODE_COMPLEX_FLOAT) - gr_mode = hfa_mode; loc[i] = gen_rtx_EXPR_LIST (VOIDmode, gen_rtx_REG (gr_mode, (basereg + int_regs)), GEN_INT (offset)); - offset += GET_MODE_SIZE (gr_mode); - int_regs += GET_MODE_SIZE (gr_mode) <= UNITS_PER_WORD - ? 1 : GET_MODE_SIZE (gr_mode) / UNITS_PER_WORD; + + gr_size = GET_MODE_SIZE (gr_mode); + offset += gr_size; + if (gr_size == UNITS_PER_WORD + || (gr_size < UNITS_PER_WORD && offset % UNITS_PER_WORD == 0)) + int_regs++; + else if (gr_size > UNITS_PER_WORD) + int_regs += gr_size / UNITS_PER_WORD; } /* If we ended up using just one location, just return that one loc, but |