diff options
author | John David Anglin <dave@hiauly1.hia.nrc.ca> | 2001-09-24 16:16:07 +0000 |
---|---|---|
committer | John David Anglin <danglin@gcc.gnu.org> | 2001-09-24 16:16:07 +0000 |
commit | b848dc65c43c049b0861d37ef2181b8ebbcf8254 (patch) | |
tree | 0fe13440610ea5b1401f4b5a20f335e177affa65 /gcc/config | |
parent | 250d5688733963297fd909944cc203ce074f681d (diff) | |
download | gcc-b848dc65c43c049b0861d37ef2181b8ebbcf8254.zip gcc-b848dc65c43c049b0861d37ef2181b8ebbcf8254.tar.gz gcc-b848dc65c43c049b0861d37ef2181b8ebbcf8254.tar.bz2 |
pa.c (function_arg): Pass floating arguments in both general and floating registers in indirect...
* pa.c (function_arg): Pass floating arguments in both general and
floating registers in indirect (dynamic) calls when generating code
for the 32 bit ABI and the HP assembler.
From-SVN: r45775
Diffstat (limited to 'gcc/config')
-rw-r--r-- | gcc/config/pa/pa.c | 38 |
1 files changed, 23 insertions, 15 deletions
diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c index 0bc2c8f..6ce61a8 100644 --- a/gcc/config/pa/pa.c +++ b/gcc/config/pa/pa.c @@ -7145,22 +7145,30 @@ function_arg (cum, mode, type, named, incoming) gen_rtx_REG (DImode, gpr_reg_base), GEN_INT (8)))); } - /* Determine if the register needs to be passed in both general and + /* Determine if the argument needs to be passed in both general and floating point registers. */ - if ((TARGET_PORTABLE_RUNTIME || TARGET_64BIT || TARGET_ELF32) - /* If we are doing soft-float with portable runtime, then there - is no need to worry about FP regs. */ - && ! TARGET_SOFT_FLOAT - /* The parameter must be some kind of float, else we can just - pass it in integer registers. */ - && FLOAT_MODE_P (mode) - /* The target function must not have a prototype. */ - && cum->nargs_prototype <= 0 - /* libcalls do not need to pass items in both FP and general - registers. */ - && type != NULL_TREE - /* All this hair applies to outgoing args only. */ - && !incoming) + if (((TARGET_PORTABLE_RUNTIME || TARGET_64BIT || TARGET_ELF32) + /* If we are doing soft-float with portable runtime, then there + is no need to worry about FP regs. */ + && ! TARGET_SOFT_FLOAT + /* The parameter must be some kind of float, else we can just + pass it in integer registers. */ + && FLOAT_MODE_P (mode) + /* The target function must not have a prototype. */ + && cum->nargs_prototype <= 0 + /* libcalls do not need to pass items in both FP and general + registers. */ + && type != NULL_TREE + /* All this hair applies to outgoing args only. */ + && ! incoming) + /* Also pass outgoing floating arguments in both registers in indirect + calls with the 32 bit ABI and the HP assembler since there is no + way to the specify argument locations in static functions. */ + || (! TARGET_64BIT + && ! TARGET_GAS + && ! incoming + && cum->indirect + && FLOAT_MODE_P (mode))) { retval = gen_rtx_PARALLEL |