text: #include "tests/asm.h"
  #include <stdio.h>
  
  typedef unsigned long long int ULong;
  typedef unsigned int UInt;
  
  ULong m64;
  
  UInt eax;
  UInt ebx;
  UInt ecx;
  UInt edx;
  UInt zout;
  
  extern void foo ( void );
  asm("\n"
      VG_SYM(foo) ":\n"
      "\tpushl %eax\n"
      "\tpushl %ebx\n"
      "\tpushl %ecx\n"
      "\tpushl %edx\n"
  
      "\txorl %eax, %eax\n" // get eflags in a known state
  
      "\tmovl " VG_SYM(eax) ",%eax\n"
      "\tmovl " VG_SYM(ebx) ",%ebx\n"
      "\tmovl " VG_SYM(ecx) ",%ecx\n"
      "\tmovl " VG_SYM(edx) ",%edx\n"
      "\tcmpxchg8b " VG_SYM(m64) "\n"
      "\tmovl %eax," VG_SYM(eax) "\n"
      "\tmovl %ebx," VG_SYM(ebx) "\n"
      "\tmovl %ecx," VG_SYM(ecx) "\n"
      "\tmovl %edx," VG_SYM(edx) "\n"
      "\tpushfl\n"
      "\tpopl %eax\n"
      "\tmovl %eax," VG_SYM(zout) "\n"
  
      "\tpopl %edx\n"
      "\tpopl %ecx\n"
      "\tpopl %ebx\n"
      "\tpopl %eax\n"
      "\tret\n"
      );
  
  int main ( void )
  {
     edx  = 0x11111111; eax = 0x22222222;
     ecx  = 0x33333333; ebx = 0x44444444;
     zout = 0x55555555;
     m64  = 0x1111111122222222ULL;
     foo();
     printf("0x%x 0x%x 0x%x 0x%x 0x%x 0x%llx\n",
  	  eax, ebx, ecx, edx, zout & 0xFFFF, m64 );
  
     edx  = 0x11111111; eax = 0x22222222;
     ecx  = 0x33333333; ebx = 0x44444444;
     zout = 0x55555555;
     m64  = 0x1111111122222222ULL;
     m64 += 0x1ULL;
     foo();
     printf("0x%x 0x%x 0x%x 0x%x 0x%x 0x%llx\n",
  	  eax, ebx, ecx, edx, zout & 0xFFFF, m64 );
  
     edx  = 0x11111111; eax = 0x22222222;
     ecx  = 0x33333333; ebx = 0x44444444;
     zout = 0x55555555;
     m64  = 0x1111111122222222ULL;
     m64 += 0x100000000ULL;
     foo();
     printf("0x%x 0x%x 0x%x 0x%x 0x%x 0x%llx\n",
  	  eax, ebx, ecx, edx, zout & 0xFFFF, m64 );
  
     edx  = 0x11111111; eax = 0x22222222;
     ecx  = 0x33333333; ebx = 0x44444444;
     zout = 0x55555555;
     m64  = 0x6666666677777777ULL;
     foo();
     printf("0x%x 0x%x 0x%x 0x%x 0x%x 0x%llx\n",
  	  eax, ebx, ecx, edx, zout & 0xFFFF, m64 );
  
     return 0;
  }
  