xtensa: fix ICE on pr59037.c test
authorMax Filippov <jcmvbkbc@gmail.com>
Wed, 2 Nov 2016 18:34:43 +0000 (18:34 +0000)
committerMax Filippov <jcmvbkbc@gcc.gnu.org>
Wed, 2 Nov 2016 18:34:43 +0000 (18:34 +0000)
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

gcc/ChangeLog
gcc/config/xtensa/xtensa.c

index e9640c8ed21d22104f37c5639fd47ba2f17ea730..5e98b98028348db1b3fe8ed2c6bf620e5c6f5936 100644 (file)
@@ -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
index 2115b57096886dc62e4632ce22970ce266cf22d2..6e8a25d0307d5aeacf07148c534727f1c24aa7f5 100644 (file)
@@ -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: