1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "tests/asm.h"
2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdio.h>
3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
4ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* This test only checks register/register cmpxchg */
5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef unsigned long long int ULong;
7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef unsigned int UInt;
8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong m64;
10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong rax;
12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong rbx;
13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong rcx;
14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong rdx;
15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong rax_out;
16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong rbx_out;
17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff BrownULong rcx_out;
18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownint main ( void )
20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown{
21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* 8-bit */
23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   rdx  = 0x11111111; rax = 0x22222222;
25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   rcx  = 0x33333333; rbx = 0x44444444;
26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("cmpxchg %%bl,%%cl  (al=%llx bl=%llx cl=%llx)\n",
28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  rax&0xff,rbx&0xff,rcx&0xff);
29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm("\n"
31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rax\n"
32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rbx\n"
33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rcx\n"
34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rdx\n"
35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\txor %rax, %rax\n" // get eflags in a known state
36b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifndef VGP_amd64_darwin
37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rax) ",%rax\n"
38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rbx) ",%rbx\n"
39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rcx) ",%rcx\n"
40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rdx) ",%rdx\n"
41b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#else
42b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rax) "(%rip),%rax\n"
43b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rbx) "(%rip),%rbx\n"
44b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rcx) "(%rip),%rcx\n"
45b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rdx) "(%rip),%rdx\n"
46b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tcmpxchg %bl,%cl \n"
48b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifndef VGP_amd64_darwin
49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov %rax," VG_SYM(rax_out) "\n"
50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov %rbx," VG_SYM(rbx_out) "\n"
51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov %rcx," VG_SYM(rcx_out) "\n"
52b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#else
53b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov %rax," VG_SYM(rax_out) "(%rip)\n"
54b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov %rbx," VG_SYM(rbx_out) "(%rip)\n"
55b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov %rcx," VG_SYM(rcx_out) "(%rip)\n"
56b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
57ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rdx\n"
58ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rcx\n"
59ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rbx\n"
60ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rax\n"
61ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    );
62ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
63ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("  al!=cl so al should equal cl (Result al=%llx bl=%llx cl=%llx)\n",
64ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  rax_out&0xff,rbx_out&0xff,rcx_out&0xff);
65ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
66ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
67ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
68ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   rdx  = 0x99999999; rax = 0x77777777;
69ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   rcx  = 0x55555555; rbx = 0x55555555;
70ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("cmpxchg %%bl,%%cl  (al=%llx bl=%llx cl=%llx)\n",
72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  rax&0xff,rbx&0xff,rcx&0xff);
73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm("\n"
75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rax\n"
76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rbx\n"
77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rcx\n"
78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rdx\n"
79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\txor %rax, %rax\n" // get eflags in a known state
80b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifndef VGP_amd64_darwin
81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rax) ",%rax\n"
82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rbx) ",%rbx\n"
83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rcx) ",%rcx\n"
84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rdx) ",%rdx\n"
85b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#else
86b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rax) "(%rip),%rax\n"
87b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rbx) "(%rip),%rbx\n"
88b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rcx) "(%rip),%rcx\n"
89b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rdx) "(%rip),%rdx\n"
90b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tcmpxchg %bl,%cl \n"
92b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifndef VGP_amd64_darwin
93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov %rax," VG_SYM(rax_out) "\n"
94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov %rbx," VG_SYM(rbx_out) "\n"
95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov %rcx," VG_SYM(rcx_out) "\n"
96b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#else
97b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov %rax," VG_SYM(rax_out) "(%rip)\n"
98b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov %rbx," VG_SYM(rbx_out) "(%rip)\n"
99b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov %rcx," VG_SYM(rcx_out) "(%rip)\n"
100b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rdx\n"
102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rcx\n"
103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rbx\n"
104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rax\n"
105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    );
106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("  al==cl so cl should equal bl (Result al=%llx bl=%llx cl=%llx)\n",
108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  rax_out&0xff,rbx_out&0xff,rcx_out&0xff);
109ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* 16-bit */
111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   rdx  = 0x11111111; rax = 0x22222222;
113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   rcx  = 0x33333333; rbx = 0x44444444;
114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("cmpxchg %%bx,%%cx  (ax=%llx bx=%llx cx=%llx)\n",
116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  rax&0xffff,rbx&0xffff,rcx&0xffff);
117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm("\n"
119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rax\n"
120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rbx\n"
121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rcx\n"
122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rdx\n"
123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\txor %rax, %rax\n" // get eflags in a known state
124b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifndef VGP_amd64_darwin
125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rax) ",%rax\n"
126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rbx) ",%rbx\n"
127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rcx) ",%rcx\n"
128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rdx) ",%rdx\n"
129b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#else
130b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rax) "(%rip),%rax\n"
131b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rbx) "(%rip),%rbx\n"
132b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rcx) "(%rip),%rcx\n"
133b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rdx) "(%rip),%rdx\n"
134b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tcmpxchg %bx,%cx \n"
136b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifndef VGP_amd64_darwin
137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov %rax," VG_SYM(rax_out) "\n"
138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov %rbx," VG_SYM(rbx_out) "\n"
139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov %rcx," VG_SYM(rcx_out) "\n"
140b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#else
141b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov %rax," VG_SYM(rax_out) "(%rip)\n"
142b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov %rbx," VG_SYM(rbx_out) "(%rip)\n"
143b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov %rcx," VG_SYM(rcx_out) "(%rip)\n"
144b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rdx\n"
146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rcx\n"
147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rbx\n"
148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rax\n"
149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    );
150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("  ax!=cx so ax should equal cx (Result ax=%llx bx=%llx cx=%llx)\n",
152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  rax_out&0xffff,rbx_out&0xffff,rcx_out&0xffff);
153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   rdx  = 0x99999999; rax = 0x77777777;
157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   rcx  = 0x55555555; rbx = 0x55555555;
158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("cmpxchg %%bx,%%cx  (ax=%llx bx=%llx cx=%llx)\n",
160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  rax&0xffff,rbx&0xffff,rcx&0xffff);
161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm("\n"
163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rax\n"
164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rbx\n"
165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rcx\n"
166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rdx\n"
167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\txor %rax, %rax\n" // get eflags in a known state
168b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifndef VGP_amd64_darwin
169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rax) ",%rax\n"
170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rbx) ",%rbx\n"
171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rcx) ",%rcx\n"
172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rdx) ",%rdx\n"
173b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#else
174b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rax) "(%rip),%rax\n"
175b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rbx) "(%rip),%rbx\n"
176b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rcx) "(%rip),%rcx\n"
177b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rdx) "(%rip),%rdx\n"
178b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tcmpxchg %bx,%cx \n"
180b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifndef VGP_amd64_darwin
181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov %rax," VG_SYM(rax_out) "\n"
182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov %rbx," VG_SYM(rbx_out) "\n"
183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov %rcx," VG_SYM(rcx_out) "\n"
184b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#else
185b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov %rax," VG_SYM(rax_out) "(%rip)\n"
186b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov %rbx," VG_SYM(rbx_out) "(%rip)\n"
187b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov %rcx," VG_SYM(rcx_out) "(%rip)\n"
188b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rdx\n"
190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rcx\n"
191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rbx\n"
192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rax\n"
193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    );
194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("  ax==cx so cx should equal bx (Result ax=%llx bx=%llx cx=%llx)\n",
196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  rax_out&0xffff,rbx_out&0xffff,rcx_out&0xffff);
197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* 32-bit */
200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   rdx  = 0x11111111; rax = 0x22222222;
202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   rcx  = 0x33333333; rbx = 0x44444444;
203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("cmpxchg %%ebx,%%ecx  (eax=%llx ebx=%llx ecx=%llx)\n",
205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  rax&0xffffffff,rbx&0xffffffff,rcx&0xffffffff);
206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm("\n"
208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rax\n"
209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rbx\n"
210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rcx\n"
211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rdx\n"
212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\txor %rax, %rax\n" // get eflags in a known state
213b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifndef VGP_amd64_darwin
214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rax) ",%rax\n"
215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rbx) ",%rbx\n"
216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rcx) ",%rcx\n"
217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rdx) ",%rdx\n"
218b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#else
219b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rax) "(%rip),%rax\n"
220b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rbx) "(%rip),%rbx\n"
221b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rcx) "(%rip),%rcx\n"
222b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rdx) "(%rip),%rdx\n"
223b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tcmpxchg %ebx,%ecx \n"
225b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifndef VGP_amd64_darwin
226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov %rax," VG_SYM(rax_out) "\n"
227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov %rbx," VG_SYM(rbx_out) "\n"
228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov %rcx," VG_SYM(rcx_out) "\n"
229b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#else
230b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov %rax," VG_SYM(rax_out) "(%rip)\n"
231b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov %rbx," VG_SYM(rbx_out) "(%rip)\n"
232b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov %rcx," VG_SYM(rcx_out) "(%rip)\n"
233b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rdx\n"
235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rcx\n"
236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rbx\n"
237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rax\n"
238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    );
239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("  eax!=ecx so eax should equal ecx (Result eax=%llx ebx=%llx ecx=%llx)\n",
241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  rax_out&0xffffffff,rbx_out&0xffffffff,rcx_out&0xffffffff);
242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   rdx  = 0x99999999; rax = 0x77777777;
246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   rcx  = 0x55555555; rbx = 0x55555555;
247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("cmpxchg %%ebx,%%ecx  (eax=%llx ebx=%llx ecx=%llx)\n",
249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  rax&0xffffffff,rbx&0xffffffff,rcx&0xffffffff);
250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm("\n"
252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rax\n"
253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rbx\n"
254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rcx\n"
255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rdx\n"
256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\txor %rax, %rax\n" // get eflags in a known state
257b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifndef VGP_amd64_darwin
258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rax) ",%rax\n"
259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rbx) ",%rbx\n"
260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rcx) ",%rcx\n"
261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rdx) ",%rdx\n"
262b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#else
263b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rax) "(%rip),%rax\n"
264b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rbx) "(%rip),%rbx\n"
265b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rcx) "(%rip),%rcx\n"
266b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rdx) "(%rip),%rdx\n"
267b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tcmpxchg %ebx,%ecx \n"
269b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifndef VGP_amd64_darwin
270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov %rax," VG_SYM(rax_out) "\n"
271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov %rbx," VG_SYM(rbx_out) "\n"
272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov %rcx," VG_SYM(rcx_out) "\n"
273b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#else
274b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov %rax," VG_SYM(rax_out) "(%rip)\n"
275b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov %rbx," VG_SYM(rbx_out) "(%rip)\n"
276b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov %rcx," VG_SYM(rcx_out) "(%rip)\n"
277b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rdx\n"
279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rcx\n"
280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rbx\n"
281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rax\n"
282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    );
283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("  eax==ecx so ecx should equal ebx (Result eax=%llx ebx=%llx ecx=%llx)\n",
285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  rax_out&0xffffffff,rbx_out&0xffffffff,rcx_out&0xffffffff);
286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   /* 64-bit */
289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   rdx  = 0x111111111; rax = 0x222222222;
291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   rcx  = 0x333333333; rbx = 0x444444444;
292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("cmpxchg %%rbx,%%rcx  (rax=%llx rbx=%llx rcx=%llx)\n",
294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  rax,rbx,rcx);
295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm("\n"
297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rax\n"
298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rbx\n"
299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rcx\n"
300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rdx\n"
301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\txor %rax, %rax\n" // get eflags in a known state
302b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifndef VGP_amd64_darwin
303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rax) ",%rax\n"
304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rbx) ",%rbx\n"
305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rcx) ",%rcx\n"
306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rdx) ",%rdx\n"
307b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#else
308b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rax) "(%rip),%rax\n"
309b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rbx) "(%rip),%rbx\n"
310b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rcx) "(%rip),%rcx\n"
311b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rdx) "(%rip),%rdx\n"
312b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
313ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tcmpxchg %rbx,%rcx \n"
314b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifndef VGP_amd64_darwin
315ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov %rax," VG_SYM(rax_out) "\n"
316ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov %rbx," VG_SYM(rbx_out) "\n"
317ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov %rcx," VG_SYM(rcx_out) "\n"
318b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#else
319b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov %rax," VG_SYM(rax_out) "(%rip)\n"
320b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov %rbx," VG_SYM(rbx_out) "(%rip)\n"
321b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov %rcx," VG_SYM(rcx_out) "(%rip)\n"
322b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
323ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rdx\n"
324ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rcx\n"
325ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rbx\n"
326ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rax\n"
327ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    );
328ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
329ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("  rax!=rcx so rax should equal rcx (Result rax=%llx rbx=%llx rcx=%llx)\n",
330ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  rax_out,rbx_out,rcx_out);
331ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
332ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
333ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
334ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   rdx  = 0x999999999; rax = 0x777777777;
335ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   rcx  = 0x555555555; rbx = 0x555555555;
336ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
337ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("cmpxchg %%rbx,%%rcx  (rax=%llx rbx=%llx rcx=%llx)\n",
338ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  rax,rbx,rcx);
339ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
340ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   asm("\n"
341ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rax\n"
342ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rbx\n"
343ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rcx\n"
344ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpush %rdx\n"
345ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\txor %rax, %rax\n" // get eflags in a known state
346b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifndef VGP_amd64_darwin
347ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rax) ",%rax\n"
348ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rbx) ",%rbx\n"
349ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rcx) ",%rcx\n"
350ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov " VG_SYM(rdx) ",%rdx\n"
351b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#else
352b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rax) "(%rip),%rax\n"
353b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rbx) "(%rip),%rbx\n"
354b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rcx) "(%rip),%rcx\n"
355b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov " VG_SYM(rdx) "(%rip),%rdx\n"
356b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
357ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tcmpxchg %rbx,%rcx \n"
358b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#ifndef VGP_amd64_darwin
359ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov %rax," VG_SYM(rax_out) "\n"
360ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov %rbx," VG_SYM(rbx_out) "\n"
361ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tmov %rcx," VG_SYM(rcx_out) "\n"
362b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#else
363b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov %rax," VG_SYM(rax_out) "(%rip)\n"
364b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov %rbx," VG_SYM(rbx_out) "(%rip)\n"
365b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov    "\tmov %rcx," VG_SYM(rcx_out) "(%rip)\n"
366b32f58018498ea2225959b0ba11c18f0c433deefEvgeniy Stepanov#endif
367ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rdx\n"
368ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rcx\n"
369ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rbx\n"
370ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    "\tpop %rax\n"
371ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown    );
372ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
373ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   printf("  rax==rcx so ecx should equal rbx (Result rax=%llx rbx=%llx rcx=%llx)\n",
374ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown	  rax_out,rbx_out,rcx_out);
375ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown
376ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown   return 0;
377ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}
378