Home | History | Annotate | Download | only in x86
      1 
      2 #include "config.h"
      3 #include <stdio.h>
      4 #include <assert.h>
      5 
      6 /* Simple test program, no race.
      7    Tests the 'xadd' exchange-and-add instruction with {r,r} operands, which is rarely generated by compilers. */
      8 
      9 #undef PLAT_x86_linux
     10 #undef PLAT_amd64_linux
     11 #undef PLAT_ppc32_linux
     12 #undef PLAT_ppc64_linux
     13 #undef PLAT_ppc32_aix5
     14 #undef PLAT_ppc64_aix5
     15 
     16 #if !defined(_AIX) && defined(__i386__)
     17 #  define PLAT_x86_linux 1
     18 #elif !defined(_AIX) && defined(__x86_64__)
     19 #  define PLAT_amd64_linux 1
     20 #endif
     21 
     22 
     23 #if defined(PLAT_amd64_linux) || defined(PLAT_x86_linux)
     24 #  define XADD_R_R(_addr,_lval) \
     25 	__asm__ __volatile__( \
     26 	"xadd %1, %0" \
     27 	: /*out*/ "=r"(_lval),"=r"(_addr) \
     28 	: /*in*/  "0"(_lval),"1"(_addr) \
     29 	: "flags" \
     30 	)
     31 #else
     32 #  error "Unsupported architecture"
     33 #endif
     34 
     35 int main ( void )
     36 {
     37    long d = 20, s = 2;
     38    long xadd_r_r_res;
     39 #define XADD_R_R_RES 42
     40 
     41    XADD_R_R(s, d);
     42    xadd_r_r_res = s + d;
     43    assert(xadd_r_r_res == XADD_R_R_RES);
     44 
     45    if (xadd_r_r_res == XADD_R_R_RES)
     46       printf("success\n");
     47    else
     48       printf("failure\n");
     49 
     50    return xadd_r_r_res;
     51 }
     52