diff options
author | Max Filippov <jcmvbkbc@gmail.com> | 2016-11-02 18:34:43 +0000 |
---|---|---|
committer | Max Filippov <jcmvbkbc@gcc.gnu.org> | 2016-11-02 18:34:43 +0000 |
commit | 9ae4ef4cd3f5881501d7569d36c833806051962b (patch) | |
tree | 14278f2b6eddd68b0ce7a0bb9098db904bab6206 | |
parent | 302fd2cc3f4b3742e13361a2dbfbe54cd855d0e7 (diff) | |
download | gcc-9ae4ef4cd3f5881501d7569d36c833806051962b.zip gcc-9ae4ef4cd3f5881501d7569d36c833806051962b.tar.gz gcc-9ae4ef4cd3f5881501d7569d36c833806051962b.tar.bz2 |
xtensa: fix ICE on pr59037.c test
xtensa gcc gets ICE on pr59037.c test because its xtensa_output_literal
function cannot handle integer literals of sizes other than 4 and 8,
whereas the test uses 16-byte int vector.
Split integer literal formatting into the recursive function
xtensa_output_integer_literal_parts capable of handling literals of any
power of 2 size not less than 4.
2016-11-02 Max Filippov <jcmvbkbc@gmail.com>
gcc/
* config/xtensa/xtensa.c (xtensa_output_integer_literal_parts):
New function.
(xtensa_output_literal): Use xtensa_output_integer_literal_parts
to format MODE_INT and MODE_PARTIAL_INT literals.
From-SVN: r241800
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/xtensa/xtensa.c | 44 |
2 files changed, 30 insertions, 21 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e9640c8..5e98b98 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2016-11-02 Max Filippov <jcmvbkbc@gmail.com> + + * config/xtensa/xtensa.c (xtensa_output_integer_literal_parts): + New function. + (xtensa_output_literal): Use xtensa_output_integer_literal_parts + to format MODE_INT and MODE_PARTIAL_INT literals. + 2016-11-02 Segher Boessenkool <segher@kernel.crashing.org> PR target/78168 diff --git a/gcc/config/xtensa/xtensa.c b/gcc/config/xtensa/xtensa.c index 2115b57..6e8a25d 100644 --- a/gcc/config/xtensa/xtensa.c +++ b/gcc/config/xtensa/xtensa.c @@ -2535,13 +2535,32 @@ xtensa_output_addr_const_extra (FILE *fp, rtx x) return false; } +static void +xtensa_output_integer_literal_parts (FILE *file, rtx x, int size) +{ + if (size > 4 && !(size & (size - 1))) + { + rtx first, second; + + split_double (x, &first, &second); + xtensa_output_integer_literal_parts (file, first, size / 2); + fputs (", ", file); + xtensa_output_integer_literal_parts (file, second, size / 2); + } + else if (size == 4) + { + output_addr_const (file, x); + } + else + { + gcc_unreachable(); + } +} void xtensa_output_literal (FILE *file, rtx x, machine_mode mode, int labelno) { long value_long[2]; - int size; - rtx first, second; fprintf (file, "\t.literal .LC%u, ", (unsigned) labelno); @@ -2580,25 +2599,8 @@ xtensa_output_literal (FILE *file, rtx x, machine_mode mode, int labelno) case MODE_INT: case MODE_PARTIAL_INT: - size = GET_MODE_SIZE (mode); - switch (size) - { - case 4: - output_addr_const (file, x); - fputs ("\n", file); - break; - - case 8: - split_double (x, &first, &second); - output_addr_const (file, first); - fputs (", ", file); - output_addr_const (file, second); - fputs ("\n", file); - break; - - default: - gcc_unreachable (); - } + xtensa_output_integer_literal_parts (file, x, GET_MODE_SIZE (mode)); + fputs ("\n", file); break; default: |