Commit 9ae4ef4c by Max Filippov Committed by Max Filippov

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
parent 302fd2cc
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> 2016-11-02 Segher Boessenkool <segher@kernel.crashing.org>
PR target/78168 PR target/78168
...@@ -2535,13 +2535,32 @@ xtensa_output_addr_const_extra (FILE *fp, rtx x) ...@@ -2535,13 +2535,32 @@ xtensa_output_addr_const_extra (FILE *fp, rtx x)
return false; 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 void
xtensa_output_literal (FILE *file, rtx x, machine_mode mode, int labelno) xtensa_output_literal (FILE *file, rtx x, machine_mode mode, int labelno)
{ {
long value_long[2]; long value_long[2];
int size;
rtx first, second;
fprintf (file, "\t.literal .LC%u, ", (unsigned) labelno); fprintf (file, "\t.literal .LC%u, ", (unsigned) labelno);
...@@ -2580,25 +2599,8 @@ xtensa_output_literal (FILE *file, rtx x, machine_mode mode, int labelno) ...@@ -2580,25 +2599,8 @@ xtensa_output_literal (FILE *file, rtx x, machine_mode mode, int labelno)
case MODE_INT: case MODE_INT:
case MODE_PARTIAL_INT: case MODE_PARTIAL_INT:
size = GET_MODE_SIZE (mode); xtensa_output_integer_literal_parts (file, x, GET_MODE_SIZE (mode));
switch (size) fputs ("\n", file);
{
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 ();
}
break; break;
default: default:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment