From 0020b823d6c3280e7e0a2081a36798a80b17bf7d Mon Sep 17 00:00:00 2001 From: Richard Henderson Date: Thu, 8 Feb 2001 10:46:46 -0800 Subject: [PATCH] sparc.c (function_arg_record_value_3): Fix calculation of the number of integer registers required. * config/sparc/sparc.c (function_arg_record_value_3): Fix calculation of the number of integer registers required. (function_arg_record_value): Likewise. From-SVN: r39544 --- gcc/ChangeLog | 6 ++++++ gcc/config/sparc/sparc.c | 25 +++++++++++++++++++++---- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8fb27ca76c4..b2d50401335 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2001-02-08 Richard Henderson + + * config/sparc/sparc.c (function_arg_record_value_3): Fix + calculation of the number of integer registers required. + (function_arg_record_value): Likewise. + 2001-02-08 Jason Merrill * diagnostic.c (internal_error): Say "confused" after 1 error, not diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c index 4e3dbe67edb..0d194f1b28a 100644 --- a/gcc/config/sparc/sparc.c +++ b/gcc/config/sparc/sparc.c @@ -4057,6 +4057,9 @@ static void function_arg_record_value_1 static rtx function_arg_record_value PARAMS ((tree, enum machine_mode, int, int, int)); +/* A subroutine of function_arg_record_value. Traverse the structure + recusively and determine how many registers will be required. */ + static void function_arg_record_value_1 (type, startbitpos, parms) tree type; @@ -4131,7 +4134,8 @@ function_arg_record_value_1 (type, startbitpos, parms) } } -/* Handle recursive structure field register assignment. */ +/* A subroutine of function_arg_record_value. Assign the bits of the + structure between parms->intoffset and bitpos to integer registers. */ static void function_arg_record_value_3 (bitpos, parms) @@ -4140,6 +4144,7 @@ function_arg_record_value_3 (bitpos, parms) { enum machine_mode mode; unsigned int regno; + unsigned int startbit, endbit; int this_slotno, intslots, intoffset; rtx reg; @@ -4149,7 +4154,9 @@ function_arg_record_value_3 (bitpos, parms) intoffset = parms->intoffset; parms->intoffset = -1; - intslots = (bitpos - intoffset + BITS_PER_WORD - 1) / BITS_PER_WORD; + startbit = intoffset & -BITS_PER_WORD; + endbit = (bitpos + BITS_PER_WORD - 1) & -BITS_PER_WORD; + intslots = (endbit - startbit) / BITS_PER_WORD; this_slotno = parms->slotno + intoffset / BITS_PER_WORD; intslots = MIN (intslots, SPARC_INT_ARG_MAX - this_slotno); @@ -4183,6 +4190,11 @@ function_arg_record_value_3 (bitpos, parms) while (intslots > 0); } +/* A subroutine of function_arg_record_value. Traverse the structure + recursively and assign bits to floating point registers. Track which + bits in between need integer registers; invoke function_arg_record_value_3 + to make that happen. */ + static void function_arg_record_value_2 (type, startbitpos, parms) tree type; @@ -4243,6 +4255,9 @@ function_arg_record_value_2 (type, startbitpos, parms) } } +/* Used by function_arg and function_value to implement the complex + Sparc64 structure calling conventions. */ + static rtx function_arg_record_value (type, mode, slotno, named, regbase) tree type; @@ -4265,10 +4280,12 @@ function_arg_record_value (type, mode, slotno, named, regbase) if (parms.intoffset != -1) { + unsigned int startbit, endbit; int intslots, this_slotno; - intslots = (typesize*BITS_PER_UNIT - parms.intoffset + BITS_PER_WORD - 1) - / BITS_PER_WORD; + startbit = parms.intoffset & -BITS_PER_WORD; + endbit = (typesize*BITS_PER_UNIT + BITS_PER_WORD - 1) & -BITS_PER_WORD; + intslots = (endbit - startbit) / BITS_PER_WORD; this_slotno = slotno + parms.intoffset / BITS_PER_WORD; intslots = MIN (intslots, SPARC_INT_ARG_MAX - this_slotno); -- 2.30.2