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