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 
     14 #if defined(__i386__)
     15 #  define PLAT_x86_linux 1
     16 #elif defined(__x86_64__)
     17 #  define PLAT_amd64_linux 1
     18 #endif
     19 
     20 
     21 #if defined(PLAT_amd64_linux) || defined(PLAT_x86_linux)
     22 #  define XADD_R_R(_addr,_lval) \
     23 	__asm__ __volatile__( \
     24 	"xadd %1, %0" \
     25 	: /*out*/ "=r"(_lval),"=r"(_addr) \
     26 	: /*in*/  "0"(_lval),"1"(_addr) \
     27 	: "flags" \
     28 	)
     29 #else
     30 #  error "Unsupported architecture"
     31 #endif
     32 
     33 int main ( void )
     34 {
     35    long d = 20, s = 2;
     36    long xadd_r_r_res;
     37 #define XADD_R_R_RES 42
     38 
     39    XADD_R_R(s, d);
     40    xadd_r_r_res = s + d;
     41    assert(xadd_r_r_res == XADD_R_R_RES);
     42 
     43    if (xadd_r_r_res == XADD_R_R_RES)
     44       printf("success\n");
     45    else
     46       printf("failure\n");
     47 
     48    return xadd_r_r_res;
     49 }
     50