aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoger Sayle <sayle@gcc.gnu.org>2002-07-24 13:41:22 +0000
committerRoger Sayle <sayle@gcc.gnu.org>2002-07-24 13:41:22 +0000
commit79258dce717c63f561eccc1ddeafd0ea697c9d81 (patch)
tree6151e54d163abccb0bc94d5f4028f84249cf9657
parent26ff2117a92699fbbf8ba5559248df3696b88ce1 (diff)
downloadgcc-79258dce717c63f561eccc1ddeafd0ea697c9d81.zip
gcc-79258dce717c63f561eccc1ddeafd0ea697c9d81.tar.gz
gcc-79258dce717c63f561eccc1ddeafd0ea697c9d81.tar.bz2
[multiple changes]
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
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/i386/i386.c2
-rw-r--r--gcc/testsuite/ChangeLog4
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/memset-3.c208
4 files changed, 219 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 3e488ab..7e9cd86 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index bbd5553..0b4cf9d 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -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);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index b374250..89d69d3 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..64032a7
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/memset-3.c
@@ -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);
+}
+