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
This commit is contained in:
parent
302fd2cc3f
commit
9ae4ef4cd3
@ -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
|
||||
|
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user