diff options
author | David Edelsohn <edelsohn@mhpcc.edu> | 1997-12-09 16:35:56 +0000 |
---|---|---|
committer | Jeff Law <law@gcc.gnu.org> | 1997-12-09 09:35:56 -0700 |
commit | c229cba913547a5fe68d707333b10febc9f4ac2c (patch) | |
tree | 1ecfc51f0e3741646cb4a02f83f9ac34139e6044 /gcc/config/rs6000 | |
parent | b2c59d0b27284fbf3d463e387225296fee2340f7 (diff) | |
download | gcc-c229cba913547a5fe68d707333b10febc9f4ac2c.zip gcc-c229cba913547a5fe68d707333b10febc9f4ac2c.tar.gz gcc-c229cba913547a5fe68d707333b10febc9f4ac2c.tar.bz2 |
rs6000.h (FUNCTION_ARG_PADDING): Define.
* rs6000.h (FUNCTION_ARG_PADDING): Define.
* rs6000.c (function_arg_padding): New function.
From-SVN: r17029
Diffstat (limited to 'gcc/config/rs6000')
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 29 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.h | 9 |
2 files changed, 38 insertions, 0 deletions
diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 2dbdb92..f8a10b6 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -1167,6 +1167,35 @@ init_cumulative_args (cum, fntype, libname, incoming) } } +/* If defined, a C expression which determines whether, and in which + direction, to pad out an argument with extra space. The value + should be of type `enum direction': either `upward' to pad above + the argument, `downward' to pad below, or `none' to inhibit + padding. + + For the AIX ABI structs are always stored left shifted in their + argument slot. */ + +enum direction +function_arg_padding (mode, type) + enum machine_mode mode; + tree type; +{ + if (type && TREE_CODE (type) == RECORD_TYPE) + { + return upward; + } + + /* This is the default definition. */ + return (! BYTES_BIG_ENDIAN + ? upward + : ((mode == BLKmode + ? (type && TREE_CODE (TYPE_SIZE (type)) == INTEGER_CST + && int_size_in_bytes (type) < (PARM_BOUNDARY / BITS_PER_UNIT)) + : GET_MODE_BITSIZE (mode) < PARM_BOUNDARY) + ? downward : upward)); +} + /* If defined, a C expression that gives the alignment boundary, in bits, of an argument with the specified mode and type. If it is not defined, PARM_BOUNDARY is used for all arguments. diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h index d30af75..087ac5a 100644 --- a/gcc/config/rs6000/rs6000.h +++ b/gcc/config/rs6000/rs6000.h @@ -1461,6 +1461,15 @@ typedef struct rs6000_args #define FUNCTION_ARG_PASS_BY_REFERENCE(CUM, MODE, TYPE, NAMED) \ function_arg_pass_by_reference(&CUM, MODE, TYPE, NAMED) +/* If defined, a C expression which determines whether, and in which + direction, to pad out an argument with extra space. The value + should be of type `enum direction': either `upward' to pad above + the argument, `downward' to pad below, or `none' to inhibit + padding. */ + +#define FUNCTION_ARG_PADDING(MODE, TYPE) \ + function_arg_padding (MODE, TYPE) + /* If defined, a C expression that gives the alignment boundary, in bits, of an argument with the specified mode and type. If it is not defined, PARM_BOUNDARY is used for all arguments. */ |