From: Thomas Preud'homme Date: Wed, 4 Mar 2015 05:56:54 +0000 (+0000) Subject: backport: re PR target/59593 ([arm big-endian] using "ldrh" access a immediate ... X-Git-Tag: releases/gcc-4.8.5~233 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=739368ad58e7a75c79ded3bf9ff4f43c7a86acbf;p=thirdparty%2Fgcc.git backport: re PR target/59593 ([arm big-endian] using "ldrh" access a immediate which stored in a memory by word) 2015-03-04 Thomas Preud'homme Backport from mainline 2014-11-27 Thomas Preud'homme gcc/ PR target/59593 * config/arm/arm.c (dump_minipool): dispatch to consttable pattern based on mode size. * config/arm/arm.md (consttable_1): Make it TARGET_EITHER. (consttable_2): Make it TARGET_EITHER and move HFmode handling from consttable_4 to it. (consttable_4): Move HFmode handling to consttable_2 pattern. gcc/testsuite/ PR target/59593 * gcc.target/arm/constant-pool.c: New test. From-SVN: r221173 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3671cf1fe822..cf80bc16d8e2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2015-03-04 Thomas Preud'homme + + Backport from mainline + 2014-11-27 Thomas Preud'homme + + PR target/59593 + * config/arm/arm.c (dump_minipool): dispatch to consttable pattern + based on mode size. + * config/arm/arm.md (consttable_1): Make it TARGET_EITHER. + (consttable_2): Make it TARGET_EITHER and move HFmode handling from + consttable_4 to it. + (consttable_4): Move HFmode handling to consttable_2 pattern. + 2015-03-04 Thomas Preud'homme Backport from mainline diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 346a2c979249..a699951a1320 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -13337,7 +13337,7 @@ dump_minipool (rtx scan) fputc ('\n', dump_file); } - switch (mp->fix_size) + switch (GET_MODE_SIZE (mp->mode)) { #ifdef HAVE_consttable_1 case 1: diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md index 611c4eae95f4..64b56b2fe685 100644 --- a/gcc/config/arm/arm.md +++ b/gcc/config/arm/arm.md @@ -11096,7 +11096,7 @@ (define_insn "consttable_1" [(unspec_volatile [(match_operand 0 "" "")] VUNSPEC_POOL_1)] - "TARGET_THUMB1" + "TARGET_EITHER" "* making_const_table = TRUE; assemble_integer (operands[0], 1, BITS_PER_WORD, 1); @@ -11108,14 +11108,23 @@ (define_insn "consttable_2" [(unspec_volatile [(match_operand 0 "" "")] VUNSPEC_POOL_2)] - "TARGET_THUMB1" + "TARGET_EITHER" "* - making_const_table = TRUE; - gcc_assert (GET_MODE_CLASS (GET_MODE (operands[0])) != MODE_FLOAT); - assemble_integer (operands[0], 2, BITS_PER_WORD, 1); - assemble_zeros (2); - return \"\"; - " + { + rtx x = operands[0]; + making_const_table = TRUE; + switch (GET_MODE_CLASS (GET_MODE (x))) + { + case MODE_FLOAT: + arm_emit_fp16_const (x); + break; + default: + assemble_integer (operands[0], 2, BITS_PER_WORD, 1); + assemble_zeros (2); + break; + } + return \"\"; + }" [(set_attr "length" "4")] ) @@ -11129,15 +11138,12 @@ switch (GET_MODE_CLASS (GET_MODE (x))) { case MODE_FLOAT: - if (GET_MODE (x) == HFmode) - arm_emit_fp16_const (x); - else - { - REAL_VALUE_TYPE r; - REAL_VALUE_FROM_CONST_DOUBLE (r, x); - assemble_real (r, GET_MODE (x), BITS_PER_WORD); - } - break; + { + REAL_VALUE_TYPE r; + REAL_VALUE_FROM_CONST_DOUBLE (r, x); + assemble_real (r, GET_MODE (x), BITS_PER_WORD); + break; + } default: /* XXX: Sometimes gcc does something really dumb and ends up with a HIGH in a constant pool entry, usually because it's trying to diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index d0aa70edb629..c723897c2270 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2015-03-04 Thomas Preud'homme + + Backport from mainline + 2014-11-27 Thomas Preud'homme + + PR target/59593 + * gcc.target/arm/constant-pool.c: New test. + 2015-03-04 Thomas Preud'homme PR target/64453 diff --git a/gcc/testsuite/gcc.target/arm/constant-pool.c b/gcc/testsuite/gcc.target/arm/constant-pool.c new file mode 100644 index 000000000000..8427dfb1a80f --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/constant-pool.c @@ -0,0 +1,27 @@ +/* { dg-do run } */ +/* { dg-options "-O1" } */ + +unsigned short v = 0x5678; +int i; +int j = 0; +int *ptr = &j; + +int +func (void) +{ + for (i = 0; i < 1; ++i) + { + *ptr = -1; + v = 0x1234; + } + return v; +} + +int +main (void) +{ + func (); + if (v != 0x1234) + __builtin_abort (); + return 0; +}