|
From: <sv...@va...> - 2010-05-10 20:53:36
|
Author: sewardj
Date: 2010-05-10 21:53:28 +0100 (Mon, 10 May 2010)
New Revision: 11127
Log:
Add test cases for XADD reg,reg. (Nicolas Sauzede, nic...@st...).
See #195662.
Added:
trunk/none/tests/amd64/xadd.c
trunk/none/tests/amd64/xadd.stderr.exp
trunk/none/tests/amd64/xadd.stdout.exp
trunk/none/tests/amd64/xadd.vgtest
trunk/none/tests/x86/xadd.c
trunk/none/tests/x86/xadd.stderr.exp
trunk/none/tests/x86/xadd.stdout.exp
trunk/none/tests/x86/xadd.vgtest
Modified:
trunk/none/tests/amd64/Makefile.am
trunk/none/tests/x86/Makefile.am
Modified: trunk/none/tests/amd64/Makefile.am
===================================================================
--- trunk/none/tests/amd64/Makefile.am 2010-05-10 20:06:08 UTC (rev 11126)
+++ trunk/none/tests/amd64/Makefile.am 2010-05-10 20:53:28 UTC (rev 11127)
@@ -48,7 +48,8 @@
ssse3_misaligned.vgtest \
ssse3_misaligned.c \
slahf-amd64.stderr.exp slahf-amd64.stdout.exp \
- slahf-amd64.vgtest
+ slahf-amd64.vgtest \
+ xadd.stderr.exp xadd.stdout.exp xadd.vgtest
check_PROGRAMS = \
amd64locked \
@@ -58,7 +59,8 @@
rcl-amd64 \
redundantRexW \
smc1 \
- nibz_bennee_mmap
+ nibz_bennee_mmap \
+ xadd
if BUILD_SSSE3_TESTS
check_PROGRAMS += ssse3_misaligned
endif
Added: trunk/none/tests/amd64/xadd.c
===================================================================
--- trunk/none/tests/amd64/xadd.c (rev 0)
+++ trunk/none/tests/amd64/xadd.c 2010-05-10 20:53:28 UTC (rev 11127)
@@ -0,0 +1,51 @@
+
+#include "config.h"
+#include <stdio.h>
+#include <assert.h>
+
+/* Simple test program, no race.
+ Tests the 'xadd' exchange-and-add instruction with {r,r} operands, which is rarely generated by compilers. */
+
+#undef PLAT_x86_linux
+#undef PLAT_amd64_linux
+#undef PLAT_ppc32_linux
+#undef PLAT_ppc64_linux
+#undef PLAT_ppc32_aix5
+#undef PLAT_ppc64_aix5
+
+#if !defined(_AIX) && defined(__i386__)
+# define PLAT_x86_linux 1
+#elif !defined(_AIX) && defined(__x86_64__)
+# define PLAT_amd64_linux 1
+#endif
+
+
+#if defined(PLAT_amd64_linux) || defined(PLAT_x86_linux)
+# define XADD_R_R(_addr,_lval) \
+ __asm__ __volatile__( \
+ "xadd %1, %0" \
+ : /*out*/ "=r"(_lval),"=r"(_addr) \
+ : /*in*/ "0"(_lval),"1"(_addr) \
+ : "flags" \
+ )
+#else
+# error "Unsupported architecture"
+#endif
+
+int main ( void )
+{
+ long d = 20, s = 2;
+ long xadd_r_r_res;
+#define XADD_R_R_RES 42
+
+ XADD_R_R(s, d);
+ xadd_r_r_res = s + d;
+ assert(xadd_r_r_res == XADD_R_R_RES);
+
+ if (xadd_r_r_res == XADD_R_R_RES)
+ printf("success\n");
+ else
+ printf("failure\n");
+
+ return xadd_r_r_res;
+}
Added: trunk/none/tests/amd64/xadd.stderr.exp
===================================================================
Added: trunk/none/tests/amd64/xadd.stdout.exp
===================================================================
--- trunk/none/tests/amd64/xadd.stdout.exp (rev 0)
+++ trunk/none/tests/amd64/xadd.stdout.exp 2010-05-10 20:53:28 UTC (rev 11127)
@@ -0,0 +1 @@
+success
Added: trunk/none/tests/amd64/xadd.vgtest
===================================================================
--- trunk/none/tests/amd64/xadd.vgtest (rev 0)
+++ trunk/none/tests/amd64/xadd.vgtest 2010-05-10 20:53:28 UTC (rev 11127)
@@ -0,0 +1,2 @@
+prog: xadd
+vgopts: -q
Modified: trunk/none/tests/x86/Makefile.am
===================================================================
--- trunk/none/tests/x86/Makefile.am 2010-05-10 20:06:08 UTC (rev 11126)
+++ trunk/none/tests/x86/Makefile.am 2010-05-10 20:53:28 UTC (rev 11127)
@@ -53,7 +53,8 @@
ssse3_misaligned.stderr.exp ssse3_misaligned.stdout.exp \
ssse3_misaligned.vgtest ssse3_misaligned.c \
x86locked.vgtest x86locked.stdout.exp x86locked.stderr.exp \
- yield.stderr.exp yield.stdout.exp yield.disabled
+ yield.stderr.exp yield.stdout.exp yield.disabled \
+ xadd.stdout.exp xadd.stderr.exp xadd.vgtest
check_PROGRAMS = \
badseg \
@@ -84,7 +85,8 @@
sbbmisc \
smc1 \
x86locked \
- yield
+ yield \
+ xadd
if BUILD_SSSE3_TESTS
check_PROGRAMS += ssse3_misaligned
endif
Added: trunk/none/tests/x86/xadd.c
===================================================================
--- trunk/none/tests/x86/xadd.c (rev 0)
+++ trunk/none/tests/x86/xadd.c 2010-05-10 20:53:28 UTC (rev 11127)
@@ -0,0 +1,51 @@
+
+#include "config.h"
+#include <stdio.h>
+#include <assert.h>
+
+/* Simple test program, no race.
+ Tests the 'xadd' exchange-and-add instruction with {r,r} operands, which is rarely generated by compilers. */
+
+#undef PLAT_x86_linux
+#undef PLAT_amd64_linux
+#undef PLAT_ppc32_linux
+#undef PLAT_ppc64_linux
+#undef PLAT_ppc32_aix5
+#undef PLAT_ppc64_aix5
+
+#if !defined(_AIX) && defined(__i386__)
+# define PLAT_x86_linux 1
+#elif !defined(_AIX) && defined(__x86_64__)
+# define PLAT_amd64_linux 1
+#endif
+
+
+#if defined(PLAT_amd64_linux) || defined(PLAT_x86_linux)
+# define XADD_R_R(_addr,_lval) \
+ __asm__ __volatile__( \
+ "xadd %1, %0" \
+ : /*out*/ "=r"(_lval),"=r"(_addr) \
+ : /*in*/ "0"(_lval),"1"(_addr) \
+ : "flags" \
+ )
+#else
+# error "Unsupported architecture"
+#endif
+
+int main ( void )
+{
+ long d = 20, s = 2;
+ long xadd_r_r_res;
+#define XADD_R_R_RES 42
+
+ XADD_R_R(s, d);
+ xadd_r_r_res = s + d;
+ assert(xadd_r_r_res == XADD_R_R_RES);
+
+ if (xadd_r_r_res == XADD_R_R_RES)
+ printf("success\n");
+ else
+ printf("failure\n");
+
+ return xadd_r_r_res;
+}
Added: trunk/none/tests/x86/xadd.stderr.exp
===================================================================
Added: trunk/none/tests/x86/xadd.stdout.exp
===================================================================
--- trunk/none/tests/x86/xadd.stdout.exp (rev 0)
+++ trunk/none/tests/x86/xadd.stdout.exp 2010-05-10 20:53:28 UTC (rev 11127)
@@ -0,0 +1 @@
+success
Added: trunk/none/tests/x86/xadd.vgtest
===================================================================
--- trunk/none/tests/x86/xadd.vgtest (rev 0)
+++ trunk/none/tests/x86/xadd.vgtest 2010-05-10 20:53:28 UTC (rev 11127)
@@ -0,0 +1,2 @@
+prog: xadd
+vgopts: -q
|