aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorDominik Vogt <vogt@linux.vnet.ibm.com>2017-01-05 10:05:47 +0000
committerAndreas Krebbel <krebbel@gcc.gnu.org>2017-01-05 10:05:47 +0000
commit3db705650b723f5777940e9ff9485de90e1b81f9 (patch)
tree0ff8e5482dcbccab74bc0bf5625ca9b48cfe6e9d /gcc
parentf5a537e3905a9a098f8f4acaa8cd8e4fc1be07ff (diff)
downloadgcc-3db705650b723f5777940e9ff9485de90e1b81f9.zip
gcc-3db705650b723f5777940e9ff9485de90e1b81f9.tar.gz
gcc-3db705650b723f5777940e9ff9485de90e1b81f9.tar.bz2
S/390: Additional memset/memcpy runtime tests.
These were provided by Dominik to check more of the corner case in our memset/memcpy inline code. gcc/testsuite/ChangeLog: 2017-01-05 Dominik Vogt <vogt@linux.vnet.ibm.com> * gcc.target/s390/memcpy-2.c: New test. * gcc.target/s390/memset-2.c: New test. From-SVN: r244099
Diffstat (limited to 'gcc')
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/s390/memcpy-2.c94
-rw-r--r--gcc/testsuite/gcc.target/s390/memset-2.c92
3 files changed, 191 insertions, 0 deletions
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 46734e9..86dee20 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-01-05 Dominik Vogt <vogt@linux.vnet.ibm.com>
+
+ * gcc.target/s390/memcpy-2.c: New test.
+ * gcc.target/s390/memset-2.c: New test.
+
2017-01-05 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
* gcc.target/s390/memcpy-1.c: New test.
diff --git a/gcc/testsuite/gcc.target/s390/memcpy-2.c b/gcc/testsuite/gcc.target/s390/memcpy-2.c
new file mode 100644
index 0000000..b9568ec
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/memcpy-2.c
@@ -0,0 +1,94 @@
+/* Funtional memmov test. */
+
+/* { dg-do run } */
+/* { dg-options "-O3" } */
+
+#define MAX_LEN (8 * 1000)
+#define X 0x11
+
+char gsrc[MAX_LEN + 2];
+char gdst[MAX_LEN + 2];
+
+__attribute__ ((noinline))
+int
+compare_mem (int len)
+{
+ int i;
+
+ if (gdst[0] != 0x61)
+ __builtin_abort();
+ for (i = 1; i <= len; i++)
+ if (gsrc[i] != gdst[i])
+ __builtin_abort();
+ for (i = len + 1; i < MAX_LEN; i++)
+ if (gdst[i] != 0x61 + i % 4)
+ __builtin_abort();
+}
+
+__attribute__ ((noinline))
+void
+init_mem (void)
+{
+ unsigned int *p1;
+ unsigned int *p2;
+ int i;
+
+ p1 = (unsigned int *)gsrc;
+ p2 = (unsigned int *)gdst;
+ for (i = 0; i < MAX_LEN / sizeof(unsigned int); i++)
+ {
+ p1[i] = 0x71727374;
+ p2[i] = 0x61626364;
+ }
+}
+
+#define MEMCPY_CHECK(DST, SRC, LEN) \
+ init_mem (); \
+ __builtin_memcpy ((DST) + 1, (SRC) + 1, (LEN)); \
+ compare_mem ((LEN));
+
+
+int main(void)
+{
+ int lens[] =
+ {
+ 255, 256, 257,
+ 511, 512, 513,
+ 767, 768, 769,
+ 1023, 1024, 1025,
+ 1279, 1280, 1281,
+ 1535, 1536, 1537,
+ -999
+ };
+ int t;
+
+ /* variable length */
+ for (t = 0; lens[t] != -999; t++)
+ {
+ MEMCPY_CHECK (gdst, gsrc, lens[t]);
+ }
+ /* constant length */
+ MEMCPY_CHECK (gdst, gsrc, 0);
+ MEMCPY_CHECK (gdst, gsrc, 1);
+ MEMCPY_CHECK (gdst, gsrc, 2);
+ MEMCPY_CHECK (gdst, gsrc, 3);
+ MEMCPY_CHECK (gdst, gsrc, 256);
+ MEMCPY_CHECK (gdst, gsrc, 257);
+ MEMCPY_CHECK (gdst, gsrc, 511);
+ MEMCPY_CHECK (gdst, gsrc, 512);
+ MEMCPY_CHECK (gdst, gsrc, 513);
+ MEMCPY_CHECK (gdst, gsrc, 767);
+ MEMCPY_CHECK (gdst, gsrc, 768);
+ MEMCPY_CHECK (gdst, gsrc, 769);
+ MEMCPY_CHECK (gdst, gsrc, 1023);
+ MEMCPY_CHECK (gdst, gsrc, 1024);
+ MEMCPY_CHECK (gdst, gsrc, 1025);
+ MEMCPY_CHECK (gdst, gsrc, 1279);
+ MEMCPY_CHECK (gdst, gsrc, 1280);
+ MEMCPY_CHECK (gdst, gsrc, 1281);
+ MEMCPY_CHECK (gdst, gsrc, 1535);
+ MEMCPY_CHECK (gdst, gsrc, 1536);
+ MEMCPY_CHECK (gdst, gsrc, 1537);
+
+ return 0;
+}
diff --git a/gcc/testsuite/gcc.target/s390/memset-2.c b/gcc/testsuite/gcc.target/s390/memset-2.c
new file mode 100644
index 0000000..e1af7fe
--- /dev/null
+++ b/gcc/testsuite/gcc.target/s390/memset-2.c
@@ -0,0 +1,92 @@
+/* Funtional setmem test. */
+
+/* { dg-do run } */
+/* { dg-options "-O3" } */
+
+#define MAX_LEN (8 * 1000)
+
+__attribute__ ((noinline))
+int
+check_mem (char *mem, int val, int len)
+{
+ int i;
+
+ if (mem[0] != 0x71)
+ __builtin_abort();
+ for (i = 1; i <= len; i++)
+ if (mem[i] != val)
+ __builtin_abort();
+ if (mem[len + 1] != 0x71 + (len + 1) % 4)
+ __builtin_abort();
+}
+
+__attribute__ ((noinline))
+void
+init_mem (char *mem)
+{
+ unsigned int *p;
+ int i;
+
+ p = (unsigned int *)mem;
+ for (i = 0; i < MAX_LEN / sizeof(unsigned int); i++)
+ p[i] = 0x71727374;
+}
+
+#define MEMSET_CHECK(VAL, SIZE) \
+ init_mem (mem1); \
+ __builtin_memset (mem1 + 1, 0, (SIZE)); \
+ check_mem (mem1, 0, SIZE); \
+ init_mem (mem2); \
+ __builtin_memset (mem2 + 1, (VAL), (SIZE)); \
+ check_mem (mem2, VAL, SIZE);
+
+char mem1[MAX_LEN + 2];
+char mem2[MAX_LEN + 2];
+
+int main(int argc, char **argv)
+{
+ int lens[] =
+ {
+ 256, 257, 258, 259,
+ 512, 513, 514, 515,
+ 768, 769, 770, 771,
+ 1024, 1025, 1026, 1027,
+ 1280, 1281, 1282, 1283,
+ -999
+ };
+ int t;
+
+ /* variable length */
+ for (t = 0; lens[t] != -999; t++)
+ {
+ MEMSET_CHECK (argc + 0x10, lens[t]);
+ }
+
+ /* constant length */
+ MEMSET_CHECK (argc + 0x10, 0);
+ MEMSET_CHECK (argc + 0x10, 1);
+ MEMSET_CHECK (argc + 0x10, 2);
+ MEMSET_CHECK (argc + 0x10, 3);
+ MEMSET_CHECK (argc + 0x10, 256);
+ MEMSET_CHECK (argc + 0x10, 257);
+ MEMSET_CHECK (argc + 0x10, 258);
+ MEMSET_CHECK (argc + 0x10, 259);
+ MEMSET_CHECK (argc + 0x10, 512);
+ MEMSET_CHECK (argc + 0x10, 513);
+ MEMSET_CHECK (argc + 0x10, 514);
+ MEMSET_CHECK (argc + 0x10, 515);
+ MEMSET_CHECK (argc + 0x10, 768);
+ MEMSET_CHECK (argc + 0x10, 769);
+ MEMSET_CHECK (argc + 0x10, 770);
+ MEMSET_CHECK (argc + 0x10, 771);
+ MEMSET_CHECK (argc + 0x10, 1024);
+ MEMSET_CHECK (argc + 0x10, 1025);
+ MEMSET_CHECK (argc + 0x10, 1026);
+ MEMSET_CHECK (argc + 0x10, 1027);
+ MEMSET_CHECK (argc + 0x10, 1280);
+ MEMSET_CHECK (argc + 0x10, 1281);
+ MEMSET_CHECK (argc + 0x10, 1282);
+ MEMSET_CHECK (argc + 0x10, 1283);
+
+ return 0;
+}