#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;
}