xref: /qemu/tests/tcg/x86_64/cmpxchg.c (revision dd64bcea0016938ef0be7a0c930f98b77d5e1612)
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 Bonzini static 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 Bonzini static 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 Bonzini static 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 Bonzini int 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