mirror of
https://github.com/ioacademy-jikim/debugging
synced 2025-06-08 08:26:14 +00:00
111 lines
2.4 KiB
C
111 lines
2.4 KiB
C
|
|
#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;
|
|
}
|