Commit f9c887ac by Zack Weinberg

ia64.c (ia64_function_arg): In big-endian mode...

	* config/ia64/ia64.c (ia64_function_arg): In big-endian mode,
	when passing single SFmode quantities in general registers,
	put them in the high half.

From-SVN: r78119
parent 0e1d7f32
2004-02-19 Zack Weinberg <zack@codesourcery.com>
* config/ia64/ia64.c (ia64_function_arg): In big-endian mode,
when passing single SFmode quantities in general registers,
put them in the high half.
2004-02-19 Aldy Hernandez <aldyh@redhat.com> 2004-02-19 Aldy Hernandez <aldyh@redhat.com>
* doc/md.texi (Standard Names): Document additional dependency on * doc/md.texi (Standard Names): Document additional dependency on
fix pattern. fix pattern.
* optabs.c (ftruncify): Remove. * optabs.c (ftruncify): Remove.
(expand_fix): Manually inline ftruncify above. (expand_fix): Manually inline ftruncify above.
(can_fix_p): Add FIXME note. (can_fix_p): Add FIXME note.
2004-02-19 Aldy Hernandez <aldyh@redhat.com> 2004-02-19 Aldy Hernandez <aldyh@redhat.com>
* config/rs6000/spe.md (spe_fixunssfsi2): Rename to * config/rs6000/spe.md (spe_fixunssfsi2): Rename to
spe_fixuns_truncsfsi2. spe_fixuns_truncsfsi2.
* config/rs6000/rs6000.md (fixunssfsi2): Rename to * config/rs6000/rs6000.md (fixunssfsi2): Rename to
fixuns_truncsfsi2. fixuns_truncsfsi2.
2004-02-19 Steve Ellcey <sje@cup.hp.com> 2004-02-19 Steve Ellcey <sje@cup.hp.com>
......
...@@ -3786,21 +3786,34 @@ ia64_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type, ...@@ -3786,21 +3786,34 @@ ia64_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, tree type,
named, and in a GR register when unnamed. */ named, and in a GR register when unnamed. */
else if (cum->prototype) else if (cum->prototype)
{ {
if (! named) if (named)
return gen_rtx_REG (mode, basereg + cum->words + offset);
else
return gen_rtx_REG (mode, FR_ARG_FIRST + cum->fp_regs); return gen_rtx_REG (mode, FR_ARG_FIRST + cum->fp_regs);
/* In big-endian mode, an anonymous SFmode value must be represented
as (parallel:SF [(expr_list (reg:DI n) (const_int 0))]) to force
the value into the high half of the general register. */
else if (BYTES_BIG_ENDIAN && mode == SFmode)
return gen_rtx_PARALLEL (mode,
gen_rtvec (1,
gen_rtx_EXPR_LIST (VOIDmode,
gen_rtx_REG (DImode, basereg + cum->words + offset),
const0_rtx)));
else
return gen_rtx_REG (mode, basereg + cum->words + offset);
} }
/* If there is no prototype, then FP values go in both FR and GR /* If there is no prototype, then FP values go in both FR and GR
registers. */ registers. */
else else
{ {
/* See comment above. */
enum machine_mode inner_mode =
(BYTES_BIG_ENDIAN && mode == SFmode) ? DImode : mode;
rtx fp_reg = gen_rtx_EXPR_LIST (VOIDmode, rtx fp_reg = gen_rtx_EXPR_LIST (VOIDmode,
gen_rtx_REG (mode, (FR_ARG_FIRST gen_rtx_REG (mode, (FR_ARG_FIRST
+ cum->fp_regs)), + cum->fp_regs)),
const0_rtx); const0_rtx);
rtx gr_reg = gen_rtx_EXPR_LIST (VOIDmode, rtx gr_reg = gen_rtx_EXPR_LIST (VOIDmode,
gen_rtx_REG (mode, gen_rtx_REG (inner_mode,
(basereg + cum->words (basereg + cum->words
+ offset)), + offset)),
const0_rtx); const0_rtx);
......
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