• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <assert.h>
5 
6 typedef  unsigned char  UChar;
7 typedef  unsigned int   UInt;
8 
randomUInt(void)9 static UInt randomUInt ( void )
10 {
11    static UInt n = 0;
12    /* From "Numerical Recipes in C" 2nd Edition */
13    n = 1664525UL * n + 1013904223UL;
14    return n >> 17;
15 }
16 
maskmovq_mmx(UChar * regL,UChar * regR)17 void maskmovq_mmx ( UChar* regL, UChar* regR )
18 {
19    int i;
20    UChar* dst = malloc(8);
21    assert(dst);
22    for (i = 0; i < 8; i++)
23       dst[i] = 17 * (i+1);
24    __asm__ __volatile__(
25       "emms\n\t"
26       "movq (%0), %%mm1\n\t"
27       "movq (%1), %%mm2\n\t"
28       "movq %2, %%rdi\n\t"
29       "maskmovq %%mm1,%%mm2"
30       : /*out*/
31       : /*in*/ "r"(regL), "r"(regR), "r"(&dst[0])
32       : /*trash*/ "rdi", "memory", "cc"
33    );
34    for (i = 0; i < 8; i++)
35       printf("%02x", dst[i]);
36    free(dst);
37 }
38 
maskmovdqu_sse(UChar * regL,UChar * regR)39 void maskmovdqu_sse ( UChar* regL, UChar* regR )
40 {
41    int i;
42    UChar* dst = malloc(16);
43    assert(dst);
44    for (i = 0; i < 16; i++)
45       dst[i] = i;
46    __asm__ __volatile__(
47       "movups (%0), %%xmm1\n\t"
48       "movups (%1), %%xmm12\n\t"
49       "movq %2, %%rdi\n\t"
50       "maskmovdqu %%xmm12,%%xmm1\n\t"
51       "sfence"
52       : /*out*/
53       : /*in*/ "r"(regL), "r"(regR), "r"(dst)
54       : /*trash*/ "rdi", "memory", "cc"
55    );
56    for (i = 0; i < 16; i++)
57       printf("%02x", dst[i]);
58    free(dst);
59 }
60 
main(int argc,char ** argv)61 int main ( int argc, char** argv )
62 {
63    int i, j;
64 
65    /* mmx test */
66    {
67       UChar* regL = malloc(8);
68       UChar* regR = malloc(8);
69       assert(regL);
70       assert(regR);
71       for (i = 0; i < 10; i++) {
72          for (j = 0; j < 8; j++) {
73             regL[j] = (UChar)randomUInt();
74             printf("%02x", regL[j]);
75          }
76          printf(" ");
77          for (j = 0; j < 8; j++) {
78             regR[j] = (UChar)randomUInt();
79             printf("%02x", regR[j]);
80          }
81          printf(" ");
82          maskmovq_mmx( regR, regL );
83          printf("\n");
84       }
85    }
86 
87    /* sse test */
88    {
89       UChar* regL = malloc(16);
90       UChar* regR = malloc(16);
91       assert(regL);
92       assert(regR);
93       for (i = 0; i < 10; i++) {
94          for (j = 0; j < 16; j++) {
95             regL[j] = (UChar)randomUInt();
96             printf("%02x", regL[j]);
97          }
98          printf(" ");
99          for (j = 0; j < 16; j++) {
100             regR[j] = (UChar)randomUInt();
101             printf("%02x", regR[j]);
102          }
103          printf(" ");
104          maskmovdqu_sse( regR, regL );
105          printf("\n");
106       }
107    }
108 
109    return 0;
110 }
111