aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/rs6000
diff options
context:
space:
mode:
authorDavid Edelsohn <edelsohn@mhpcc.edu>1997-12-09 16:35:56 +0000
committerJeff Law <law@gcc.gnu.org>1997-12-09 09:35:56 -0700
commitc229cba913547a5fe68d707333b10febc9f4ac2c (patch)
tree1ecfc51f0e3741646cb4a02f83f9ac34139e6044 /gcc/config/rs6000
parentb2c59d0b27284fbf3d463e387225296fee2340f7 (diff)
downloadgcc-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.c29
-rw-r--r--gcc/config/rs6000/rs6000.h9
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. */