summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authordje <dje@138bc75d-0d04-0410-961f-82ee72b054a4>2001-05-02 18:21:06 +0000
committerdje <dje@138bc75d-0d04-0410-961f-82ee72b054a4>2001-05-02 18:21:06 +0000
commit7c22a04dfb6dacce898ce443c2f60dd052b4be2c (patch)
tree2d05818a0d92ccb7b9b49c5b6d229fe38bdca9f5 /gcc
parentdb4f24e2e16dee1e27f8114e2966bf5af5dfe0ad (diff)
downloadgcc-7c22a04dfb6dacce898ce443c2f60dd052b4be2c.tar.gz
2001-05-02 David Edelsohn <edelsohn@gnu.org>
* config/rs6000/rs6000.c (rs6000_emit_move): Merge special_constant conditional blocks together. 2001-05-02 Dale Johannesen <dalej@apple.com> * config/rs6000/rs6000.h (RS6000_ARG_SIZE): Remove unused NAMED parameter. (STRICT_ARGUMENT_NAMING): Define. * config/rs6000/rs6000.c (function_arg_advance, function_arg, function_arg_partial_nregs, setup_incoming_varargs): Remove args logic which depends on "named" now that STRICT_ARGUMENT_NAMING is defined. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@41771 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog15
-rw-r--r--gcc/config/rs6000/rs6000.c79
-rw-r--r--gcc/config/rs6000/rs6000.h9
3 files changed, 50 insertions, 53 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 1a9e61af534..eded70f6b52 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,18 @@
+2001-05-02 David Edelsohn <edelsohn@gnu.org>
+
+ * config/rs6000/rs6000.c (rs6000_emit_move): Merge
+ special_constant conditional blocks together.
+
+2001-05-02 Dale Johannesen <dalej@apple.com>
+
+ * config/rs6000/rs6000.h (RS6000_ARG_SIZE): Remove unused NAMED
+ parameter.
+ (STRICT_ARGUMENT_NAMING): Define.
+ * config/rs6000/rs6000.c (function_arg_advance, function_arg,
+ function_arg_partial_nregs, setup_incoming_varargs): Remove
+ args logic which depends on "named" now that STRICT_ARGUMENT_NAMING
+ is defined.
+
Wed May 2 13:09:36 2001 Richard Kenner <kenner@vlsi1.ultra.nyu.edu>
* config/i386/i386.h (FUNCTION_BOUNDARY): Result is unsigned.
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c
index 4fa63a177d5..d89e6875cd4 100644
--- a/gcc/config/rs6000/rs6000.c
+++ b/gcc/config/rs6000/rs6000.c
@@ -1721,8 +1721,6 @@ rs6000_emit_move (dest, source, mode)
&& ! LEGITIMATE_CONSTANT_POOL_ADDRESS_P (operands[1])
&& ! TOC_RELATIVE_EXPR_P (operands[1]))
{
- int special_constant_p = 0;
-
/* Emit a USE operation so that the constant isn't deleted if
expensive optimizations are turned on because nobody
references it. This should only be done for operands that
@@ -1773,18 +1771,10 @@ rs6000_emit_move (dest, source, mode)
operands[1] = force_const_mem (mode, operands[1]);
if (TARGET_TOC
- && CONSTANT_POOL_EXPR_P (XEXP (operands[1], 0)))
- {
- rtx constant;
- enum machine_mode cmode;
-
- constant = get_pool_constant (XEXP (operands[1], 0));
- cmode = get_pool_mode (XEXP (operands[1], 0));
- special_constant_p =
- ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (constant, cmode);
- }
-
- if (special_constant_p)
+ && CONSTANT_POOL_EXPR_P (XEXP (operands[1], 0))
+ && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (
+ get_pool_constant (XEXP (operands[1], 0)),
+ get_pool_mode (XEXP (operands[1], 0))))
{
operands[1] = gen_rtx_MEM (mode,
create_TOC_reference (XEXP (operands[1], 0)));
@@ -1952,7 +1942,7 @@ function_arg_advance (cum, mode, type, named)
{
if (mode == DFmode)
cum->words += cum->words & 1;
- cum->words += RS6000_ARG_SIZE (mode, type, 1);
+ cum->words += RS6000_ARG_SIZE (mode, type);
}
}
else
@@ -1965,7 +1955,7 @@ function_arg_advance (cum, mode, type, named)
|| mode == TFmode)
n_words = 1;
else
- n_words = RS6000_ARG_SIZE (mode, type, 1);
+ n_words = RS6000_ARG_SIZE (mode, type);
/* Long long is put in odd registers. */
if (n_words == 2 && (gregno & 1) == 0)
@@ -2000,14 +1990,10 @@ function_arg_advance (cum, mode, type, named)
{
int align = (TARGET_32BIT && (cum->words & 1) != 0
&& function_arg_boundary (mode, type) == 64) ? 1 : 0;
- cum->words += align;
+ cum->words += align + RS6000_ARG_SIZE (mode, type);
- if (named)
- {
- cum->words += RS6000_ARG_SIZE (mode, type, named);
- if (GET_MODE_CLASS (mode) == MODE_FLOAT && TARGET_HARD_FLOAT)
- cum->fregno++;
- }
+ if (GET_MODE_CLASS (mode) == MODE_FLOAT && TARGET_HARD_FLOAT)
+ cum->fregno++;
if (TARGET_DEBUG_ARG)
{
@@ -2048,7 +2034,7 @@ function_arg (cum, mode, type, named)
CUMULATIVE_ARGS *cum;
enum machine_mode mode;
tree type;
- int named;
+ int named ATTRIBUTE_UNUSED;
{
enum rs6000_abi abi = DEFAULT_ABI;
@@ -2092,7 +2078,7 @@ function_arg (cum, mode, type, named)
|| mode == TFmode)
n_words = 1;
else
- n_words = RS6000_ARG_SIZE (mode, type, 1);
+ n_words = RS6000_ARG_SIZE (mode, type);
/* Long long is put in odd registers. */
if (n_words == 2 && (gregno & 1) == 0)
@@ -2111,9 +2097,6 @@ function_arg (cum, mode, type, named)
&& function_arg_boundary (mode, type) == 64) ? 1 : 0;
int align_words = cum->words + align;
- if (! named)
- return NULL_RTX;
-
if (type && TREE_CODE (TYPE_SIZE (type)) != INTEGER_CST)
return NULL_RTX;
@@ -2135,7 +2118,7 @@ function_arg (cum, mode, type, named)
((align_words >= GP_ARG_NUM_REG)
? NULL_RTX
: (align_words
- + RS6000_ARG_SIZE (mode, type, named)
+ + RS6000_ARG_SIZE (mode, type)
> GP_ARG_NUM_REG
/* If this is partially on the stack, then
we only include the portion actually
@@ -2165,11 +2148,8 @@ function_arg_partial_nregs (cum, mode, type, named)
CUMULATIVE_ARGS *cum;
enum machine_mode mode;
tree type;
- int named;
+ int named ATTRIBUTE_UNUSED;
{
- if (! named)
- return 0;
-
if (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS)
return 0;
@@ -2180,7 +2160,7 @@ function_arg_partial_nregs (cum, mode, type, named)
}
if (cum->words < GP_ARG_NUM_REG
- && GP_ARG_NUM_REG < (cum->words + RS6000_ARG_SIZE (mode, type, named)))
+ && GP_ARG_NUM_REG < (cum->words + RS6000_ARG_SIZE (mode, type)))
{
int ret = GP_ARG_NUM_REG - cum->words;
if (ret && TARGET_DEBUG_ARG)
@@ -2247,23 +2227,22 @@ setup_incoming_varargs (cum, mode, type, pretend_size, no_rtl)
int reg_size = TARGET_32BIT ? 4 : 8;
rtx save_area = NULL_RTX, mem;
int first_reg_offset, set;
+ tree fntype;
+ int stdarg_p;
- if (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS)
- {
- tree fntype;
- int stdarg_p;
-
- fntype = TREE_TYPE (current_function_decl);
- stdarg_p = (TYPE_ARG_TYPES (fntype) != 0
- && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype)))
- != void_type_node));
+ fntype = TREE_TYPE (current_function_decl);
+ stdarg_p = (TYPE_ARG_TYPES (fntype) != 0
+ && (TREE_VALUE (tree_last (TYPE_ARG_TYPES (fntype)))
+ != void_type_node));
- /* For varargs, we do not want to skip the dummy va_dcl argument.
- For stdargs, we do want to skip the last named argument. */
- next_cum = *cum;
- if (stdarg_p)
- function_arg_advance (&next_cum, mode, type, 1);
+ /* For varargs, we do not want to skip the dummy va_dcl argument.
+ For stdargs, we do want to skip the last named argument. */
+ next_cum = *cum;
+ if (stdarg_p)
+ function_arg_advance (&next_cum, mode, type, 1);
+ if (DEFAULT_ABI == ABI_V4 || DEFAULT_ABI == ABI_SOLARIS)
+ {
/* Indicate to allocate space on the stack for varargs save area. */
/* ??? Does this really have to be located at a magic spot on the
stack, or can we allocate this with assign_stack_local instead. */
@@ -2276,12 +2255,12 @@ setup_incoming_varargs (cum, mode, type, pretend_size, no_rtl)
}
else
{
+ first_reg_offset = next_cum.words;
save_area = virtual_incoming_args_rtx;
cfun->machine->sysv_varargs_p = 0;
- first_reg_offset = cum->words;
if (MUST_PASS_IN_STACK (mode, type))
- first_reg_offset += RS6000_ARG_SIZE (TYPE_MODE (type), type, 1);
+ first_reg_offset += RS6000_ARG_SIZE (TYPE_MODE (type), type);
}
set = get_varargs_alias_set ();
diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h
index c1b964400ca..cf3f9474813 100644
--- a/gcc/config/rs6000/rs6000.h
+++ b/gcc/config/rs6000/rs6000.h
@@ -1432,9 +1432,8 @@ typedef struct rs6000_args
/* Define intermediate macro to compute the size (in registers) of an argument
for the RS/6000. */
-#define RS6000_ARG_SIZE(MODE, TYPE, NAMED) \
-(! (NAMED) ? 0 \
- : (MODE) != BLKmode \
+#define RS6000_ARG_SIZE(MODE, TYPE) \
+((MODE) != BLKmode \
? (GET_MODE_SIZE (MODE) + (UNITS_PER_WORD - 1)) / UNITS_PER_WORD \
: ((unsigned HOST_WIDE_INT) int_size_in_bytes (TYPE) \
+ (UNITS_PER_WORD - 1)) / UNITS_PER_WORD)
@@ -1550,6 +1549,10 @@ typedef struct rs6000_args
#define EXPAND_BUILTIN_VA_ARG(valist, type) \
rs6000_va_arg (valist, type)
+/* Define this macro to be a nonzero value if the location where a function
+ argument is passed depends on whether or not it is a named argument. */
+#define STRICT_ARGUMENT_NAMING 1
+
/* This macro generates the assembly code for function entry.
FILE is a stdio stream to output the code to.
SIZE is an int: how many units of temporary storage to allocate.