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