From: Zack Weinberg Date: Tue, 27 Jan 2004 22:48:11 +0000 (+0000) Subject: ia64.c (ia64_function_arg): When placing HFAs in integer registers... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=826b47cc77a9b9ffb6489fd361be217cb024313f;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 47cf998ac3a..c5c093c386f 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2004-01-27 Zack Weinberg + + * 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. + 2004-01-27 Richard Sandiford PR target/7297 @@ -15,9 +22,9 @@ (restore_stack_nonlocal): Same. 2004-01-27 Devang Patel - + * Makefile.in (dwarf2out.o): Depend on input.h - * dbxout.c (dbx_debug_hooks): Add new empty hook for + * dbxout.c (dbx_debug_hooks): Add new empty hook for imported_module_or_decl. (xcoff_debug_hooks): Same. * sdbout.c (sdb_debug_hooks): Same. @@ -43,14 +50,14 @@ (dwarf2out_imported_module_or_decl): New function. 2004-01-27 Bob Wilson - + * config/xtensa/xtensa.c (xtensa_copy_incoming_a7): Remove SUBREG on CQImode and CHImode incoming arguments in register a7. (function_arg): Wrap BLKmode argument in register a7 in a PARALLEL. * config/xtensa/xtensa.h (BLOCK_REG_PADDING): Define. * config/xtensa/xtensa.md (movdi, movdf): Only call force_reg or xtensa_copy_incoming_a7 before reload. - + 2004-01-27 J"orn Rennecke * coverage.c (get_coverage_counts): Give a different message @@ -83,7 +90,7 @@ 2004-01-24 James A. Morrison - * fixinc/fixinc.c (test_test): Initialize res. + * fixinc/fixinc.c (test_test): Initialize res. (start_flexer): Initialize pz_cmd_save. 2004-01-27 Zack Weinberg diff --git a/gcc/config/ia64/ia64.c b/gcc/config/ia64/ia64.c index b97dcd2bc38..5271081b3e9 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