From 8ff40a74460169e5018406ca3f69293c279dd818 Mon Sep 17 00:00:00 2001 From: Stan Shebs Date: Mon, 22 Nov 2004 07:24:54 +0000 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++++++ gcc/config/rs6000/rs6000.c | 35 +++++++++++++++++++++++++++++------ 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0e7656618b4..d33f468a20b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2004-11-21 Stan Shebs + + * 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 * config/darwin.h (JUMP_TABLES_IN_TEXT_SECTION): Define. diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index 2d4e6186c5c..fd0b1413744 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