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