#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

#define JZ_NEXT ".byte 0x74,0x00"  /* jz the-next-insn */

int main ( void )
{
   char* junk = malloc(48);
   assert(junk);


   /* --- INTEGER --- */

   printf("\nComplain int32\n");
   __asm__ __volatile__(
      "movl   0(%0), %%eax\n\t"
      "movl   8(%0), %%edi\n\t"
      "xorl   %%edi, %%eax\n\t"
      JZ_NEXT
      : : "r"(junk) : "edi", "eax", "cc"
   );

   printf("\nNo complain int32\n");
   __asm__ __volatile__(
      "movl   0(%0), %%eax\n\t"
      "movl   8(%0), %%edi\n\t"
      "xorl   %%eax, %%eax\n\t"
      JZ_NEXT
      : : "r"(junk) : "edi", "eax", "cc"
   );


   /* --- MMX --- */

   printf("\nComplain mmx\n");
   __asm__ __volatile__(
      "emms\n\t"
      "movq   0(%0), %%mm0\n\t"
      "movq   8(%0), %%mm7\n\t"
      "pxor   %%mm7, %%mm0\n\t"
      "movq   %%mm0, 16(%0)\n\t"
      "movl   16(%0), %%esi\n\t"
      "addl   20(%0), %%esi\n\t"
      JZ_NEXT
      : : "r"(junk) : "esi", "mm7", "mm0", "cc", "memory"
   );

   printf("\nNo complain mmx\n");
   __asm__ __volatile__(
      "emms\n\t"
      "movq   0(%0), %%mm0\n\t"
      "movq   8(%0), %%mm7\n\t"
      "pxor   %%mm0, %%mm0\n\t"
      "movq   %%mm0, 16(%0)\n\t"
      "movl   16(%0), %%esi\n\t"
      "addl   20(%0), %%esi\n\t"
      JZ_NEXT
      : : "r"(junk) : "esi", "mm7", "mm0", "cc", "memory"
   );


   /* --- SSE1 --- */

   printf("\nComplain sse xorps\n");
   __asm__ __volatile__(
      "movups   0(%0),  %%xmm0\n\t"
      "movups   16(%0), %%xmm7\n\t"
      "xorps    %%xmm7, %%xmm0\n\t"
      "movups   %%xmm0, 32(%0)\n\t"
      "movl 32(%0), %%esi\n\t"
      "addl 36(%0), %%esi\n\t"
      "addl 40(%0), %%esi\n\t"
      "addl 44(%0), %%esi\n\t"
      JZ_NEXT
      : : "r"(junk) : "esi", "xmm7", "xmm0", "cc", "memory"
   );

   printf("\nNo complain sse xorps\n");
   __asm__ __volatile__(
      "movups   0(%0),  %%xmm0\n\t"
      "movups   16(%0), %%xmm7\n\t"
      "xorps    %%xmm0, %%xmm0\n\t"
      "movups   %%xmm0, 32(%0)\n\t"
      "movl 32(%0), %%esi\n\t"
      "addl 36(%0), %%esi\n\t"
      "addl 40(%0), %%esi\n\t"
      "addl 44(%0), %%esi\n\t"
      JZ_NEXT
      : : "r"(junk) : "esi", "xmm7", "xmm0", "cc", "memory"
   );


   /* --- SSE2 --- */
#if 0
   printf("\nComplain sse2 pxor\n");
   __asm__ __volatile__(
      "movups   0(%0),  %%xmm0\n\t"
      "movups   16(%0), %%xmm7\n\t"
      "pxor     %%xmm7, %%xmm0\n\t"
      "movups   %%xmm0, 32(%0)\n\t"
      "movl 32(%0), %%esi\n\t"
      "addl 36(%0), %%esi\n\t"
      "addl 40(%0), %%esi\n\t"
      "addl 44(%0), %%esi\n\t"
      JZ_NEXT
      : : "r"(junk) : "esi", "xmm7", "xmm0", "cc", "memory"
   );

   printf("\nNo complain sse2 pxor\n");
   __asm__ __volatile__(
      "movups   0(%0),  %%xmm0\n\t"
      "movups   16(%0), %%xmm7\n\t"
      "pxor     %%xmm0, %%xmm0\n\t"
      "movups   %%xmm0, 32(%0)\n\t"
      "movl 32(%0), %%esi\n\t"
      "addl 36(%0), %%esi\n\t"
      "addl 40(%0), %%esi\n\t"
      "addl 44(%0), %%esi\n\t"
      JZ_NEXT
      : : "r"(junk) : "esi", "xmm7", "xmm0", "cc", "memory"
   );


   printf("\nComplain sse2 xorpd\n");
   __asm__ __volatile__(
      "movups   0(%0),  %%xmm0\n\t"
      "movups   16(%0), %%xmm7\n\t"
      "xorpd    %%xmm7, %%xmm0\n\t"
      "movups   %%xmm0, 32(%0)\n\t"
      "movl 32(%0), %%esi\n\t"
      "addl 36(%0), %%esi\n\t"
      "addl 40(%0), %%esi\n\t"
      "addl 44(%0), %%esi\n\t"
      JZ_NEXT
      : : "r"(junk) : "esi", "xmm7", "xmm0", "cc", "memory"
   );

   printf("\nNo complain sse2 xorpd\n");
   __asm__ __volatile__(
      "movups   0(%0),  %%xmm0\n\t"
      "movups   16(%0), %%xmm7\n\t"
      "xorpd    %%xmm0, %%xmm0\n\t"
      "movups   %%xmm0, 32(%0)\n\t"
      "movl 32(%0), %%esi\n\t"
      "addl 36(%0), %%esi\n\t"
      "addl 40(%0), %%esi\n\t"
      "addl 44(%0), %%esi\n\t"
      JZ_NEXT
      : : "r"(junk) : "esi", "xmm7", "xmm0", "cc", "memory"
   );
#endif

   free(junk);
   return 0;
}