diff options
author | Stan Shebs <shebs@apple.com> | 2004-11-22 07:24:54 +0000 |
---|---|---|
committer | Stan Shebs <shebs@gcc.gnu.org> | 2004-11-22 07:24:54 +0000 |
commit | 8ff40a74460169e5018406ca3f69293c279dd818 (patch) | |
tree | bd79b7c6d7139344f11f036775021151ecf912df /gcc | |
parent | 31492595c610b2d9468c0e8369b96accb61150a9 (diff) | |
download | gcc-8ff40a74460169e5018406ca3f69293c279dd818.zip gcc-8ff40a74460169e5018406ca3f69293c279dd818.tar.gz gcc-8ff40a74460169e5018406ca3f69293c279dd818.tar.bz2 |
rs6000.c: (rs6000_darwin64_function_arg): Add UNION_TYPE case.
* config/rs6000/rs6000.c: (rs6000_darwin64_function_arg): Add UNION_TYPE case.
(function_arg): Move darwin test up, sniff mode first for efficiency, test
for union type.
From-SVN: r91003
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/config/rs6000/rs6000.c | 35 |
2 files changed, 35 insertions, 6 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0e76566..d33f468 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-11-21 Stan Shebs <shebs@apple.com> + + * config/rs6000/rs6000.c: (rs6000_darwin64_function_arg): Add UNION_TYPE case. + (function_arg): Move darwin test up, sniff mode first for efficiency, test + for union type. + 2004-11-21 Dale Johannesen <dalej@apple.com> * config/darwin.h (JUMP_TABLES_IN_TEXT_SECTION): Define. diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 2d4e618..fd0b141 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -5177,6 +5177,23 @@ rs6000_darwin64_function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, } break; + case UNION_TYPE: + tot = rs6000_arg_size (mode, type); + if (tot <= 0) + return NULL_RTX; + bytepos = 0; + + for (j = 0; j < tot; ++j) + { + sub = gen_rtx_REG ((TARGET_64BIT ? DImode : SImode), GP_ARG_MIN_REG + cum->words++); + roffset = gen_rtx_CONST_INT (SImode, bytepos); + rvec[k++] = gen_rtx_EXPR_LIST (VOIDmode, sub, roffset); + if (cum->words >= GP_ARG_NUM_REG) + break; + bytepos += (TARGET_64BIT ? 8 : 4); + } + break; + case ARRAY_TYPE: tot = int_size_in_bytes (type); if (tot <= 0) @@ -5340,6 +5357,18 @@ function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, return GEN_INT (cum->call_cookie); } + if (mode == BLKmode + && rs6000_darwin64_abi + && (TREE_CODE (type) == RECORD_TYPE + || TREE_CODE (type) == UNION_TYPE + || TREE_CODE (type) == ARRAY_TYPE)) + { + rtx rslt = rs6000_darwin64_function_arg (cum, mode, type, named); + if (rslt != NULL_RTX) + return rslt; + /* Else fall through to usual handling. */ + } + if (USE_ALTIVEC_FOR_ARG_P (cum, mode, type, named)) if (TARGET_64BIT && ! cum->prototype) { @@ -5414,12 +5443,6 @@ function_arg (CUMULATIVE_ARGS *cum, enum machine_mode mode, || mode == DCmode)))) return rs6000_spe_function_arg (cum, mode, type); - else if (rs6000_darwin64_abi - && mode == BLKmode - && (TREE_CODE (type) == RECORD_TYPE - || TREE_CODE (type) == ARRAY_TYPE)) - return rs6000_darwin64_function_arg (cum, mode, type, named); - else if (abi == ABI_V4) { if (TARGET_HARD_FLOAT && TARGET_FPRS |