]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Regtest for #127521 (amd64 cmpxchg8b/16b).
authorJulian Seward <jseward@acm.org>
Thu, 17 Aug 2006 01:39:04 +0000 (01:39 +0000)
committerJulian Seward <jseward@acm.org>
Thu, 17 Aug 2006 01:39:04 +0000 (01:39 +0000)
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@6007

none/tests/amd64/Makefile.am
none/tests/amd64/bug127521-64.c [new file with mode: 0644]
none/tests/amd64/bug127521-64.stderr.exp [new file with mode: 0644]
none/tests/amd64/bug127521-64.stdout.exp [new file with mode: 0644]
none/tests/amd64/bug127521-64.vgtest [new file with mode: 0644]

index 3960461a4bc3cb03eb33fb1973d5333005ad5625..8cd9eaad3951b97a9561125a4e22c7d677277052 100644 (file)
@@ -5,6 +5,7 @@ CLEANFILES = $(addsuffix .c,$(INSN_TESTS))
 INSN_TESTS = insn_basic insn_mmx insn_sse insn_sse2 insn_sse3 insn_fpu
 
 EXTRA_DIST = $(noinst_SCRIPTS) \
+       bug127521-64.vgtest bug127521-64.stdout.exp bug127521-64.stderr.exp \
        clc.vgtest clc.stdout.exp clc.stderr.exp \
        faultstatus.disabled faultstatus.stderr.exp \
        fcmovnu.vgtest fcmovnu.stderr.exp fcmovnu.stdout.exp \
@@ -21,6 +22,7 @@ EXTRA_DIST = $(noinst_SCRIPTS) \
 
 
 check_PROGRAMS = \
+       bug127521-64 \
        clc \
        faultstatus fcmovnu fxtract $(INSN_TESTS) looper jrcxz smc1 shrld \
        nibz_bennee_mmap
