From: danglin Date: Tue, 16 Sep 2014 23:39:28 +0000 (+0000) Subject: PR target/61853 X-Git-Tag: upstream/5.3.0~5498 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c4d24f011c722cf3aaa12b57fd74296670bb808a;p=platform%2Fupstream%2Flinaro-gcc.git PR target/61853 * config/pa/pa.c (pa_function_value): Directly handle aggregates that fit exactly in a word or double word. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@215309 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d446d2c..da2bcee 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-09-16 John David Anglin + + PR target/61853 + * config/pa/pa.c (pa_function_value): Directly handle aggregates + that fit exactly in a word or double word. + 2014-09-16 Ilya Tocar * config/i386/driver-i386.c (host_detect_local_cpu): Detect lack of diff --git a/gcc/config/pa/pa.c b/gcc/config/pa/pa.c index 6db4f3d..20f2ef6 100644 --- a/gcc/config/pa/pa.c +++ b/gcc/config/pa/pa.c @@ -9298,6 +9298,12 @@ pa_function_value (const_tree valtype, || TREE_CODE (valtype) == COMPLEX_TYPE || TREE_CODE (valtype) == VECTOR_TYPE) { + HOST_WIDE_INT valsize = int_size_in_bytes (valtype); + + /* Handle aggregates that fit exactly in a word or double word. */ + if ((valsize & (UNITS_PER_WORD - 1)) == 0) + return gen_rtx_REG (TYPE_MODE (valtype), 28); + if (TARGET_64BIT) { /* Aggregates with a size less than or equal to 128 bits are @@ -9306,7 +9312,7 @@ pa_function_value (const_tree valtype, memory. */ rtx loc[2]; int i, offset = 0; - int ub = int_size_in_bytes (valtype) <= UNITS_PER_WORD ? 1 : 2; + int ub = valsize <= UNITS_PER_WORD ? 1 : 2; for (i = 0; i < ub; i++) { @@ -9318,7 +9324,7 @@ pa_function_value (const_tree valtype, return gen_rtx_PARALLEL (BLKmode, gen_rtvec_v (ub, loc)); } - else if (int_size_in_bytes (valtype) > UNITS_PER_WORD) + else if (valsize > UNITS_PER_WORD) { /* Aggregates 5 to 8 bytes in size are returned in general registers r28-r29 in the same manner as other non