16dc769e2484fb51976947db6c49f844bf4f761b7sewardj#include "tests/asm.h" 26dc769e2484fb51976947db6c49f844bf4f761b7sewardj#include <stdio.h> 36dc769e2484fb51976947db6c49f844bf4f761b7sewardj 46dc769e2484fb51976947db6c49f844bf4f761b7sewardj/* This test only checks register/register cmpxchg */ 56dc769e2484fb51976947db6c49f844bf4f761b7sewardj 66dc769e2484fb51976947db6c49f844bf4f761b7sewardjtypedef unsigned long long int ULong; 76dc769e2484fb51976947db6c49f844bf4f761b7sewardjtypedef unsigned int UInt; 86dc769e2484fb51976947db6c49f844bf4f761b7sewardj 96dc769e2484fb51976947db6c49f844bf4f761b7sewardjULong m64; 106dc769e2484fb51976947db6c49f844bf4f761b7sewardj 116dc769e2484fb51976947db6c49f844bf4f761b7sewardjULong rax; 126dc769e2484fb51976947db6c49f844bf4f761b7sewardjULong rbx; 136dc769e2484fb51976947db6c49f844bf4f761b7sewardjULong rcx; 146dc769e2484fb51976947db6c49f844bf4f761b7sewardjULong rdx; 156dc769e2484fb51976947db6c49f844bf4f761b7sewardjULong rax_out; 166dc769e2484fb51976947db6c49f844bf4f761b7sewardjULong rbx_out; 176dc769e2484fb51976947db6c49f844bf4f761b7sewardjULong rcx_out; 186dc769e2484fb51976947db6c49f844bf4f761b7sewardj 196dc769e2484fb51976947db6c49f844bf4f761b7sewardjint main ( void ) 206dc769e2484fb51976947db6c49f844bf4f761b7sewardj{ 216dc769e2484fb51976947db6c49f844bf4f761b7sewardj 226dc769e2484fb51976947db6c49f844bf4f761b7sewardj /* 8-bit */ 236dc769e2484fb51976947db6c49f844bf4f761b7sewardj 246dc769e2484fb51976947db6c49f844bf4f761b7sewardj rdx = 0x11111111; rax = 0x22222222; 256dc769e2484fb51976947db6c49f844bf4f761b7sewardj rcx = 0x33333333; rbx = 0x44444444; 266dc769e2484fb51976947db6c49f844bf4f761b7sewardj 276dc769e2484fb51976947db6c49f844bf4f761b7sewardj printf("cmpxchg %%bl,%%cl (al=%llx bl=%llx cl=%llx)\n", 286dc769e2484fb51976947db6c49f844bf4f761b7sewardj rax&0xff,rbx&0xff,rcx&0xff); 296dc769e2484fb51976947db6c49f844bf4f761b7sewardj 306dc769e2484fb51976947db6c49f844bf4f761b7sewardj asm("\n" 316dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rax\n" 326dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rbx\n" 336dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rcx\n" 346dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rdx\n" 356dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\txor %rax, %rax\n" // get eflags in a known state 361005ef5ea5158da9b9f2fd252ba603243c5e5302bart#ifndef VGP_amd64_darwin 376dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rax) ",%rax\n" 386dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rbx) ",%rbx\n" 396dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rcx) ",%rcx\n" 406dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rdx) ",%rdx\n" 411005ef5ea5158da9b9f2fd252ba603243c5e5302bart#else 421005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rax) "(%rip),%rax\n" 431005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rbx) "(%rip),%rbx\n" 441005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rcx) "(%rip),%rcx\n" 451005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rdx) "(%rip),%rdx\n" 461005ef5ea5158da9b9f2fd252ba603243c5e5302bart#endif 476dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tcmpxchg %bl,%cl \n" 481005ef5ea5158da9b9f2fd252ba603243c5e5302bart#ifndef VGP_amd64_darwin 496dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov %rax," VG_SYM(rax_out) "\n" 506dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov %rbx," VG_SYM(rbx_out) "\n" 516dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov %rcx," VG_SYM(rcx_out) "\n" 521005ef5ea5158da9b9f2fd252ba603243c5e5302bart#else 531005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov %rax," VG_SYM(rax_out) "(%rip)\n" 541005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov %rbx," VG_SYM(rbx_out) "(%rip)\n" 551005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov %rcx," VG_SYM(rcx_out) "(%rip)\n" 561005ef5ea5158da9b9f2fd252ba603243c5e5302bart#endif 576dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rdx\n" 586dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rcx\n" 596dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rbx\n" 606dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rax\n" 616dc769e2484fb51976947db6c49f844bf4f761b7sewardj ); 626dc769e2484fb51976947db6c49f844bf4f761b7sewardj 636dc769e2484fb51976947db6c49f844bf4f761b7sewardj printf(" al!=cl so al should equal cl (Result al=%llx bl=%llx cl=%llx)\n", 646dc769e2484fb51976947db6c49f844bf4f761b7sewardj rax_out&0xff,rbx_out&0xff,rcx_out&0xff); 656dc769e2484fb51976947db6c49f844bf4f761b7sewardj 666dc769e2484fb51976947db6c49f844bf4f761b7sewardj 676dc769e2484fb51976947db6c49f844bf4f761b7sewardj 686dc769e2484fb51976947db6c49f844bf4f761b7sewardj rdx = 0x99999999; rax = 0x77777777; 696dc769e2484fb51976947db6c49f844bf4f761b7sewardj rcx = 0x55555555; rbx = 0x55555555; 706dc769e2484fb51976947db6c49f844bf4f761b7sewardj 716dc769e2484fb51976947db6c49f844bf4f761b7sewardj printf("cmpxchg %%bl,%%cl (al=%llx bl=%llx cl=%llx)\n", 726dc769e2484fb51976947db6c49f844bf4f761b7sewardj rax&0xff,rbx&0xff,rcx&0xff); 736dc769e2484fb51976947db6c49f844bf4f761b7sewardj 746dc769e2484fb51976947db6c49f844bf4f761b7sewardj asm("\n" 756dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rax\n" 766dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rbx\n" 776dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rcx\n" 786dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rdx\n" 796dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\txor %rax, %rax\n" // get eflags in a known state 801005ef5ea5158da9b9f2fd252ba603243c5e5302bart#ifndef VGP_amd64_darwin 816dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rax) ",%rax\n" 826dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rbx) ",%rbx\n" 836dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rcx) ",%rcx\n" 846dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rdx) ",%rdx\n" 851005ef5ea5158da9b9f2fd252ba603243c5e5302bart#else 861005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rax) "(%rip),%rax\n" 871005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rbx) "(%rip),%rbx\n" 881005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rcx) "(%rip),%rcx\n" 891005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rdx) "(%rip),%rdx\n" 901005ef5ea5158da9b9f2fd252ba603243c5e5302bart#endif 916dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tcmpxchg %bl,%cl \n" 921005ef5ea5158da9b9f2fd252ba603243c5e5302bart#ifndef VGP_amd64_darwin 936dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov %rax," VG_SYM(rax_out) "\n" 946dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov %rbx," VG_SYM(rbx_out) "\n" 956dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov %rcx," VG_SYM(rcx_out) "\n" 961005ef5ea5158da9b9f2fd252ba603243c5e5302bart#else 971005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov %rax," VG_SYM(rax_out) "(%rip)\n" 981005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov %rbx," VG_SYM(rbx_out) "(%rip)\n" 991005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov %rcx," VG_SYM(rcx_out) "(%rip)\n" 1001005ef5ea5158da9b9f2fd252ba603243c5e5302bart#endif 1016dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rdx\n" 1026dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rcx\n" 1036dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rbx\n" 1046dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rax\n" 1056dc769e2484fb51976947db6c49f844bf4f761b7sewardj ); 1066dc769e2484fb51976947db6c49f844bf4f761b7sewardj 1076dc769e2484fb51976947db6c49f844bf4f761b7sewardj printf(" al==cl so cl should equal bl (Result al=%llx bl=%llx cl=%llx)\n", 1086dc769e2484fb51976947db6c49f844bf4f761b7sewardj rax_out&0xff,rbx_out&0xff,rcx_out&0xff); 1096dc769e2484fb51976947db6c49f844bf4f761b7sewardj 1106dc769e2484fb51976947db6c49f844bf4f761b7sewardj /* 16-bit */ 1116dc769e2484fb51976947db6c49f844bf4f761b7sewardj 1126dc769e2484fb51976947db6c49f844bf4f761b7sewardj rdx = 0x11111111; rax = 0x22222222; 1136dc769e2484fb51976947db6c49f844bf4f761b7sewardj rcx = 0x33333333; rbx = 0x44444444; 1146dc769e2484fb51976947db6c49f844bf4f761b7sewardj 1156dc769e2484fb51976947db6c49f844bf4f761b7sewardj printf("cmpxchg %%bx,%%cx (ax=%llx bx=%llx cx=%llx)\n", 1166dc769e2484fb51976947db6c49f844bf4f761b7sewardj rax&0xffff,rbx&0xffff,rcx&0xffff); 1176dc769e2484fb51976947db6c49f844bf4f761b7sewardj 1186dc769e2484fb51976947db6c49f844bf4f761b7sewardj asm("\n" 1196dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rax\n" 1206dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rbx\n" 1216dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rcx\n" 1226dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rdx\n" 1236dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\txor %rax, %rax\n" // get eflags in a known state 1241005ef5ea5158da9b9f2fd252ba603243c5e5302bart#ifndef VGP_amd64_darwin 1256dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rax) ",%rax\n" 1266dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rbx) ",%rbx\n" 1276dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rcx) ",%rcx\n" 1286dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rdx) ",%rdx\n" 1291005ef5ea5158da9b9f2fd252ba603243c5e5302bart#else 1301005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rax) "(%rip),%rax\n" 1311005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rbx) "(%rip),%rbx\n" 1321005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rcx) "(%rip),%rcx\n" 1331005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rdx) "(%rip),%rdx\n" 1341005ef5ea5158da9b9f2fd252ba603243c5e5302bart#endif 1356dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tcmpxchg %bx,%cx \n" 1361005ef5ea5158da9b9f2fd252ba603243c5e5302bart#ifndef VGP_amd64_darwin 1376dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov %rax," VG_SYM(rax_out) "\n" 1386dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov %rbx," VG_SYM(rbx_out) "\n" 1396dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov %rcx," VG_SYM(rcx_out) "\n" 1401005ef5ea5158da9b9f2fd252ba603243c5e5302bart#else 1411005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov %rax," VG_SYM(rax_out) "(%rip)\n" 1421005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov %rbx," VG_SYM(rbx_out) "(%rip)\n" 1431005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov %rcx," VG_SYM(rcx_out) "(%rip)\n" 1441005ef5ea5158da9b9f2fd252ba603243c5e5302bart#endif 1456dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rdx\n" 1466dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rcx\n" 1476dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rbx\n" 1486dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rax\n" 1496dc769e2484fb51976947db6c49f844bf4f761b7sewardj ); 1506dc769e2484fb51976947db6c49f844bf4f761b7sewardj 1516dc769e2484fb51976947db6c49f844bf4f761b7sewardj printf(" ax!=cx so ax should equal cx (Result ax=%llx bx=%llx cx=%llx)\n", 1526dc769e2484fb51976947db6c49f844bf4f761b7sewardj rax_out&0xffff,rbx_out&0xffff,rcx_out&0xffff); 1536dc769e2484fb51976947db6c49f844bf4f761b7sewardj 1546dc769e2484fb51976947db6c49f844bf4f761b7sewardj 1556dc769e2484fb51976947db6c49f844bf4f761b7sewardj 1566dc769e2484fb51976947db6c49f844bf4f761b7sewardj rdx = 0x99999999; rax = 0x77777777; 1576dc769e2484fb51976947db6c49f844bf4f761b7sewardj rcx = 0x55555555; rbx = 0x55555555; 1586dc769e2484fb51976947db6c49f844bf4f761b7sewardj 1596dc769e2484fb51976947db6c49f844bf4f761b7sewardj printf("cmpxchg %%bx,%%cx (ax=%llx bx=%llx cx=%llx)\n", 1606dc769e2484fb51976947db6c49f844bf4f761b7sewardj rax&0xffff,rbx&0xffff,rcx&0xffff); 1616dc769e2484fb51976947db6c49f844bf4f761b7sewardj 1626dc769e2484fb51976947db6c49f844bf4f761b7sewardj asm("\n" 1636dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rax\n" 1646dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rbx\n" 1656dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rcx\n" 1666dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rdx\n" 1676dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\txor %rax, %rax\n" // get eflags in a known state 1681005ef5ea5158da9b9f2fd252ba603243c5e5302bart#ifndef VGP_amd64_darwin 1696dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rax) ",%rax\n" 1706dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rbx) ",%rbx\n" 1716dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rcx) ",%rcx\n" 1726dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rdx) ",%rdx\n" 1731005ef5ea5158da9b9f2fd252ba603243c5e5302bart#else 1741005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rax) "(%rip),%rax\n" 1751005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rbx) "(%rip),%rbx\n" 1761005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rcx) "(%rip),%rcx\n" 1771005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rdx) "(%rip),%rdx\n" 1781005ef5ea5158da9b9f2fd252ba603243c5e5302bart#endif 1796dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tcmpxchg %bx,%cx \n" 1801005ef5ea5158da9b9f2fd252ba603243c5e5302bart#ifndef VGP_amd64_darwin 1816dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov %rax," VG_SYM(rax_out) "\n" 1826dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov %rbx," VG_SYM(rbx_out) "\n" 1836dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov %rcx," VG_SYM(rcx_out) "\n" 1841005ef5ea5158da9b9f2fd252ba603243c5e5302bart#else 1851005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov %rax," VG_SYM(rax_out) "(%rip)\n" 1861005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov %rbx," VG_SYM(rbx_out) "(%rip)\n" 1871005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov %rcx," VG_SYM(rcx_out) "(%rip)\n" 1881005ef5ea5158da9b9f2fd252ba603243c5e5302bart#endif 1896dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rdx\n" 1906dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rcx\n" 1916dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rbx\n" 1926dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rax\n" 1936dc769e2484fb51976947db6c49f844bf4f761b7sewardj ); 1946dc769e2484fb51976947db6c49f844bf4f761b7sewardj 1956dc769e2484fb51976947db6c49f844bf4f761b7sewardj printf(" ax==cx so cx should equal bx (Result ax=%llx bx=%llx cx=%llx)\n", 1966dc769e2484fb51976947db6c49f844bf4f761b7sewardj rax_out&0xffff,rbx_out&0xffff,rcx_out&0xffff); 1976dc769e2484fb51976947db6c49f844bf4f761b7sewardj 1986dc769e2484fb51976947db6c49f844bf4f761b7sewardj 1996dc769e2484fb51976947db6c49f844bf4f761b7sewardj /* 32-bit */ 2006dc769e2484fb51976947db6c49f844bf4f761b7sewardj 2016dc769e2484fb51976947db6c49f844bf4f761b7sewardj rdx = 0x11111111; rax = 0x22222222; 2026dc769e2484fb51976947db6c49f844bf4f761b7sewardj rcx = 0x33333333; rbx = 0x44444444; 2036dc769e2484fb51976947db6c49f844bf4f761b7sewardj 2046dc769e2484fb51976947db6c49f844bf4f761b7sewardj printf("cmpxchg %%ebx,%%ecx (eax=%llx ebx=%llx ecx=%llx)\n", 2056dc769e2484fb51976947db6c49f844bf4f761b7sewardj rax&0xffffffff,rbx&0xffffffff,rcx&0xffffffff); 2066dc769e2484fb51976947db6c49f844bf4f761b7sewardj 2076dc769e2484fb51976947db6c49f844bf4f761b7sewardj asm("\n" 2086dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rax\n" 2096dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rbx\n" 2106dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rcx\n" 2116dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rdx\n" 2126dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\txor %rax, %rax\n" // get eflags in a known state 2131005ef5ea5158da9b9f2fd252ba603243c5e5302bart#ifndef VGP_amd64_darwin 2146dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rax) ",%rax\n" 2156dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rbx) ",%rbx\n" 2166dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rcx) ",%rcx\n" 2176dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rdx) ",%rdx\n" 2181005ef5ea5158da9b9f2fd252ba603243c5e5302bart#else 2191005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rax) "(%rip),%rax\n" 2201005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rbx) "(%rip),%rbx\n" 2211005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rcx) "(%rip),%rcx\n" 2221005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rdx) "(%rip),%rdx\n" 2231005ef5ea5158da9b9f2fd252ba603243c5e5302bart#endif 2246dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tcmpxchg %ebx,%ecx \n" 2251005ef5ea5158da9b9f2fd252ba603243c5e5302bart#ifndef VGP_amd64_darwin 2266dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov %rax," VG_SYM(rax_out) "\n" 2276dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov %rbx," VG_SYM(rbx_out) "\n" 2286dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov %rcx," VG_SYM(rcx_out) "\n" 2291005ef5ea5158da9b9f2fd252ba603243c5e5302bart#else 2301005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov %rax," VG_SYM(rax_out) "(%rip)\n" 2311005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov %rbx," VG_SYM(rbx_out) "(%rip)\n" 2321005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov %rcx," VG_SYM(rcx_out) "(%rip)\n" 2331005ef5ea5158da9b9f2fd252ba603243c5e5302bart#endif 2346dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rdx\n" 2356dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rcx\n" 2366dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rbx\n" 2376dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rax\n" 2386dc769e2484fb51976947db6c49f844bf4f761b7sewardj ); 2396dc769e2484fb51976947db6c49f844bf4f761b7sewardj 2406dc769e2484fb51976947db6c49f844bf4f761b7sewardj printf(" eax!=ecx so eax should equal ecx (Result eax=%llx ebx=%llx ecx=%llx)\n", 2416dc769e2484fb51976947db6c49f844bf4f761b7sewardj rax_out&0xffffffff,rbx_out&0xffffffff,rcx_out&0xffffffff); 2426dc769e2484fb51976947db6c49f844bf4f761b7sewardj 2436dc769e2484fb51976947db6c49f844bf4f761b7sewardj 2446dc769e2484fb51976947db6c49f844bf4f761b7sewardj 2456dc769e2484fb51976947db6c49f844bf4f761b7sewardj rdx = 0x99999999; rax = 0x77777777; 2466dc769e2484fb51976947db6c49f844bf4f761b7sewardj rcx = 0x55555555; rbx = 0x55555555; 2476dc769e2484fb51976947db6c49f844bf4f761b7sewardj 2486dc769e2484fb51976947db6c49f844bf4f761b7sewardj printf("cmpxchg %%ebx,%%ecx (eax=%llx ebx=%llx ecx=%llx)\n", 2496dc769e2484fb51976947db6c49f844bf4f761b7sewardj rax&0xffffffff,rbx&0xffffffff,rcx&0xffffffff); 2506dc769e2484fb51976947db6c49f844bf4f761b7sewardj 2516dc769e2484fb51976947db6c49f844bf4f761b7sewardj asm("\n" 2526dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rax\n" 2536dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rbx\n" 2546dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rcx\n" 2556dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rdx\n" 2566dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\txor %rax, %rax\n" // get eflags in a known state 2571005ef5ea5158da9b9f2fd252ba603243c5e5302bart#ifndef VGP_amd64_darwin 2586dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rax) ",%rax\n" 2596dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rbx) ",%rbx\n" 2606dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rcx) ",%rcx\n" 2616dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rdx) ",%rdx\n" 2621005ef5ea5158da9b9f2fd252ba603243c5e5302bart#else 2631005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rax) "(%rip),%rax\n" 2641005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rbx) "(%rip),%rbx\n" 2651005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rcx) "(%rip),%rcx\n" 2661005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rdx) "(%rip),%rdx\n" 2671005ef5ea5158da9b9f2fd252ba603243c5e5302bart#endif 2686dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tcmpxchg %ebx,%ecx \n" 2691005ef5ea5158da9b9f2fd252ba603243c5e5302bart#ifndef VGP_amd64_darwin 2706dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov %rax," VG_SYM(rax_out) "\n" 2716dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov %rbx," VG_SYM(rbx_out) "\n" 2726dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov %rcx," VG_SYM(rcx_out) "\n" 2731005ef5ea5158da9b9f2fd252ba603243c5e5302bart#else 2741005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov %rax," VG_SYM(rax_out) "(%rip)\n" 2751005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov %rbx," VG_SYM(rbx_out) "(%rip)\n" 2761005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov %rcx," VG_SYM(rcx_out) "(%rip)\n" 2771005ef5ea5158da9b9f2fd252ba603243c5e5302bart#endif 2786dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rdx\n" 2796dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rcx\n" 2806dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rbx\n" 2816dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rax\n" 2826dc769e2484fb51976947db6c49f844bf4f761b7sewardj ); 2836dc769e2484fb51976947db6c49f844bf4f761b7sewardj 2846dc769e2484fb51976947db6c49f844bf4f761b7sewardj printf(" eax==ecx so ecx should equal ebx (Result eax=%llx ebx=%llx ecx=%llx)\n", 2856dc769e2484fb51976947db6c49f844bf4f761b7sewardj rax_out&0xffffffff,rbx_out&0xffffffff,rcx_out&0xffffffff); 2866dc769e2484fb51976947db6c49f844bf4f761b7sewardj 2876dc769e2484fb51976947db6c49f844bf4f761b7sewardj 2886dc769e2484fb51976947db6c49f844bf4f761b7sewardj /* 64-bit */ 2896dc769e2484fb51976947db6c49f844bf4f761b7sewardj 2906dc769e2484fb51976947db6c49f844bf4f761b7sewardj rdx = 0x111111111; rax = 0x222222222; 2916dc769e2484fb51976947db6c49f844bf4f761b7sewardj rcx = 0x333333333; rbx = 0x444444444; 2926dc769e2484fb51976947db6c49f844bf4f761b7sewardj 2936dc769e2484fb51976947db6c49f844bf4f761b7sewardj printf("cmpxchg %%rbx,%%rcx (rax=%llx rbx=%llx rcx=%llx)\n", 2946dc769e2484fb51976947db6c49f844bf4f761b7sewardj rax,rbx,rcx); 2956dc769e2484fb51976947db6c49f844bf4f761b7sewardj 2966dc769e2484fb51976947db6c49f844bf4f761b7sewardj asm("\n" 2976dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rax\n" 2986dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rbx\n" 2996dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rcx\n" 3006dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rdx\n" 3016dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\txor %rax, %rax\n" // get eflags in a known state 3021005ef5ea5158da9b9f2fd252ba603243c5e5302bart#ifndef VGP_amd64_darwin 3036dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rax) ",%rax\n" 3046dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rbx) ",%rbx\n" 3056dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rcx) ",%rcx\n" 3066dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rdx) ",%rdx\n" 3071005ef5ea5158da9b9f2fd252ba603243c5e5302bart#else 3081005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rax) "(%rip),%rax\n" 3091005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rbx) "(%rip),%rbx\n" 3101005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rcx) "(%rip),%rcx\n" 3111005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rdx) "(%rip),%rdx\n" 3121005ef5ea5158da9b9f2fd252ba603243c5e5302bart#endif 3136dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tcmpxchg %rbx,%rcx \n" 3141005ef5ea5158da9b9f2fd252ba603243c5e5302bart#ifndef VGP_amd64_darwin 3156dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov %rax," VG_SYM(rax_out) "\n" 3166dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov %rbx," VG_SYM(rbx_out) "\n" 3176dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov %rcx," VG_SYM(rcx_out) "\n" 3181005ef5ea5158da9b9f2fd252ba603243c5e5302bart#else 3191005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov %rax," VG_SYM(rax_out) "(%rip)\n" 3201005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov %rbx," VG_SYM(rbx_out) "(%rip)\n" 3211005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov %rcx," VG_SYM(rcx_out) "(%rip)\n" 3221005ef5ea5158da9b9f2fd252ba603243c5e5302bart#endif 3236dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rdx\n" 3246dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rcx\n" 3256dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rbx\n" 3266dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rax\n" 3276dc769e2484fb51976947db6c49f844bf4f761b7sewardj ); 3286dc769e2484fb51976947db6c49f844bf4f761b7sewardj 3296dc769e2484fb51976947db6c49f844bf4f761b7sewardj printf(" rax!=rcx so rax should equal rcx (Result rax=%llx rbx=%llx rcx=%llx)\n", 3306dc769e2484fb51976947db6c49f844bf4f761b7sewardj rax_out,rbx_out,rcx_out); 3316dc769e2484fb51976947db6c49f844bf4f761b7sewardj 3326dc769e2484fb51976947db6c49f844bf4f761b7sewardj 3336dc769e2484fb51976947db6c49f844bf4f761b7sewardj 3346dc769e2484fb51976947db6c49f844bf4f761b7sewardj rdx = 0x999999999; rax = 0x777777777; 3356dc769e2484fb51976947db6c49f844bf4f761b7sewardj rcx = 0x555555555; rbx = 0x555555555; 3366dc769e2484fb51976947db6c49f844bf4f761b7sewardj 3376dc769e2484fb51976947db6c49f844bf4f761b7sewardj printf("cmpxchg %%rbx,%%rcx (rax=%llx rbx=%llx rcx=%llx)\n", 3386dc769e2484fb51976947db6c49f844bf4f761b7sewardj rax,rbx,rcx); 3396dc769e2484fb51976947db6c49f844bf4f761b7sewardj 3406dc769e2484fb51976947db6c49f844bf4f761b7sewardj asm("\n" 3416dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rax\n" 3426dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rbx\n" 3436dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rcx\n" 3446dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpush %rdx\n" 3456dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\txor %rax, %rax\n" // get eflags in a known state 3461005ef5ea5158da9b9f2fd252ba603243c5e5302bart#ifndef VGP_amd64_darwin 3476dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rax) ",%rax\n" 3486dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rbx) ",%rbx\n" 3496dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rcx) ",%rcx\n" 3506dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov " VG_SYM(rdx) ",%rdx\n" 3511005ef5ea5158da9b9f2fd252ba603243c5e5302bart#else 3521005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rax) "(%rip),%rax\n" 3531005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rbx) "(%rip),%rbx\n" 3541005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rcx) "(%rip),%rcx\n" 3551005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov " VG_SYM(rdx) "(%rip),%rdx\n" 3561005ef5ea5158da9b9f2fd252ba603243c5e5302bart#endif 3576dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tcmpxchg %rbx,%rcx \n" 3581005ef5ea5158da9b9f2fd252ba603243c5e5302bart#ifndef VGP_amd64_darwin 3596dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov %rax," VG_SYM(rax_out) "\n" 3606dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov %rbx," VG_SYM(rbx_out) "\n" 3616dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tmov %rcx," VG_SYM(rcx_out) "\n" 3621005ef5ea5158da9b9f2fd252ba603243c5e5302bart#else 3631005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov %rax," VG_SYM(rax_out) "(%rip)\n" 3641005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov %rbx," VG_SYM(rbx_out) "(%rip)\n" 3651005ef5ea5158da9b9f2fd252ba603243c5e5302bart "\tmov %rcx," VG_SYM(rcx_out) "(%rip)\n" 3661005ef5ea5158da9b9f2fd252ba603243c5e5302bart#endif 3676dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rdx\n" 3686dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rcx\n" 3696dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rbx\n" 3706dc769e2484fb51976947db6c49f844bf4f761b7sewardj "\tpop %rax\n" 3716dc769e2484fb51976947db6c49f844bf4f761b7sewardj ); 3726dc769e2484fb51976947db6c49f844bf4f761b7sewardj 3736dc769e2484fb51976947db6c49f844bf4f761b7sewardj printf(" rax==rcx so ecx should equal rbx (Result rax=%llx rbx=%llx rcx=%llx)\n", 3746dc769e2484fb51976947db6c49f844bf4f761b7sewardj rax_out,rbx_out,rcx_out); 3756dc769e2484fb51976947db6c49f844bf4f761b7sewardj 3766dc769e2484fb51976947db6c49f844bf4f761b7sewardj return 0; 3776dc769e2484fb51976947db6c49f844bf4f761b7sewardj} 378