diff --git a/none/tests/amd64/bug127521-64.c b/none/tests/amd64/bug127521-64.c
new file mode 100644 (file)
index 0000000..db815cd
--- /dev/null
@@ -0,0 +1,155 @@
+#include <stdlib.h>
+#include <stdio.h>
+
+typedef unsigned int UInt;
+typedef unsigned long long int ULong;
+
+void do_cmpxchg8b ( /*OUT*/
+                    ULong* rdxOut,   ULong* raxOut, 
+                   ULong* memHiOut, ULong* memLoOut,
+                    ULong* zOut,
+                    /*IN*/
+                    ULong rdxIn,   ULong raxIn, 
+                    ULong memHiIn, ULong memLoIn,
+                    ULong rcxIn,   ULong rbxIn )
+{
+   UInt mem[2];
+   ULong block[6];
+   mem[0] = (UInt)memLoIn;
+   mem[1] = (UInt)memHiIn;
+   block[0] = rdxIn;
+   block[1] = raxIn;
+   block[2] = rcxIn;
+   block[3] = rbxIn;
+   block[4] = (ULong)&mem[0];
+   block[5] = ~(0ULL);
+   __asm__ __volatile__(
+          "movq %0,%%r11\n"
+        "\tmovq  0(%%r11),%%rdx\n"
+        "\tmovq  8(%%r11),%%rax\n"
+        "\tmovq 16(%%r11),%%rcx\n"
+        "\tmovq 24(%%r11),%%rbx\n"
+        "\tmovq 32(%%r11),%%r10\n"
+        "\tlock cmpxchg8b (%%r10)\n"
+        "\tmovabsq $0,%%r10\n"
+        "\tsetz %%r10b\n"
+        "\tmovq %%r10,40(%%r11)\n"
+        "\tmovq %%rdx,0(%%r11)\n"
+        "\tmovq %%rax,8(%%r11)\n"
+         : /*out*/
+         : /*in*/ "r"(&block[0])
+         : /*trash*/ "%r11", "%r10", "%rax", "%rbx", "%rcx", "%rdx", 
+                      "cc", "memory" );
+    *rdxOut = block[0];
+    *raxOut = block[1];
+    *memLoOut = (ULong)mem[0];
+    *memHiOut = (ULong)mem[1];
+    *zOut = block[5];
+}
+
+void try8b ( ULong d, ULong a, ULong mHi, ULong mLo, ULong c, ULong b )
+{
+   ULong dd, aa, mmHi, mmLo, zz;
+   do_cmpxchg8b( &dd, &aa, &mmHi, &mmLo, &zz,
+                d,a,mHi,mLo,c,b);
+   printf(" Q d:a=%llx:%llx mem=%llx:%llx c:b=%llx:%llx "
+          "-> z=%lld d:a=%llx:%llx mem=%llx:%llx\n",
+         d,a, mHi,mLo, c,b, zz, dd,aa, mmHi,mmLo );
+}
+
+void do_cmpxchg16b ( /*OUT*/
+                     ULong* rdxOut,   ULong* raxOut, 
+                    ULong* memHiOut, ULong* memLoOut,
+                     ULong* zOut,
+                     /*IN*/
+                     ULong rdxIn,   ULong raxIn, 
+                     ULong memHiIn, ULong memLoIn,
+                     ULong rcxIn,   ULong rbxIn )
+{
+   ULong mem[2];
+   ULong block[6];
+   mem[0] = memLoIn;
+   mem[1] = memHiIn;
+   block[0] = rdxIn;
+   block[1] = raxIn;
+   block[2] = rcxIn;
+   block[3] = rbxIn;
+   block[4] = (ULong)&mem[0];
+   block[5] = ~(0ULL);
+   __asm__ __volatile__(
+          "movq %0,%%r11\n"
+        "\tmovq  0(%%r11),%%rdx\n"
+        "\tmovq  8(%%r11),%%rax\n"
+        "\tmovq 16(%%r11),%%rcx\n"
+        "\tmovq 24(%%r11),%%rbx\n"
+        "\tmovq 32(%%r11),%%r10\n"
+        "\tlock cmpxchg16b (%%r10)\n"
+        "\tmovabsq $0,%%r10\n"
+        "\tsetz %%r10b\n"
+        "\tmovq %%r10,40(%%r11)\n"
+        "\tmovq %%rdx,0(%%r11)\n"
+        "\tmovq %%rax,8(%%r11)\n"
+         : /*out*/
+         : /*in*/ "r"(&block[0])
+         : /*trash*/ "%r11", "%r10", "%rax", "%rbx", "%rcx", "%rdx", 
+                      "cc", "memory" );
+    *rdxOut = block[0];
+    *raxOut = block[1];
+    *memLoOut = mem[0];
+    *memHiOut = mem[1];
+    *zOut = block[5];
+}
+
+void try16b ( ULong d, ULong a, ULong mHi, ULong mLo, ULong c, ULong b )
+{
+   ULong dd, aa, mmHi, mmLo, zz;
+   do_cmpxchg16b( &dd, &aa, &mmHi, &mmLo, &zz,
+                 d,a,mHi,mLo,c,b);
+   printf("QQ d:a=%llx:%llx mem=%llx:%llx c:b=%llx:%llx "
+          "-> z=%lld d:a=%llx:%llx mem=%llx:%llx\n",
+         d,a, mHi,mLo, c,b, zz, dd,aa, mmHi,mmLo );
+}
+
+int main(void)
+{
+   ULong z = 0xDEADBEEF00000000ULL;
+
+   try8b( 0,1, 5,4, 3,2 );
+   try8b( 0,1, 0,1, 3,2 );
+
+   try8b( 0,1, 0,4, 3,2 );
+   try8b( 0,1, 0,0, 3,2 );
+
+   try8b( 0,1, 5,0, 3,2 );
+   try8b( 0,1, 1,1, 3,2 );
+
+   try8b( 0+z,1+z, 5+z,4+z, 3+z,2+z );
+   try8b( 0+z,1+z, 0+z,1+z, 3+z,2+z );
+
+   try8b( 0+z,1+z, 0+z,4+z, 3+z,2+z );
+   try8b( 0+z,1+z, 0+z,0+z, 3+z,2+z );
+
+   try8b( 0+z,1+z, 5+z,0+z, 3+z,2+z );
+   try8b( 0+z,1+z, 1+z,1+z, 3+z,2+z );
+
+   try16b( 0,1, 5,4, 3,2 );
+   try16b( 0,1, 0,1, 3,2 );
+
+   try16b( 0,1, 0,4, 3,2 );
+   try16b( 0,1, 0,0, 3,2 );
+
+   try16b( 0,1, 5,0, 3,2 );
+   try16b( 0,1, 1,1, 3,2 );
+
+   try16b( 0+z,1+z, 5+z,4+z, 3+z,2+z );
+   try16b( 0+z,1+z, 0+z,1+z, 3+z,2+z );
+
+   try16b( 0+z,1+z, 0+z,4+z, 3+z,2+z );
+   try16b( 0+z,1+z, 0+z,0+z, 3+z,2+z );
+
+   try16b( 0+z,1+z, 5+z,0+z, 3+z,2+z );
+   try16b( 0+z,1+z, 1+z,1+z, 3+z,2+z );
+
+   return 0;
+}
+
diff --git a/none/tests/amd64/bug127521-64.stderr.exp b/none/tests/amd64/bug127521-64.stderr.exp
new file mode 100644 (file)
index 0000000..139597f
--- /dev/null
@@ -0,0 +1,2 @@
+
+
diff --git a/none/tests/amd64/bug127521-64.stdout.exp b/none/tests/amd64/bug127521-64.stdout.exp
new file mode 100644 (file)
index 0000000..c344dcd
--- /dev/null
@@ -0,0 +1,24 @@
+ Q d:a=0:1 mem=5:4 c:b=3:2 -> z=0 d:a=5:4 mem=5:4
+ Q d:a=0:1 mem=0:1 c:b=3:2 -> z=1 d:a=0:1 mem=3:2
+ Q d:a=0:1 mem=0:4 c:b=3:2 -> z=0 d:a=0:4 mem=0:4
+ Q d:a=0:1 mem=0:0 c:b=3:2 -> z=0 d:a=0:0 mem=0:0
+ Q d:a=0:1 mem=5:0 c:b=3:2 -> z=0 d:a=5:0 mem=5:0
+ Q d:a=0:1 mem=1:1 c:b=3:2 -> z=0 d:a=1:1 mem=1:1
+ Q d:a=deadbeef00000000:deadbeef00000001 mem=deadbeef00000005:deadbeef00000004 c:b=deadbeef00000003:deadbeef00000002 -> z=0 d:a=5:4 mem=5:4
+ Q d:a=deadbeef00000000:deadbeef00000001 mem=deadbeef00000000:deadbeef00000001 c:b=deadbeef00000003:deadbeef00000002 -> z=1 d:a=deadbeef00000000:deadbeef00000001 mem=3:2
+ Q d:a=deadbeef00000000:deadbeef00000001 mem=deadbeef00000000:deadbeef00000004 c:b=deadbeef00000003:deadbeef00000002 -> z=0 d:a=0:4 mem=0:4
+ Q d:a=deadbeef00000000:deadbeef00000001 mem=deadbeef00000000:deadbeef00000000 c:b=deadbeef00000003:deadbeef00000002 -> z=0 d:a=0:0 mem=0:0
+ Q d:a=deadbeef00000000:deadbeef00000001 mem=deadbeef00000005:deadbeef00000000 c:b=deadbeef00000003:deadbeef00000002 -> z=0 d:a=5:0 mem=5:0
+ Q d:a=deadbeef00000000:deadbeef00000001 mem=deadbeef00000001:deadbeef00000001 c:b=deadbeef00000003:deadbeef00000002 -> z=0 d:a=1:1 mem=1:1
+QQ d:a=0:1 mem=5:4 c:b=3:2 -> z=0 d:a=5:4 mem=5:4
+QQ d:a=0:1 mem=0:1 c:b=3:2 -> z=1 d:a=0:1 mem=3:2
+QQ d:a=0:1 mem=0:4 c:b=3:2 -> z=0 d:a=0:4 mem=0:4
+QQ d:a=0:1 mem=0:0 c:b=3:2 -> z=0 d:a=0:0 mem=0:0
+QQ d:a=0:1 mem=5:0 c:b=3:2 -> z=0 d:a=5:0 mem=5:0
+QQ d:a=0:1 mem=1:1 c:b=3:2 -> z=0 d:a=1:1 mem=1:1
+QQ d:a=deadbeef00000000:deadbeef00000001 mem=deadbeef00000005:deadbeef00000004 c:b=deadbeef00000003:deadbeef00000002 -> z=0 d:a=deadbeef00000005:deadbeef00000004 mem=deadbeef00000005:deadbeef00000004
+QQ d:a=deadbeef00000000:deadbeef00000001 mem=deadbeef00000000:deadbeef00000001 c:b=deadbeef00000003:deadbeef00000002 -> z=1 d:a=deadbeef00000000:deadbeef00000001 mem=deadbeef00000003:deadbeef00000002
+QQ d:a=deadbeef00000000:deadbeef00000001 mem=deadbeef00000000:deadbeef00000004 c:b=deadbeef00000003:deadbeef00000002 -> z=0 d:a=deadbeef00000000:deadbeef00000004 mem=deadbeef00000000:deadbeef00000004
+QQ d:a=deadbeef00000000:deadbeef00000001 mem=deadbeef00000000:deadbeef00000000 c:b=deadbeef00000003:deadbeef00000002 -> z=0 d:a=deadbeef00000000:deadbeef00000000 mem=deadbeef00000000:deadbeef00000000
+QQ d:a=deadbeef00000000:deadbeef00000001 mem=deadbeef00000005:deadbeef00000000 c:b=deadbeef00000003:deadbeef00000002 -> z=0 d:a=deadbeef00000005:deadbeef00000000 mem=deadbeef00000005:deadbeef00000000
+QQ d:a=deadbeef00000000:deadbeef00000001 mem=deadbeef00000001:deadbeef00000001 c:b=deadbeef00000003:deadbeef00000002 -> z=0 d:a=deadbeef00000001:deadbeef00000001 mem=deadbeef00000001:deadbeef00000001
diff --git a/none/tests/amd64/bug127521-64.vgtest b/none/tests/amd64/bug127521-64.vgtest
new file mode 100644 (file)
index 0000000..b8a0986
--- /dev/null
@@ -0,0 +1 @@
+prog: bug127521-64