sparc.md (adddi3): If operands[2] is 4096 and operands[1] is constant...
authorJakub Jelinek <jakub@redhat.com>
Mon, 6 Nov 2000 10:42:20 +0000 (11:42 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 6 Nov 2000 10:42:20 +0000 (11:42 +0100)
* 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
gcc/config/sparc/sparc.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/20001031-1.c [new file with mode: 0644]

index e7d8a0e05ca14e4202baf4f03431c93b1dae97c0..530cc60d33c67a7ee52e375e2d653f51ef7cc7b4 100644 (file)
@@ -1,3 +1,10 @@
+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
index 3ec43ef42899b3a18c7c9ff526796263957452ec..93734f9d3866e8c957ab32a3f62b998d76a2f94f 100644 (file)
   ""
   "
 {
+  HOST_WIDE_INT i;
+
   if (! TARGET_ARCH64)
     {
       emit_insn (gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2,
     }
   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;
     }
 }")
   ""
   "
 {
-  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;
     }
 }")
   ""
   "
 {
-  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],
index 1793aca6b1263659f6ef088f397773bba8e87852..46ec3b67a69f6733aa73458b412d0e2332a040ea 100644 (file)
@@ -1,3 +1,7 @@
+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>
 
        * 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 (file)
index 0000000..a2a6c83
--- /dev/null
@@ -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);
+}