Commit 8b1c5fd0 by Jakub Jelinek Committed by Jakub Jelinek

sparc.md (adddi3): If operands[2] is 4096 and operands[1] is constant...

	* config/sparc/sparc.md (adddi3): If operands[2] is 4096 and
	operands[1] is constant, calculate the sum and generate movdi.
	(addsi3): Similarly.  Use SImode in call to arith_4096_operand.
	(subsi3): Use SImode in call to arith_4096_operand.

	* gcc.c-torture/execute/20001031-1.c: New test.

From-SVN: r37274
parent a0115140
2000-11-06 Jakub Jelinek <jakub@redhat.com> 2000-11-06 Jakub Jelinek <jakub@redhat.com>
* config/sparc/sparc.md (adddi3): If operands[2] is 4096 and
operands[1] is constant, calculate the sum and generate movdi.
(addsi3): Similarly. Use SImode in call to arith_4096_operand.
(subsi3): Use SImode in call to arith_4096_operand.
2000-11-06 Jakub Jelinek <jakub@redhat.com>
* config/sparc/sparc.h (ASM_OUTPUT_MI_THUNK): On sparc64 we need to * config/sparc/sparc.h (ASM_OUTPUT_MI_THUNK): On sparc64 we need to
adjust %o1, not %o0 if the return type is large structure. adjust %o1, not %o0 if the return type is large structure.
......
...@@ -5539,6 +5539,8 @@ ...@@ -5539,6 +5539,8 @@
"" ""
" "
{ {
HOST_WIDE_INT i;
if (! TARGET_ARCH64) if (! TARGET_ARCH64)
{ {
emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2,
...@@ -5551,9 +5553,17 @@ ...@@ -5551,9 +5553,17 @@
} }
if (arith_double_4096_operand(operands[2], DImode)) if (arith_double_4096_operand(operands[2], DImode))
{ {
emit_insn (gen_rtx_SET (VOIDmode, operands[0], switch (GET_CODE (operands[1]))
gen_rtx_MINUS (DImode, operands[1], {
GEN_INT(-4096)))); case CONST_INT: i = INTVAL (operands[1]); break;
case CONST_DOUBLE: i = CONST_DOUBLE_LOW (operands[1]); break;
default:
emit_insn (gen_rtx_SET (VOIDmode, operands[0],
gen_rtx_MINUS (DImode, operands[1],
GEN_INT(-4096))));
DONE;
}
emit_insn (gen_movdi (operands[0], GEN_INT (i + 4096)));
DONE; DONE;
} }
}") }")
...@@ -5768,11 +5778,15 @@ ...@@ -5768,11 +5778,15 @@
"" ""
" "
{ {
if (arith_4096_operand(operands[2], DImode)) if (arith_4096_operand(operands[2], SImode))
{ {
emit_insn (gen_rtx_SET (VOIDmode, operands[0], if (GET_CODE (operands[1]) == CONST_INT)
gen_rtx_MINUS (SImode, operands[1], emit_insn (gen_movsi (operands[0],
GEN_INT(-4096)))); GEN_INT (INTVAL (operands[1]) + 4096)));
else
emit_insn (gen_rtx_SET (VOIDmode, operands[0],
gen_rtx_MINUS (SImode, operands[1],
GEN_INT(-4096))));
DONE; DONE;
} }
}") }")
...@@ -5967,7 +5981,7 @@ ...@@ -5967,7 +5981,7 @@
"" ""
" "
{ {
if (arith_4096_operand(operands[2], DImode)) if (arith_4096_operand(operands[2], SImode))
{ {
emit_insn (gen_rtx_SET (VOIDmode, operands[0], emit_insn (gen_rtx_SET (VOIDmode, operands[0],
gen_rtx_PLUS (SImode, operands[1], gen_rtx_PLUS (SImode, operands[1],
......
2000-11-06 Jakub Jelinek <jakub@redhat.com>
* gcc.c-torture/execute/20001031-1.c: New test.
2000-11-04 Mark Mitchell <mark@codesourcery.com> 2000-11-04 Mark Mitchell <mark@codesourcery.com>
* g++.old-deja/g++.brendan/misc13.C: Put `strlen' in `std' * g++.old-deja/g++.brendan/misc13.C: Put `strlen' in `std'
......
extern void abort (void);
extern void exit (int);
void t1 (int x)
{
if (x != 4100)
abort ();
}
int t2 (void)
{
int i;
t1 ((i = 4096) + 4);
return i;
}
void t3 (long long x)
{
if (x != 0x80000fffULL)
abort ();
}
long long t4 (void)
{
long long i;
t3 ((i = 4096) + 0x7fffffffULL);
return i;
}
main ()
{
if (t2 () != 4096)
abort ();
if (t4 () != 4096)
abort ();
exit (0);
}
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