text: 
  #include <stdio.h>
  #include <stdlib.h>
  #include <assert.h>
  
  typedef  unsigned char  UChar;
  typedef  unsigned int   UInt;
  
  static UInt randomUInt ( void )
  {
     static UInt n = 0;
     /* From "Numerical Recipes in C" 2nd Edition */
     n = 1664525UL * n + 1013904223UL;
     return n >> 17;
  }
  
  void maskmovq_mmx ( UChar* regL, UChar* regR )
  {
     int i;
     UChar* dst = malloc(8);
     assert(dst);
     for (i = 0; i < 8; i++)
        dst[i] = 17 * (i+1);
     __asm__ __volatile__(
        "emms\n\t"
        "movq (%0), %%mm1\n\t"
        "movq (%1), %%mm2\n\t"
        "movl %2, %%edi\n\t"
        "maskmovq %%mm1,%%mm2"
        : /*out*/ 
        : /*in*/ "r"(regL), "r"(regR), "r"(&dst[0])
        : /*trash*/ "edi", "memory", "cc"
     );
     for (i = 0; i < 8; i++)
        printf("%02x", dst[i]);
     free(dst);
  }
  
  void maskmovdqu_sse ( UChar* regL, UChar* regR )
  {
     int i;
     UChar* dst = malloc(16);
     assert(dst);
     for (i = 0; i < 16; i++)
        dst[i] = i;
     __asm__ __volatile__(
        "movups (%0), %%xmm1\n\t"
        "movups (%1), %%xmm2\n\t"
        "movl %2, %%edi\n\t"
        "maskmovdqu %%xmm2,%%xmm1\n\t"
        "sfence"
        : /*out*/ 
        : /*in*/ "r"(regL), "r"(regR), "r"(dst)
        : /*trash*/ "edi", "memory", "cc"
     );
     for (i = 0; i < 16; i++)
        printf("%02x", dst[i]);
     free(dst);
  }
  
  int main ( int argc, char** argv )
  {
     int i, j;
  
     /* mmx test */
     {
        UChar* regL = malloc(8);
        UChar* regR = malloc(8);
        assert(regL);
        assert(regR);
        for (i = 0; i < 10; i++) {
           for (j = 0; j < 8; j++) {
              regL[j] = (UChar)randomUInt();
              printf("%02x", regL[j]);
           }
           printf(" ");
           for (j = 0; j < 8; j++) {
              regR[j] = (UChar)randomUInt();
              printf("%02x", regR[j]);
           }
           printf(" ");
           maskmovq_mmx( regR, regL );
           printf("\n");
        }
     }
  
     /* sse test */
     {
        UChar* regL = malloc(16);
        UChar* regR = malloc(16);
        assert(regL);
        assert(regR);
        for (i = 0; i < 10; i++) {
           for (j = 0; j < 16; j++) {
              regL[j] = (UChar)randomUInt();
              printf("%02x", regL[j]);
           }
           printf(" ");
           for (j = 0; j < 16; j++) {
              regR[j] = (UChar)randomUInt();
              printf("%02x", regR[j]);
           }
           printf(" ");
           maskmovdqu_sse( regR, regL );
           printf("\n");
        }
     }
  
     return 0;
  }
  