diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 11 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 9 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.md | 4 |
3 files changed, 20 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 54f5b73..608cb73 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -2,6 +2,17 @@ Wed Nov 26 11:12:26 1997 Jason Merrill <jason@yorick.cygnus.com> * toplev.c (main): Complain about -gdwarfn. +Tue Nov 25 20:32:24 1997 Michael Meissner <meissner@cygnus.com> + + (patches originally from Geoffrey Keating) + * rs6000.c (function_arg): Excess floating point arguments don't + go into GPR registers after exhausting FP registers under the + System V.4 ABI. + (function_arg_partial_nregs): Ditto. + + * rs6000.md (call insns): If -fPIC or -mrelocatable, add @plt + suffix to calls. + Tue Nov 25 23:37:27 1997 Jason Merrill <jason@yorick.cygnus.com> * integrate.c (output_inline_function): Just unset DECL_INLINE. diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 557ef8b..4af7a75 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -1349,9 +1349,11 @@ function_arg (cum, mode, type, named) const0_rtx))); } - /* Long longs won't be split between register and stack */ + /* Long longs won't be split between register and stack; + FP arguments get passed on the stack if they didn't get a register. */ else if ((DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS) && - align_words + RS6000_ARG_SIZE (mode, type, named) > GP_ARG_NUM_REG) + (align_words + RS6000_ARG_SIZE (mode, type, named) > GP_ARG_NUM_REG + || (GET_MODE_CLASS (mode) == MODE_FLOAT && TARGET_HARD_FLOAT))) { return NULL_RTX; } @@ -1385,6 +1387,9 @@ function_arg_partial_nregs (cum, mode, type, named) return 0; } + if (GET_MODE_CLASS (mode) == MODE_FLOAT && TARGET_HARD_FLOAT) + return 0; + if (cum->words < GP_ARG_NUM_REG && GP_ARG_NUM_REG < (cum->words + RS6000_ARG_SIZE (mode, type, named))) { diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index b9bd408..26ea2b4 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -7580,7 +7580,7 @@ else if (INTVAL (operands[2]) & CALL_V4_CLEAR_FP_ARGS) output_asm_insn (\"creqv 6,6,6\", operands); - return (flag_pic == 1) ? \"bl %z0@plt\" : \"bl %z0\"; + return flag_pic ? \"bl %z0@plt\" : \"bl %z0\"; }" [(set_attr "type" "branch") (set_attr "length" "4,8")]) @@ -7650,7 +7650,7 @@ else if (INTVAL (operands[3]) & CALL_V4_CLEAR_FP_ARGS) output_asm_insn (\"creqv 6,6,6\", operands); - return (flag_pic == 1) ? \"bl %z1@plt\" : \"bl %z1\"; + return flag_pic ? \"bl %z1@plt\" : \"bl %z1\"; }" [(set_attr "type" "branch") (set_attr "length" "4,8")]) |