From 8b1c5fd0255ca3710cfeb86e5a2c2c50d1000ea9 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 6 Nov 2000 11:42:20 +0100 Subject: [PATCH] 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 --- gcc/ChangeLog | 7 ++++ gcc/config/sparc/sparc.md | 30 +++++++++++---- gcc/testsuite/ChangeLog | 4 ++ .../gcc.c-torture/execute/20001031-1.c | 37 +++++++++++++++++++ 4 files changed, 70 insertions(+), 8 deletions(-) create mode 100644 gcc/testsuite/gcc.c-torture/execute/20001031-1.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e7d8a0e05ca..530cc60d33c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2000-11-06 Jakub Jelinek + + * 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 * config/sparc/sparc.h (ASM_OUTPUT_MI_THUNK): On sparc64 we need to diff --git a/gcc/config/sparc/sparc.md b/gcc/config/sparc/sparc.md index 3ec43ef4289..93734f9d386 100644 --- a/gcc/config/sparc/sparc.md +++ b/gcc/config/sparc/sparc.md @@ -5539,6 +5539,8 @@ "" " { + HOST_WIDE_INT i; + if (! TARGET_ARCH64) { emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, @@ -5551,9 +5553,17 @@ } if (arith_double_4096_operand(operands[2], DImode)) { - emit_insn (gen_rtx_SET (VOIDmode, operands[0], - gen_rtx_MINUS (DImode, operands[1], - GEN_INT(-4096)))); + switch (GET_CODE (operands[1])) + { + 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; } }") @@ -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], - gen_rtx_MINUS (SImode, operands[1], - GEN_INT(-4096)))); + if (GET_CODE (operands[1]) == CONST_INT) + emit_insn (gen_movsi (operands[0], + 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; } }") @@ -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], gen_rtx_PLUS (SImode, operands[1], diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1793aca6b12..46ec3b67a69 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,7 @@ +2000-11-06 Jakub Jelinek + + * gcc.c-torture/execute/20001031-1.c: New test. + 2000-11-04 Mark Mitchell * g++.old-deja/g++.brendan/misc13.C: Put `strlen' in `std' diff --git a/gcc/testsuite/gcc.c-torture/execute/20001031-1.c b/gcc/testsuite/gcc.c-torture/execute/20001031-1.c new file mode 100644 index 00000000000..a2a6c830a21 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/20001031-1.c @@ -0,0 +1,37 @@ +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); +} -- 2.30.2