1*d1bb978bSPaolo Bonzini #include <assert.h> 2*d1bb978bSPaolo Bonzini 3*d1bb978bSPaolo Bonzini static int mem; 4*d1bb978bSPaolo Bonzini test_cmpxchgb(unsigned long orig)5*d1bb978bSPaolo Bonzinistatic unsigned long test_cmpxchgb(unsigned long orig) 6*d1bb978bSPaolo Bonzini { 7*d1bb978bSPaolo Bonzini unsigned long ret; 8*d1bb978bSPaolo Bonzini mem = orig; 9*d1bb978bSPaolo Bonzini asm("cmpxchgb %b[cmp],%[mem]" 10*d1bb978bSPaolo Bonzini : [ mem ] "+m"(mem), [ rax ] "=a"(ret) 11*d1bb978bSPaolo Bonzini : [ cmp ] "r"(0x77), "a"(orig)); 12*d1bb978bSPaolo Bonzini return ret; 13*d1bb978bSPaolo Bonzini } 14*d1bb978bSPaolo Bonzini test_cmpxchgw(unsigned long orig)15*d1bb978bSPaolo Bonzinistatic unsigned long test_cmpxchgw(unsigned long orig) 16*d1bb978bSPaolo Bonzini { 17*d1bb978bSPaolo Bonzini unsigned long ret; 18*d1bb978bSPaolo Bonzini mem = orig; 19*d1bb978bSPaolo Bonzini asm("cmpxchgw %w[cmp],%[mem]" 20*d1bb978bSPaolo Bonzini : [ mem ] "+m"(mem), [ rax ] "=a"(ret) 21*d1bb978bSPaolo Bonzini : [ cmp ] "r"(0x7777), "a"(orig)); 22*d1bb978bSPaolo Bonzini return ret; 23*d1bb978bSPaolo Bonzini } 24*d1bb978bSPaolo Bonzini test_cmpxchgl(unsigned long orig)25*d1bb978bSPaolo Bonzinistatic unsigned long test_cmpxchgl(unsigned long orig) 26*d1bb978bSPaolo Bonzini { 27*d1bb978bSPaolo Bonzini unsigned long ret; 28*d1bb978bSPaolo Bonzini mem = orig; 29*d1bb978bSPaolo Bonzini asm("cmpxchgl %[cmp],%[mem]" 30*d1bb978bSPaolo Bonzini : [ mem ] "+m"(mem), [ rax ] "=a"(ret) 31*d1bb978bSPaolo Bonzini : [ cmp ] "r"(0x77777777u), "a"(orig)); 32*d1bb978bSPaolo Bonzini return ret; 33*d1bb978bSPaolo Bonzini } 34*d1bb978bSPaolo Bonzini main()35*d1bb978bSPaolo Bonziniint main() 36*d1bb978bSPaolo Bonzini { 37*d1bb978bSPaolo Bonzini unsigned long test = 0xdeadbeef12345678ull; 38*d1bb978bSPaolo Bonzini assert(test == test_cmpxchgb(test)); 39*d1bb978bSPaolo Bonzini assert(test == test_cmpxchgw(test)); 40*d1bb978bSPaolo Bonzini assert(test == test_cmpxchgl(test)); 41*d1bb978bSPaolo Bonzini return 0; 42*d1bb978bSPaolo Bonzini } 43