From 06b158b13bb35323e51b560d536ad0302e7e9f40 Mon Sep 17 00:00:00 2001 From: Julian Seward Date: Mon, 10 May 2010 20:53:28 +0000 Subject: [PATCH] Add test cases for XADD reg,reg. (Nicolas Sauzede, nicolas.sauzede@st.com). See #195662. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@11127 --- none/tests/amd64/Makefile.am | 6 ++-- none/tests/amd64/xadd.c | 51 ++++++++++++++++++++++++++++++++ none/tests/amd64/xadd.stderr.exp | 0 none/tests/amd64/xadd.stdout.exp | 1 + none/tests/amd64/xadd.vgtest | 2 ++ none/tests/x86/Makefile.am | 6 ++-- none/tests/x86/xadd.c | 51 ++++++++++++++++++++++++++++++++ none/tests/x86/xadd.stderr.exp | 0 none/tests/x86/xadd.stdout.exp | 1 + none/tests/x86/xadd.vgtest | 2 ++ 10 files changed, 116 insertions(+), 4 deletions(-) create mode 100644 none/tests/amd64/xadd.c create mode 100644 none/tests/amd64/xadd.stderr.exp create mode 100644 none/tests/amd64/xadd.stdout.exp create mode 100644 none/tests/amd64/xadd.vgtest create mode 100644 none/tests/x86/xadd.c create mode 100644 none/tests/x86/xadd.stderr.exp create mode 100644 none/tests/x86/xadd.stdout.exp create mode 100644 none/tests/x86/xadd.vgtest diff --git a/none/tests/amd64/Makefile.am b/none/tests/amd64/Makefile.am index 51ec345ce2..a3212138d3 100644 --- a/none/tests/amd64/Makefile.am +++ b/none/tests/amd64/Makefile.am @@ -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 index 0000000000..38d4f20a53 --- /dev/null +++ b/none/tests/amd64/xadd.c @@ -0,0 +1,51 @@ + +#include "config.h" +#include +#include + +/* 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 index 0000000000..e69de29bb2 diff --git a/none/tests/amd64/xadd.stdout.exp b/none/tests/amd64/xadd.stdout.exp new file mode 100644 index 0000000000..2e9ba477f8 --- /dev/null +++ b/none/tests/amd64/xadd.stdout.exp @@ -0,0 +1 @@ +success diff --git a/none/tests/amd64/xadd.vgtest b/none/tests/amd64/xadd.vgtest new file mode 100644 index 0000000000..2cb1bee4a3 --- /dev/null +++ b/none/tests/amd64/xadd.vgtest @@ -0,0 +1,2 @@ +prog: xadd +vgopts: -q diff --git a/none/tests/x86/Makefile.am b/none/tests/x86/Makefile.am index 47d6a3492a..9428b772eb 100644 --- a/none/tests/x86/Makefile.am +++ b/none/tests/x86/Makefile.am @@ -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 index 0000000000..38d4f20a53 --- /dev/null +++ b/none/tests/x86/xadd.c @@ -0,0 +1,51 @@ + +#include "config.h" +#include +#include + +/* 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 index 0000000000..e69de29bb2 diff --git a/none/tests/x86/xadd.stdout.exp b/none/tests/x86/xadd.stdout.exp new file mode 100644 index 0000000000..2e9ba477f8 --- /dev/null +++ b/none/tests/x86/xadd.stdout.exp @@ -0,0 +1 @@ +success diff --git a/none/tests/x86/xadd.vgtest b/none/tests/x86/xadd.vgtest new file mode 100644 index 0000000000..2cb1bee4a3 --- /dev/null +++ b/none/tests/x86/xadd.vgtest @@ -0,0 +1,2 @@ +prog: xadd +vgopts: -q -- 2.47.2