aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMax Filippov <jcmvbkbc@gmail.com>2016-11-02 18:34:43 +0000
committerMax Filippov <jcmvbkbc@gcc.gnu.org>2016-11-02 18:34:43 +0000
commit9ae4ef4cd3f5881501d7569d36c833806051962b (patch)
tree14278f2b6eddd68b0ce7a0bb9098db904bab6206
parent302fd2cc3f4b3742e13361a2dbfbe54cd855d0e7 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/config/xtensa/xtensa.c44
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: