|
From: <sv...@va...> - 2006-08-17 01:39:07
|
Author: sewardj
Date: 2006-08-17 02:39:04 +0100 (Thu, 17 Aug 2006)
New Revision: 6007
Log:
Regtest for #127521 (amd64 cmpxchg8b/16b).
Added:
trunk/none/tests/amd64/bug127521-64.c
trunk/none/tests/amd64/bug127521-64.stderr.exp
trunk/none/tests/amd64/bug127521-64.stdout.exp
trunk/none/tests/amd64/bug127521-64.vgtest
Modified:
trunk/none/tests/amd64/Makefile.am
Modified: trunk/none/tests/amd64/Makefile.am
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/none/tests/amd64/Makefile.am 2006-08-16 17:51:28 UTC (rev 6006)
+++ trunk/none/tests/amd64/Makefile.am 2006-08-17 01:39:04 UTC (rev 6007)
@@ -5,6 +5,7 @@
INSN_TESTS =3D insn_basic insn_mmx insn_sse insn_sse2 insn_sse3 insn_fpu
=20
EXTRA_DIST =3D $(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 @@
=20
=20
check_PROGRAMS =3D \
+ bug127521-64 \
clc \
faultstatus fcmovnu fxtract $(INSN_TESTS) looper jrcxz smc1 shrld \
nibz_bennee_mmap
Added: trunk/none/tests/amd64/bug127521-64.c
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/none/tests/amd64/bug127521-64.c (rev 0)
+++ trunk/none/tests/amd64/bug127521-64.c 2006-08-17 01:39:04 UTC (rev 60=
07)
@@ -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,=20
+ ULong* memHiOut, ULong* memLoOut,
+ ULong* zOut,
+ /*IN*/
+ ULong rdxIn, ULong raxIn,=20
+ ULong memHiIn, ULong memLoIn,
+ ULong rcxIn, ULong rbxIn )
+{
+ UInt mem[2];
+ ULong block[6];
+ mem[0] =3D (UInt)memLoIn;
+ mem[1] =3D (UInt)memHiIn;
+ block[0] =3D rdxIn;
+ block[1] =3D raxIn;
+ block[2] =3D rcxIn;
+ block[3] =3D rbxIn;
+ block[4] =3D (ULong)&mem[0];
+ block[5] =3D ~(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",=20
+ "cc", "memory" );
+ *rdxOut =3D block[0];
+ *raxOut =3D block[1];
+ *memLoOut =3D (ULong)mem[0];
+ *memHiOut =3D (ULong)mem[1];
+ *zOut =3D 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=3D%llx:%llx mem=3D%llx:%llx c:b=3D%llx:%llx "
+ "-> z=3D%lld d:a=3D%llx:%llx mem=3D%llx:%llx\n",
+ d,a, mHi,mLo, c,b, zz, dd,aa, mmHi,mmLo );
+}
+
+void do_cmpxchg16b ( /*OUT*/
+ ULong* rdxOut, ULong* raxOut,=20
+ ULong* memHiOut, ULong* memLoOut,
+ ULong* zOut,
+ /*IN*/
+ ULong rdxIn, ULong raxIn,=20
+ ULong memHiIn, ULong memLoIn,
+ ULong rcxIn, ULong rbxIn )
+{
+ ULong mem[2];
+ ULong block[6];
+ mem[0] =3D memLoIn;
+ mem[1] =3D memHiIn;
+ block[0] =3D rdxIn;
+ block[1] =3D raxIn;
+ block[2] =3D rcxIn;
+ block[3] =3D rbxIn;
+ block[4] =3D (ULong)&mem[0];
+ block[5] =3D ~(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",=20
+ "cc", "memory" );
+ *rdxOut =3D block[0];
+ *raxOut =3D block[1];
+ *memLoOut =3D mem[0];
+ *memHiOut =3D mem[1];
+ *zOut =3D 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=3D%llx:%llx mem=3D%llx:%llx c:b=3D%llx:%llx "
+ "-> z=3D%lld d:a=3D%llx:%llx mem=3D%llx:%llx\n",
+ d,a, mHi,mLo, c,b, zz, dd,aa, mmHi,mmLo );
+}
+
+int main(void)
+{
+ ULong z =3D 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;
+}
+
Added: trunk/none/tests/amd64/bug127521-64.stderr.exp
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/none/tests/amd64/bug127521-64.stderr.exp =
(rev 0)
+++ trunk/none/tests/amd64/bug127521-64.stderr.exp 2006-08-17 01:39:04 UT=
C (rev 6007)
@@ -0,0 +1,2 @@
+
+
Added: trunk/none/tests/amd64/bug127521-64.stdout.exp
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/none/tests/amd64/bug127521-64.stdout.exp =
(rev 0)
+++ trunk/none/tests/amd64/bug127521-64.stdout.exp 2006-08-17 01:39:04 UT=
C (rev 6007)
@@ -0,0 +1,24 @@
+ Q d:a=3D0:1 mem=3D5:4 c:b=3D3:2 -> z=3D0 d:a=3D5:4 mem=3D5:4
+ Q d:a=3D0:1 mem=3D0:1 c:b=3D3:2 -> z=3D1 d:a=3D0:1 mem=3D3:2
+ Q d:a=3D0:1 mem=3D0:4 c:b=3D3:2 -> z=3D0 d:a=3D0:4 mem=3D0:4
+ Q d:a=3D0:1 mem=3D0:0 c:b=3D3:2 -> z=3D0 d:a=3D0:0 mem=3D0:0
+ Q d:a=3D0:1 mem=3D5:0 c:b=3D3:2 -> z=3D0 d:a=3D5:0 mem=3D5:0
+ Q d:a=3D0:1 mem=3D1:1 c:b=3D3:2 -> z=3D0 d:a=3D1:1 mem=3D1:1
+ Q d:a=3Ddeadbeef00000000:deadbeef00000001 mem=3Ddeadbeef00000005:deadbe=
ef00000004 c:b=3Ddeadbeef00000003:deadbeef00000002 -> z=3D0 d:a=3D5:4 mem=
=3D5:4
+ Q d:a=3Ddeadbeef00000000:deadbeef00000001 mem=3Ddeadbeef00000000:deadbe=
ef00000001 c:b=3Ddeadbeef00000003:deadbeef00000002 -> z=3D1 d:a=3Ddeadbee=
f00000000:deadbeef00000001 mem=3D3:2
+ Q d:a=3Ddeadbeef00000000:deadbeef00000001 mem=3Ddeadbeef00000000:deadbe=
ef00000004 c:b=3Ddeadbeef00000003:deadbeef00000002 -> z=3D0 d:a=3D0:4 mem=
=3D0:4
+ Q d:a=3Ddeadbeef00000000:deadbeef00000001 mem=3Ddeadbeef00000000:deadbe=
ef00000000 c:b=3Ddeadbeef00000003:deadbeef00000002 -> z=3D0 d:a=3D0:0 mem=
=3D0:0
+ Q d:a=3Ddeadbeef00000000:deadbeef00000001 mem=3Ddeadbeef00000005:deadbe=
ef00000000 c:b=3Ddeadbeef00000003:deadbeef00000002 -> z=3D0 d:a=3D5:0 mem=
=3D5:0
+ Q d:a=3Ddeadbeef00000000:deadbeef00000001 mem=3Ddeadbeef00000001:deadbe=
ef00000001 c:b=3Ddeadbeef00000003:deadbeef00000002 -> z=3D0 d:a=3D1:1 mem=
=3D1:1
+QQ d:a=3D0:1 mem=3D5:4 c:b=3D3:2 -> z=3D0 d:a=3D5:4 mem=3D5:4
+QQ d:a=3D0:1 mem=3D0:1 c:b=3D3:2 -> z=3D1 d:a=3D0:1 mem=3D3:2
+QQ d:a=3D0:1 mem=3D0:4 c:b=3D3:2 -> z=3D0 d:a=3D0:4 mem=3D0:4
+QQ d:a=3D0:1 mem=3D0:0 c:b=3D3:2 -> z=3D0 d:a=3D0:0 mem=3D0:0
+QQ d:a=3D0:1 mem=3D5:0 c:b=3D3:2 -> z=3D0 d:a=3D5:0 mem=3D5:0
+QQ d:a=3D0:1 mem=3D1:1 c:b=3D3:2 -> z=3D0 d:a=3D1:1 mem=3D1:1
+QQ d:a=3Ddeadbeef00000000:deadbeef00000001 mem=3Ddeadbeef00000005:deadbe=
ef00000004 c:b=3Ddeadbeef00000003:deadbeef00000002 -> z=3D0 d:a=3Ddeadbee=
f00000005:deadbeef00000004 mem=3Ddeadbeef00000005:deadbeef00000004
+QQ d:a=3Ddeadbeef00000000:deadbeef00000001 mem=3Ddeadbeef00000000:deadbe=
ef00000001 c:b=3Ddeadbeef00000003:deadbeef00000002 -> z=3D1 d:a=3Ddeadbee=
f00000000:deadbeef00000001 mem=3Ddeadbeef00000003:deadbeef00000002
+QQ d:a=3Ddeadbeef00000000:deadbeef00000001 mem=3Ddeadbeef00000000:deadbe=
ef00000004 c:b=3Ddeadbeef00000003:deadbeef00000002 -> z=3D0 d:a=3Ddeadbee=
f00000000:deadbeef00000004 mem=3Ddeadbeef00000000:deadbeef00000004
+QQ d:a=3Ddeadbeef00000000:deadbeef00000001 mem=3Ddeadbeef00000000:deadbe=
ef00000000 c:b=3Ddeadbeef00000003:deadbeef00000002 -> z=3D0 d:a=3Ddeadbee=
f00000000:deadbeef00000000 mem=3Ddeadbeef00000000:deadbeef00000000
+QQ d:a=3Ddeadbeef00000000:deadbeef00000001 mem=3Ddeadbeef00000005:deadbe=
ef00000000 c:b=3Ddeadbeef00000003:deadbeef00000002 -> z=3D0 d:a=3Ddeadbee=
f00000005:deadbeef00000000 mem=3Ddeadbeef00000005:deadbeef00000000
+QQ d:a=3Ddeadbeef00000000:deadbeef00000001 mem=3Ddeadbeef00000001:deadbe=
ef00000001 c:b=3Ddeadbeef00000003:deadbeef00000002 -> z=3D0 d:a=3Ddeadbee=
f00000001:deadbeef00000001 mem=3Ddeadbeef00000001:deadbeef00000001
Added: trunk/none/tests/amd64/bug127521-64.vgtest
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
--- trunk/none/tests/amd64/bug127521-64.vgtest (r=
ev 0)
+++ trunk/none/tests/amd64/bug127521-64.vgtest 2006-08-17 01:39:04 UTC (r=
ev 6007)
@@ -0,0 +1 @@
+prog: bug127521-64
|