aboutsummaryrefslogtreecommitdiff
path: root/tests/tcg/x86_64/cmpxchg.c
blob: 589173516122a4ff2020cc4ea5708b022b294210 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <assert.h>

static int mem;

static unsigned long test_cmpxchgb(unsigned long orig)
{
  unsigned long ret;
  mem = orig;
  asm("cmpxchgb %b[cmp],%[mem]"
      : [ mem ] "+m"(mem), [ rax ] "=a"(ret)
      : [ cmp ] "r"(0x77), "a"(orig));
  return ret;
}

static unsigned long test_cmpxchgw(unsigned long orig)
{
  unsigned long ret;
  mem = orig;
  asm("cmpxchgw %w[cmp],%[mem]"
      : [ mem ] "+m"(mem), [ rax ] "=a"(ret)
      : [ cmp ] "r"(0x7777), "a"(orig));
  return ret;
}

static unsigned long test_cmpxchgl(unsigned long orig)
{
  unsigned long ret;
  mem = orig;
  asm("cmpxchgl %[cmp],%[mem]"
      : [ mem ] "+m"(mem), [ rax ] "=a"(ret)
      : [ cmp ] "r"(0x77777777u), "a"(orig));
  return ret;
}

int main()
{
  unsigned long test = 0xdeadbeef12345678ull;
  assert(test == test_cmpxchgb(test));
  assert(test == test_cmpxchgw(test));
  assert(test == test_cmpxchgl(test));
  return 0;
}