Index: rs6000.c =================================================================== RCS file: /cvs/gcc/gcc/gcc/config/rs6000/rs6000.c,v retrieving revision 1.549 diff -c -p -r1.549 rs6000.c *** rs6000.c 12 Nov 2003 22:52:09 -0000 1.549 --- rs6000.c 14 Nov 2003 19:29:54 -0000 *************** static rtx rs6000_spe_function_arg (CUMU *** 395,400 **** --- 395,401 ---- enum machine_mode, tree); static rtx rs6000_mixed_function_arg (CUMULATIVE_ARGS *, enum machine_mode, tree, int); + static void rs6000_move_block_from_reg(int regno, rtx x, int nregs); static void setup_incoming_varargs (CUMULATIVE_ARGS *, enum machine_mode, tree, int *, int); *************** function_arg_pass_by_reference (CUMULATI *** 4374,4379 **** --- 4375,4411 ---- } return type && int_size_in_bytes (type) < 0; } + + static void + rs6000_move_block_from_reg(int regno, rtx x, int nregs) + { + int i; + enum machine_mode reg_mode = TARGET_32BIT ? SImode : DImode; + + if (nregs == 0) + return; + + for (i = 0; i < nregs; i++) + { + rtx tem = adjust_address_nv (x, reg_mode, i*GET_MODE_SIZE(reg_mode)); + if (reload_completed) + { + if (! strict_memory_address_p (reg_mode, XEXP (tem, 0))) + tem = NULL_RTX; + else + tem = simplify_gen_subreg (reg_mode, x, BLKmode, + i * GET_MODE_SIZE(reg_mode)); + } + else + tem = replace_equiv_address (tem, XEXP (tem, 0)); + + if (tem == NULL_RTX) + abort (); + + emit_move_insn (tem, gen_rtx_REG (reg_mode, regno + i)); + } + } + /* Perform any needed actions needed for a function that is receiving a variable number of arguments. *************** setup_incoming_varargs (CUMULATIVE_ARGS *** 4431,4438 **** set_mem_alias_set (mem, set); set_mem_align (mem, BITS_PER_WORD); ! move_block_from_reg (GP_ARG_MIN_REG + first_reg_offset, mem, ! GP_ARG_NUM_REG - first_reg_offset); } /* Save FP registers if needed. */ --- 4463,4470 ---- set_mem_alias_set (mem, set); set_mem_align (mem, BITS_PER_WORD); ! rs6000_move_block_from_reg (GP_ARG_MIN_REG + first_reg_offset, mem, ! GP_ARG_NUM_REG - first_reg_offset); } /* Save FP registers if needed. */