]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Add test cases for XADD reg,reg. (Nicolas Sauzede, nicolas.sauzede@st.com).
authorJulian Seward <jseward@acm.org>
Mon, 10 May 2010 20:53:28 +0000 (20:53 +0000)
committerJulian Seward <jseward@acm.org>
Mon, 10 May 2010 20:53:28 +0000 (20:53 +0000)
See #195662.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11127

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

index 51ec345ce2c3202b1d99572cd8bbdbf2879cf356..a3212138d3a3a200abff860589756522e468e6f3 100644 (file)
@@ -48,7 +48,8 @@ EXTRA_DIST = \
        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 @@ check_PROGRAMS = \
        rcl-amd64 \
        redundantRexW \
        smc1 \
-       nibz_bennee_mmap
+       nibz_bennee_mmap \
+       xadd
 if BUILD_SSSE3_TESTS
  check_PROGRAMS += ssse3_misaligned
 endif
diff --git a/none/tests/amd64/xadd.c b/none/tests/amd64/xadd.c
new file mode 100644 (file)
index 0000000..38d4f20
--- /dev/null
@@ -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;
+}
diff --git a/none/tests/amd64/xadd.stderr.exp b/none/tests/amd64/xadd.stderr.exp
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/none/tests/amd64/xadd.stdout.exp b/none/tests/amd64/xadd.stdout.exp
new file mode 100644 (file)
index 0000000..2e9ba47
--- /dev/null
@@ -0,0 +1 @@
+success
diff --git a/none/tests/amd64/xadd.vgtest b/none/tests/amd64/xadd.vgtest
new file mode 100644 (file)
index 0000000..2cb1bee
--- /dev/null
@@ -0,0 +1,2 @@
+prog: xadd
+vgopts: -q
index 47d6a3492a0370bc9ad34c861c29faaf6b7f839c..9428b772eb89abf4e94d7388a0e12ec8f96b297c 100644 (file)
@@ -53,7 +53,8 @@ EXTRA_DIST = \
        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 @@ check_PROGRAMS = \
        sbbmisc \
        smc1 \
        x86locked \
-       yield
+       yield \
+       xadd
 if BUILD_SSSE3_TESTS
    check_PROGRAMS += ssse3_misaligned
 endif
diff --git a/none/tests/x86/xadd.c b/none/tests/x86/xadd.c
new file mode 100644 (file)
index 0000000..38d4f20
--- /dev/null
@@ -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;
+}
diff --git a/none/tests/x86/xadd.stderr.exp b/none/tests/x86/xadd.stderr.exp
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/none/tests/x86/xadd.stdout.exp b/none/tests/x86/xadd.stdout.exp
new file mode 100644 (file)
index 0000000..2e9ba47
--- /dev/null
@@ -0,0 +1 @@
+success
diff --git a/none/tests/x86/xadd.vgtest b/none/tests/x86/xadd.vgtest
new file mode 100644 (file)
index 0000000..2cb1bee
--- /dev/null
@@ -0,0 +1,2 @@
+prog: xadd
+vgopts: -q