[multiple changes]
authorRoger Sayle <sayle@gcc.gnu.org>
Wed, 24 Jul 2002 13:41:22 +0000 (13:41 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Wed, 24 Jul 2002 13:41:22 +0000 (13:41 +0000)
2002-07-24  Frank van der Linden  <fvdl@wasabisystems.com>

PR optimization/7291
* config/i386/i386.c (ix86_expand_clrstr): Fix bzero alignment
problem on x86_64.

2002-07-24  Roger Sayle  <roger@eyesopen.com>

* gcc.c-torture/execute/memset-3.c: New testcase.

From-SVN: r55704

gcc/ChangeLog
gcc/config/i386/i386.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/memset-3.c [new file with mode: 0644]

index 3e488ab713f2c1e150d0f7ed338c5dc7eb44da7a..7e9cd869832c40a0979aea2aee40bd7a1bbe71a6 100644 (file)
@@ -1,3 +1,9 @@
+2002-07-24  Frank van der Linden  <fvdl@wasabisystems.com>
+
+       PR optimization/7291
+       * config/i386/i386.c (ix86_expand_clrstr): Fix bzero alignment
+       problem on x86_64.
+
 2002-07-24  Gabriel Dos Reis  <gdr@nerim.net>
 
        * pretty-print.h: Add macros from cp/error.c
index bbd5553beec559379025516f73db0ca6d0fadcf6..0b4cf9ddd253a83c6ae63422c48dc9ecdf5ce5f5 100644 (file)
@@ -10193,7 +10193,7 @@ ix86_expand_clrstr (src, count_exp, align_exp)
                                 gen_rtx_SUBREG (SImode, zeroreg, 0)));
       if (TARGET_64BIT && (align <= 4 || count == 0))
        {
-         rtx label = ix86_expand_aligntest (countreg, 2);
+         rtx label = ix86_expand_aligntest (countreg, 4);
          emit_insn (gen_strsetsi (destreg,
                                   gen_rtx_SUBREG (SImode, zeroreg, 0)));
          emit_label (label);
index b3742503184ba5d44d9400185fd5502bf6e94be6..89d69d35945ba7860c06691c2ac6bc6f1678ccd4 100644 (file)
@@ -1,3 +1,7 @@
+2002-07-24  Roger Sayle  <roger@eyesopen.com>
+
+       * gcc.c-torture/execute/memset-3.c: New testcase.
+
 2002-07-24  Neil Booth  <neil@daikokuya.co.uk>
 
        * gcc.dg/cpp/trad/Wunused.c, gcc.dg/cpp/trad/Wunused.h,
diff --git a/gcc/testsuite/gcc.c-torture/execute/memset-3.c b/gcc/testsuite/gcc.c-torture/execute/memset-3.c
new file mode 100644 (file)
index 0000000..64032a7
--- /dev/null
@@ -0,0 +1,208 @@
+/* Copyright (C) 2002  Free Software Foundation.
+
+   Test memset with various combinations of constant pointer alignments and
+   lengths to make sure any optimizations in the compiler are correct.
+
+   Written by Roger Sayle, July 22, 2002.  */
+
+#ifndef MAX_OFFSET
+#define MAX_OFFSET (sizeof (long long))
+#endif
+
+#ifndef MAX_COPY
+#define MAX_COPY 15
+#endif
+
+#ifndef MAX_EXTRA
+#define MAX_EXTRA (sizeof (long long))
+#endif
+
+#define MAX_LENGTH (MAX_OFFSET + MAX_COPY + MAX_EXTRA)
+
+static union {
+  char buf[MAX_LENGTH];
+  long long align_int;
+  long double align_fp;
+} u;
+
+char A = 'A';
+
+void reset ()
+{
+  int i;
+
+  for (i = 0; i < MAX_LENGTH; i++)
+    u.buf[i] = 'a';
+}
+
+void check (int off, int len, int ch)
+{
+  char *q;
+  int i;
+
+  q = u.buf;
+  for (i = 0; i < off; i++, q++)
+    if (*q != 'a')
+      abort ();
+
+  for (i = 0; i < len; i++, q++)
+    if (*q != ch)
+      abort ();
+
+  for (i = 0; i < MAX_EXTRA; i++, q++)
+    if (*q != 'a')
+      abort ();
+}
+
+int main ()
+{
+  int len;
+  char *p;
+
+  /* off == 0 */
+  for (len = 0; len < MAX_COPY; len++)
+    {
+      reset ();
+
+      p = memset (u.buf, '\0', len);
+      if (p != u.buf) abort ();
+      check (0, len, '\0');
+
+      p = memset (u.buf, A, len);
+      if (p != u.buf) abort ();
+      check (0, len, 'A');
+
+      p = memset (u.buf, 'B', len);
+      if (p != u.buf) abort ();
+      check (0, len, 'B');
+    }
+
+  /* off == 1 */
+  for (len = 0; len < MAX_COPY; len++)
+    {
+      reset ();
+
+      p = memset (u.buf+1, '\0', len);
+      if (p != u.buf+1) abort ();
+      check (1, len, '\0');
+
+      p = memset (u.buf+1, A, len);
+      if (p != u.buf+1) abort ();
+      check (1, len, 'A');
+
+      p = memset (u.buf+1, 'B', len);
+      if (p != u.buf+1) abort ();
+      check (1, len, 'B');
+    }
+
+  /* off == 2 */
+  for (len = 0; len < MAX_COPY; len++)
+    {
+      reset ();
+
+      p = memset (u.buf+2, '\0', len);
+      if (p != u.buf+2) abort ();
+      check (2, len, '\0');
+
+      p = memset (u.buf+2, A, len);
+      if (p != u.buf+2) abort ();
+      check (2, len, 'A');
+
+      p = memset (u.buf+2, 'B', len);
+      if (p != u.buf+2) abort ();
+      check (2, len, 'B');
+    }
+
+  /* off == 3 */
+  for (len = 0; len < MAX_COPY; len++)
+    {
+      reset ();
+
+      p = memset (u.buf+3, '\0', len);
+      if (p != u.buf+3) abort ();
+      check (3, len, '\0');
+
+      p = memset (u.buf+3, A, len);
+      if (p != u.buf+3) abort ();
+      check (3, len, 'A');
+
+      p = memset (u.buf+3, 'B', len);
+      if (p != u.buf+3) abort ();
+      check (3, len, 'B');
+    }
+
+  /* off == 4 */
+  for (len = 0; len < MAX_COPY; len++)
+    {
+      reset ();
+
+      p = memset (u.buf+4, '\0', len);
+      if (p != u.buf+4) abort ();
+      check (4, len, '\0');
+
+      p = memset (u.buf+4, A, len);
+      if (p != u.buf+4) abort ();
+      check (4, len, 'A');
+
+      p = memset (u.buf+4, 'B', len);
+      if (p != u.buf+4) abort ();
+      check (4, len, 'B');
+    }
+
+  /* off == 5 */
+  for (len = 0; len < MAX_COPY; len++)
+    {
+      reset ();
+
+      p = memset (u.buf+5, '\0', len);
+      if (p != u.buf+5) abort ();
+      check (5, len, '\0');
+
+      p = memset (u.buf+5, A, len);
+      if (p != u.buf+5) abort ();
+      check (5, len, 'A');
+
+      p = memset (u.buf+5, 'B', len);
+      if (p != u.buf+5) abort ();
+      check (5, len, 'B');
+    }
+
+  /* off == 6 */
+  for (len = 0; len < MAX_COPY; len++)
+    {
+      reset ();
+
+      p = memset (u.buf+6, '\0', len);
+      if (p != u.buf+6) abort ();
+      check (6, len, '\0');
+
+      p = memset (u.buf+6, A, len);
+      if (p != u.buf+6) abort ();
+      check (6, len, 'A');
+
+      p = memset (u.buf+6, 'B', len);
+      if (p != u.buf+6) abort ();
+      check (6, len, 'B');
+    }
+
+  /* off == 7 */
+  for (len = 0; len < MAX_COPY; len++)
+    {
+      reset ();
+
+      p = memset (u.buf+7, '\0', len);
+      if (p != u.buf+7) abort ();
+      check (7, len, '\0');
+
+      p = memset (u.buf+7, A, len);
+      if (p != u.buf+7) abort ();
+      check (7, len, 'A');
+
+      p = memset (u.buf+7, 'B', len);
+      if (p != u.buf+7) abort ();
+      check (7, len, 'B');
+    }
+
+  exit (0);
+}
+