sparc.md (movdf): Avoid calling validize_mem during or after reload.
authorJakub Jelinek <jakub@redhat.com>
Fri, 9 Nov 2001 14:30:33 +0000 (15:30 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Fri, 9 Nov 2001 14:30:33 +0000 (15:30 +0100)
* config/sparc/sparc.md (movdf): Avoid calling validize_mem during
or after reload.

* gcc.c-torture/compile/20011109-1.c: New test.

From-SVN: r46880

gcc/ChangeLog
gcc/config/sparc/sparc.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/compile/20011109-1.c [new file with mode: 0644]

index 5cce4ad4db1ed371969c46d0623ecd121c3591dc..add0d829e3f4ea746d33ddc8ad301a59f84cc521 100644 (file)
@@ -1,3 +1,8 @@
+2001-11-09  Jakub Jelinek  <jakub@redhat.com>
+
+       * config/sparc/sparc.md (movdf): Avoid calling validize_mem during
+       or after reload.
+
 2001-11-09  Gerald Pfeifer  <pfeifer@dbai.tuwien.ac.at>
 
        * doc/install.texi2html: Use $MAKEINFO --no-split.
index 9c35dcc8202c652a05215f8b62e91962e2f7f9f0..dad74dd4b1da2b48cdc12912c5bb580531e205b9 100644 (file)
          && fp_zero_operand (operands[1], DFmode))
        goto movdf_is_ok;
 
+      /* We are able to build any DF constant in integer registers.  */
+      if (REGNO (operands[0]) < 32
+         && (reload_completed || reload_in_progress))
+       goto movdf_is_ok;
+
       operands[1] = validize_mem (force_const_mem (GET_MODE (operands[0]),
                                                    operands[1]));
     }
index dc44d389f9331e15f6fdf3ab0f0ef19fbb9ba290..6d9c0f07480acd0633d02c7d5be1e25efb8c72d7 100644 (file)
@@ -1,3 +1,7 @@
+2001-11-09  Jakub Jelinek  <jakub@redhat.com>
+
+       * gcc.c-torture/compile/20011109-1.c: New test.
+
 2001-11-08  Geoffrey Keating  <geoffk@redhat.com>
 
        * g++.old-deja/g++.bugs/900227_01.C: Change stormy16 to xstormy16.
diff --git a/gcc/testsuite/gcc.c-torture/compile/20011109-1.c b/gcc/testsuite/gcc.c-torture/compile/20011109-1.c
new file mode 100644 (file)
index 0000000..f1987a7
--- /dev/null
@@ -0,0 +1,51 @@
+typedef struct { short x[4]; } S;
+typedef struct { unsigned int a, b, c; S *d; } T;
+
+S *(*foo) (T *, int, int, int, int);
+unsigned short *(*bar)(const T *);
+unsigned short baz(T *,const int);
+
+T *die (void)
+{
+  typedef struct { unsigned int a, b, e; double f, g; } U;
+
+  char h[8], i[2053], j[2053];
+  double k, l, m;
+  U n;
+  T *o;
+  unsigned short p;
+  int q, r;
+  long s;
+  unsigned short *t;
+  S *u;
+  unsigned char *v, *w;
+  unsigned int x;
+
+  o = 0;
+  for (x = 0; x < n.e; x++)
+    {
+      l = 1.0;
+      if (n.g - n.f <= 1.0)
+       l = ((1 << o->c) - 1) / (n.g - n.f);
+      v = w;
+      for (r = o->b - 1; r >= 0; r--)
+       {
+         u = foo (o, 0, r, o->a, 1);
+         if (!u)
+           break;
+         t = bar (o);
+         for (q = 0; q < (int) o->a; q++)
+           {
+             h[0] = *v;
+             s = *v++;
+             k = (double) s;
+             m = l*k;
+             p = m < 0 ? 0 : m > (1 << o->c) - 1 ? (1 << o->c) - 1 : m + 0.5;
+             p = baz (o,p);
+             t[q] = p;
+             *u++ = o->d[p];
+           }
+       }
+    }
+  return o;
+}