From: Julian Seward Date: Thu, 17 Aug 2006 01:39:04 +0000 (+0000) Subject: Regtest for #127521 (amd64 cmpxchg8b/16b). X-Git-Tag: svn/VALGRIND_3_3_0~702 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b5db7e3510d88ab40864da17d1e84ed7fa1ff0e7;p=thirdparty%2Fvalgrind.git Regtest for #127521 (amd64 cmpxchg8b/16b). git-svn-id: svn://svn.valgrind.org/valgrind/trunk@6007 --- diff --git a/none/tests/amd64/Makefile.am b/none/tests/amd64/Makefile.am index 3960461a4b..8cd9eaad39 100644 --- a/none/tests/amd64/Makefile.am +++ b/none/tests/amd64/Makefile.am @@ -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 index 0000000000..db815cd634 --- /dev/null +++ b/none/tests/amd64/bug127521-64.c @@ -0,0 +1,155 @@ +#include +#include + +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 index 0000000000..139597f9cb --- /dev/null +++ b/none/tests/amd64/bug127521-64.stderr.exp @@ -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 index 0000000000..c344dcdee3 --- /dev/null +++ b/none/tests/amd64/bug127521-64.stdout.exp @@ -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 index 0000000000..b8a098695c --- /dev/null +++ b/none/tests/amd64/bug127521-64.vgtest @@ -0,0 +1 @@ +prog: bug127521-64