ia64.c (ia64_function_arg): When placing HFAs in integer registers...
authorZack Weinberg <zack@gcc.gnu.org>
Tue, 27 Jan 2004 22:48:11 +0000 (22:48 +0000)
committerZack Weinberg <zack@gcc.gnu.org>
Tue, 27 Jan 2004 22:48:11 +0000 (22:48 +0000)
* 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

gcc/ChangeLog
gcc/config/ia64/ia64.c

index 47cf998ac3a8949e2de8bfbe4fa81cbb4c69c84f..c5c093c386f86193e5afbadaf2d11dc9bf65faab 100644 (file)
@@ -1,3 +1,10 @@
+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>
 
        PR target/7297
@@ -15,9 +22,9 @@
        (restore_stack_nonlocal): Same.
 
 2004-01-27  Devang Patel <dpatel@apple.com>
-       
+
        * 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.
        (dwarf2out_imported_module_or_decl): New function.
 
 2004-01-27  Bob Wilson  <bob.wilson@acm.org>
-       
+
        * 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 <joern.rennecke@superh.com>
 
        * coverage.c (get_coverage_counts): Give a different message
@@ -83,7 +90,7 @@
 
 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.
 
 2004-01-27  Zack Weinberg  <zack@codesourcery.com>
index b97dcd2bc38506e09e1f30ebe9e650a9ab7b26c1..5271081b3e9dc3c34653cd315c58100126dc1de3 100644 (file)
@@ -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