From: Michael Meissner Date: Wed, 26 Nov 1997 21:26:23 +0000 (+0000) Subject: (patches originally from Geoffrey Keating) X-Git-Tag: releases/egcs-1.0.0~50 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ef32ca543bb7676a75de1b2cd8a07c10f240611d;p=thirdparty%2Fgcc.git (patches originally from Geoffrey Keating) (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. From-SVN: r16758 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 63bd24c862dc..d9e21f346938 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,14 @@ +Wed Nov 26 13:04:46 1997 Michael Meissner + + (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. + Wed Nov 26 13:04:46 1997 Jason Merrill * toplev.c (main): Complain about -gdwarfn. diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 497aa3f35289..1d44f59ebeb1 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 42926563140c..4446e8570dc9 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -7575,7 +7575,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")]) @@ -7645,7 +7645,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")])