Commit 826b47cc by Zack Weinberg

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
parent 272c310d
2004-01-27 Zack Weinberg <zack@codesourcery.com>
* 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 <rsandifo@redhat.com> 2004-01-27 Richard Sandiford <rsandifo@redhat.com>
PR target/7297 PR target/7297
...@@ -15,9 +22,9 @@ ...@@ -15,9 +22,9 @@
(restore_stack_nonlocal): Same. (restore_stack_nonlocal): Same.
2004-01-27 Devang Patel <dpatel@apple.com> 2004-01-27 Devang Patel <dpatel@apple.com>
* Makefile.in (dwarf2out.o): Depend on input.h * 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. imported_module_or_decl.
(xcoff_debug_hooks): Same. (xcoff_debug_hooks): Same.
* sdbout.c (sdb_debug_hooks): Same. * sdbout.c (sdb_debug_hooks): Same.
...@@ -43,14 +50,14 @@ ...@@ -43,14 +50,14 @@
(dwarf2out_imported_module_or_decl): New function. (dwarf2out_imported_module_or_decl): New function.
2004-01-27 Bob Wilson <bob.wilson@acm.org> 2004-01-27 Bob Wilson <bob.wilson@acm.org>
* config/xtensa/xtensa.c (xtensa_copy_incoming_a7): Remove SUBREG * config/xtensa/xtensa.c (xtensa_copy_incoming_a7): Remove SUBREG
on CQImode and CHImode incoming arguments in register a7. on CQImode and CHImode incoming arguments in register a7.
(function_arg): Wrap BLKmode argument in register a7 in a PARALLEL. (function_arg): Wrap BLKmode argument in register a7 in a PARALLEL.
* config/xtensa/xtensa.h (BLOCK_REG_PADDING): Define. * config/xtensa/xtensa.h (BLOCK_REG_PADDING): Define.
* config/xtensa/xtensa.md (movdi, movdf): Only call force_reg or * config/xtensa/xtensa.md (movdi, movdf): Only call force_reg or
xtensa_copy_incoming_a7 before reload. xtensa_copy_incoming_a7 before reload.
2004-01-27 J"orn Rennecke <joern.rennecke@superh.com> 2004-01-27 J"orn Rennecke <joern.rennecke@superh.com>
* coverage.c (get_coverage_counts): Give a different message * coverage.c (get_coverage_counts): Give a different message
...@@ -83,7 +90,7 @@ ...@@ -83,7 +90,7 @@
2004-01-24 James A. Morrison <ja2morri@uwaterloo.ca> 2004-01-24 James A. Morrison <ja2morri@uwaterloo.ca>
* fixinc/fixinc.c (test_test): Initialize res. * fixinc/fixinc.c (test_test): Initialize res.
(start_flexer): Initialize pz_cmd_save. (start_flexer): Initialize pz_cmd_save.
2004-01-27 Zack Weinberg <zack@codesourcery.com> 2004-01-27 Zack Weinberg <zack@codesourcery.com>
......
...@@ -3623,6 +3623,7 @@ ia64_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type, ...@@ -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++) for (; offset < byte_size && int_regs < MAX_ARGUMENT_SLOTS; i++)
{ {
enum machine_mode gr_mode = DImode; 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, /* 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 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, ...@@ -3636,17 +3637,19 @@ ia64_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type,
adjusted/little endian. */ adjusted/little endian. */
else if (byte_size - offset == 4) else if (byte_size - offset == 4)
gr_mode = SImode; 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, loc[i] = gen_rtx_EXPR_LIST (VOIDmode,
gen_rtx_REG (gr_mode, (basereg gen_rtx_REG (gr_mode, (basereg
+ int_regs)), + int_regs)),
GEN_INT (offset)); GEN_INT (offset));
offset += GET_MODE_SIZE (gr_mode);
int_regs += GET_MODE_SIZE (gr_mode) <= UNITS_PER_WORD gr_size = GET_MODE_SIZE (gr_mode);
? 1 : GET_MODE_SIZE (gr_mode) / UNITS_PER_WORD; 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 /* If we ended up using just one location, just return that one loc, but
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment