diff options
author | Thomas Preud'homme <thomas.preudhomme@arm.com> | 2014-11-27 11:00:15 +0000 |
---|---|---|
committer | Thomas Preud'homme <thopre01@gcc.gnu.org> | 2014-11-27 11:00:15 +0000 |
commit | 84593a48f6446a48ee86724972fdcdcae143f9cd (patch) | |
tree | 2ecb3f7c37c9ba655643c1ae162a6cb5f4b91d1d /gcc | |
parent | 687a5d7c39dad8a9209ef3d90bef5b4de32b0b91 (diff) | |
download | gcc-84593a48f6446a48ee86724972fdcdcae143f9cd.zip gcc-84593a48f6446a48ee86724972fdcdcae143f9cd.tar.gz gcc-84593a48f6446a48ee86724972fdcdcae143f9cd.tar.bz2 |
re PR target/59593 ([arm big-endian] using "ldrh" access a immediate which stored in a memory by word)
2014-11-27 Thomas Preud'homme <thomas.preudhomme@arm.com>
gcc/
PR target/59593
* config/arm/arm.c (dump_minipool): dispatch to consttable pattern
based on mode size.
* config/arm/arm.md (consttable_1): Move from config/arm/thumb1.md and
make it TARGET_EITHER.
(consttable_2): Move from config/arm/thumb1.md, make it TARGET_EITHER
and move HFmode handling from consttable_4 to it.
(consttable_4): Move HFmode handling to consttable_2 pattern.
* config/arm/thumb1.md (consttable_1): Move to config/arm/arm.md.
(consttable_2): Ditto.
gcc/testsuite/
PR target/59593
* gcc.target/arm/constant-pool.c: New test.
From-SVN: r218118
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 13 | ||||
-rw-r--r-- | gcc/config/arm/arm.c | 2 | ||||
-rw-r--r-- | gcc/config/arm/arm.md | 51 | ||||
-rw-r--r-- | gcc/config/arm/thumb1.md | 27 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/arm/constant-pool.c | 27 |
6 files changed, 88 insertions, 37 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2b4eec7..32e0bcb 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,16 @@ +2014-11-27 Thomas Preud'homme <thomas.preudhomme@arm.com> + + PR target/59593 + * config/arm/arm.c (dump_minipool): dispatch to consttable pattern + based on mode size. + * config/arm/arm.md (consttable_1): Move from config/arm/thumb1.md and + make it TARGET_EITHER. + (consttable_2): Move from config/arm/thumb1.md, make it TARGET_EITHER + and move HFmode handling from consttable_4 to it. + (consttable_4): Move HFmode handling to consttable_2 pattern. + * config/arm/thumb1.md (consttable_1): Move to config/arm/arm.md. + (consttable_2): Ditto. + 2014-11-27 Richard Biener <rguenther@suse.de> * tree-ssa-sccvn.c (try_to_simplify): Allow diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 64494e8..6377d8c 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -16626,7 +16626,7 @@ dump_minipool (rtx_insn *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 a52716d..2e2a788 100644 --- a/gcc/config/arm/arm.md +++ b/gcc/config/arm/arm.md @@ -10594,6 +10594,42 @@ [(set_attr "type" "no_insn")] ) +(define_insn "consttable_1" + [(unspec_volatile [(match_operand 0 "" "")] VUNSPEC_POOL_1)] + "TARGET_EITHER" + "* + making_const_table = TRUE; + assemble_integer (operands[0], 1, BITS_PER_WORD, 1); + assemble_zeros (3); + return \"\"; + " + [(set_attr "length" "4") + (set_attr "type" "no_insn")] +) + +(define_insn "consttable_2" + [(unspec_volatile [(match_operand 0 "" "")] VUNSPEC_POOL_2)] + "TARGET_EITHER" + "* + { + 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") + (set_attr "type" "no_insn")] +) + (define_insn "consttable_4" [(unspec_volatile [(match_operand 0 "" "")] VUNSPEC_POOL_4)] "TARGET_EITHER" @@ -10604,15 +10640,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/config/arm/thumb1.md b/gcc/config/arm/thumb1.md index ddedc39..2208ae6 100644 --- a/gcc/config/arm/thumb1.md +++ b/gcc/config/arm/thumb1.md @@ -1735,33 +1735,6 @@ (set_attr "conds" "clob")] ) -(define_insn "consttable_1" - [(unspec_volatile [(match_operand 0 "" "")] VUNSPEC_POOL_1)] - "TARGET_THUMB1" - "* - making_const_table = TRUE; - assemble_integer (operands[0], 1, BITS_PER_WORD, 1); - assemble_zeros (3); - return \"\"; - " - [(set_attr "length" "4") - (set_attr "type" "no_insn")] -) - -(define_insn "consttable_2" - [(unspec_volatile [(match_operand 0 "" "")] VUNSPEC_POOL_2)] - "TARGET_THUMB1" - "* - 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 \"\"; - " - [(set_attr "length" "4") - (set_attr "type" "no_insn")] -) - ;; Miscellaneous Thumb patterns (define_expand "tablejump" [(parallel [(set (pc) (match_operand:SI 0 "register_operand" "")) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index db8d4ff..d6bddf9 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-11-27 Thomas Preud'homme <thomas.preudhomme@arm.com> + + PR target/59593 + * gcc.target/arm/constant-pool.c: New test. + 2014-11-27 Kyrylo Tkachov <kyrylo.tkachov@arm.com> * gcc.target/aarch64/simd/vsqrt_f64_1.c: Mark variable volatile. 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 0000000..8427dfb --- /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; +} |