aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorJohn David Anglin <dave@hiauly1.hia.nrc.ca>2001-09-24 16:16:07 +0000
committerJohn David Anglin <danglin@gcc.gnu.org>2001-09-24 16:16:07 +0000
commitb848dc65c43c049b0861d37ef2181b8ebbcf8254 (patch)
tree0fe13440610ea5b1401f4b5a20f335e177affa65 /gcc/config
parent250d5688733963297fd909944cc203ce074f681d (diff)
downloadgcc-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.c38
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