• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #include <stdio.h>
2 
3 #define TESTINST_DROTR(instruction, in, SA)        \
4 {                                                  \
5    unsigned long long out;                         \
6    __asm__ __volatile__(                           \
7       "move        $t0, $zero"     "\n\t"          \
8       "move        $t1, %1"        "\n\t"          \
9       instruction" $t0, $t1, "#SA  "\n\t"          \
10       "move        %0,  $t0"       "\n\t"          \
11       : "=r" (out)                                 \
12       : "r" (in)                                   \
13       : "t0", "t1"                                 \
14    );                                              \
15    printf("%s :: in 0x%llx, out 0x%llx, SA %d\n",  \
16           instruction, (long long) in, out, SA);   \
17 }
18 
19 #define TESTINST_DROTRV(instruction, in, SA)       \
20 {                                                  \
21    unsigned long long out;                         \
22    __asm__ __volatile__(                           \
23       "move        $t0, $zero"     "\n\t"          \
24       "move        $t1, %1"        "\n\t"          \
25       "move        $t2, %2"        "\n\t"          \
26       instruction" $t0, $t1, $t2"  "\n\t"          \
27       "move        %0,  $t0"       "\n\t"          \
28       : "=r" (out)                                 \
29       : "r" (in), "r" (SA)                         \
30       : "t0", "t1", "t2"                           \
31    );                                              \
32    printf("%s :: in 0x%llx, out 0x%llx, SA %d\n",  \
33           instruction, (long long) in, out, SA);   \
34 }
35 
36 #define TESTINST_DSWAP(instruction, in)       \
37 {                                             \
38    unsigned long long out;                    \
39    __asm__ __volatile__(                      \
40       "move        $t0, $0"   "\n\t"          \
41       "move        $t1, $0"   "\n\t"          \
42       "move        $t1, %1"   "\n\t"          \
43       instruction" $t0, $t1"  "\n\t"          \
44       "move        %0,  $t0"  "\n\t"          \
45       : "=r" (out)                            \
46       : "r" (in)                              \
47       : "t0", "t1"                            \
48    );                                         \
49    printf("%s :: in 0x%llx, out 0x%llx\n",    \
50           instruction, (long long) in, out);  \
51 }
52 
main()53 int main()
54 {
55 #if (__mips == 64) && (__mips_isa_rev >= 2)
56    printf("--- DROTR ---\n");
57    TESTINST_DROTR("drotr", 0x2000ffffffffffff, 16);
58    TESTINST_DROTR("drotr", 0xffff0000ffffffff, 16);
59    TESTINST_DROTR("drotr", 0x2000ffffffffffff, 8);
60    TESTINST_DROTR("drotr", 0x2000ffffffffffff, 4);
61    TESTINST_DROTR("drotr", 0x2000ffffffffffff, 5);
62    TESTINST_DROTR("drotr", 0x31415927ffffffff, 10);
63    TESTINST_DROTR("drotr", 0x2000ffffffffffff, 4);
64    TESTINST_DROTR("drotr", 0x2000ffffffffffff, 0);
65    TESTINST_DROTR("drotr", 0xeeeeffffffffffff, 16);
66    TESTINST_DROTR("drotr", 0x2000ffffffffbbbb, 31);
67    TESTINST_DROTR("drotr", 0x2000ffffffffffff, 16);
68    TESTINST_DROTR("drotr", 0x2000ffffffffffff, 0);
69    TESTINST_DROTR("drotr", 0x7fffffffffffffff, 16);
70    TESTINST_DROTR("drotr", 0x2000ffffffffffff, 2);
71    TESTINST_DROTR("drotr", 0x2000ffffffffffff, 24);
72    TESTINST_DROTR("drotr", 0xfffffff31415927f, 16);
73    TESTINST_DROTR("drotr", 0xffffffffffff0008, 3);
74    TESTINST_DROTR("drotr", 0xffff0000ffffffff, 16);
75    TESTINST_DROTR("drotr", 0xff0000ffffffffff, 16);
76    TESTINST_DROTR("drotr", 0xfffffffff0000fff, 16);
77 
78    printf("--- DROTR32 ---\n");
79    TESTINST_DROTR("drotr32", 0x2000ffffffffffff, 16);
80    TESTINST_DROTR("drotr32", 0xffff0000ffffffff, 16);
81    TESTINST_DROTR("drotr32", 0x2000ffffffffffff, 8);
82    TESTINST_DROTR("drotr32", 0x2000ffffffffffff, 4);
83    TESTINST_DROTR("drotr32", 0x2000ffffffffffff, 5);
84    TESTINST_DROTR("drotr32", 0x31415927ffffffff, 10);
85    TESTINST_DROTR("drotr32", 0x2000ffffffffffff, 4);
86    TESTINST_DROTR("drotr32", 0x2000ffffffffffff, 0);
87    TESTINST_DROTR("drotr32", 0xeeeeffffffffffff, 16);
88    TESTINST_DROTR("drotr32", 0x2000ffffffffffff, 31);
89    TESTINST_DROTR("drotr32", 0x2000ffffffffbbbb, 16);
90    TESTINST_DROTR("drotr32", 0x2000ffffffffffff, 0);
91    TESTINST_DROTR("drotr32", 0x7fffffffffffffff, 16);
92    TESTINST_DROTR("drotr32", 0x2000ffffffffffff, 2);
93    TESTINST_DROTR("drotr32", 0x2000ffffffffffff, 24);
94    TESTINST_DROTR("drotr32", 0xfffffff31415927f, 16);
95    TESTINST_DROTR("drotr32", 0xffffffffffff0008, 3);
96    TESTINST_DROTR("drotr32", 0xffff0000ffffffff, 16);
97    TESTINST_DROTR("drotr32", 0xff0000ffffffffff, 16);
98    TESTINST_DROTR("drotr32", 0xfffffffff0000fff, 16);
99 
100    printf("--- DROTRV ---\n");
101    TESTINST_DROTRV("drotrv", 0x2000ffffffffffff, 16);
102    TESTINST_DROTRV("drotrv", 0xffff0000ffffffff, 16);
103    TESTINST_DROTRV("drotrv", 0x2000ffffffffffff, 8);
104    TESTINST_DROTRV("drotrv", 0x2000ffffffffffff, 4);
105    TESTINST_DROTRV("drotrv", 0x2000ffffffffffff, 5);
106    TESTINST_DROTRV("drotrv", 0x31415927ffffffff, 10);
107    TESTINST_DROTRV("drotrv", 0x2000ffffffffffff, 4);
108    TESTINST_DROTRV("drotrv", 0x2000ffffffffffff, 0);
109    TESTINST_DROTRV("drotrv", 0xeeeeffffffffffff, 16);
110    TESTINST_DROTRV("drotrv", 0x2000ffffffffffff, 31);
111    TESTINST_DROTRV("drotrv", 0x2000ffffffffbbbb, 16);
112    TESTINST_DROTRV("drotrv", 0x2000ffffffffffff, 0);
113    TESTINST_DROTRV("drotrv", 0x7fffffffffffffff, 16);
114    TESTINST_DROTRV("drotrv", 0x2000ffffffffffff, 2);
115    TESTINST_DROTRV("drotrv", 0x2000ffffffffffff, 24);
116    TESTINST_DROTRV("drotrv", 0xfffffff31415927f, 16);
117    TESTINST_DROTRV("drotrv", 0xffffffffffff0008, 3);
118    TESTINST_DROTRV("drotrv", 0xffff0000ffffffff, 16);
119    TESTINST_DROTRV("drotrv", 0xff0000ffffffffff, 16);
120    TESTINST_DROTRV("drotrv", 0xfffffffff0000fff, 16);
121 
122    printf("--- DSBH ---\n");
123    TESTINST_DSWAP("dsbh", 0x2000ffffffffffff);
124    TESTINST_DSWAP("dsbh", 0xffff0000ffffffff);
125    TESTINST_DSWAP("dsbh", 0x2000ffffffffffff);
126    TESTINST_DSWAP("dsbh", 0x2000ffffeeeeffff);
127    TESTINST_DSWAP("dsbh", 0x2000ffffffffffff);
128    TESTINST_DSWAP("dsbh", 0x31415927ffffffff);
129    TESTINST_DSWAP("dsbh", 0x2000ffffffffffff);
130    TESTINST_DSWAP("dsbh", 0x2000ffffffccccff);
131    TESTINST_DSWAP("dsbh", 0xeeeeffffffffffff);
132    TESTINST_DSWAP("dsbh", 0x2000ffff0000ffff);
133    TESTINST_DSWAP("dsbh", 0x2000ffffffffbbbb);
134    TESTINST_DSWAP("dsbh", 0x2000ffffffffffff);
135    TESTINST_DSWAP("dsbh", 0x7fffffff5555ffff);
136    TESTINST_DSWAP("dsbh", 0x2000ffffff123123);
137    TESTINST_DSWAP("dsbh", 0x2000ffffffffffff);
138    TESTINST_DSWAP("dsbh", 0xfffffff31415927f);
139    TESTINST_DSWAP("dsbh", 0xffffffffffff0008);
140    TESTINST_DSWAP("dsbh", 0xffff0000ffff88ff);
141    TESTINST_DSWAP("dsbh", 0xff0000ffffffffff);
142    TESTINST_DSWAP("dsbh", 0xfff10ffff0000fff);
143 
144    printf("--- DSHD ---\n");
145    TESTINST_DSWAP("dshd", 0x2002ffffffffffff);
146    TESTINST_DSWAP("dshd", 0xffff0000ffffffff);
147    TESTINST_DSWAP("dshd", 0x2000ffffffffffff);
148    TESTINST_DSWAP("dshd", 0x2000ffffffddddff);
149    TESTINST_DSWAP("dshd", 0x2000ffffffffeeee);
150    TESTINST_DSWAP("dshd", 0x31415927ffffffff);
151    TESTINST_DSWAP("dshd", 0x2000ffffffffaaaa);
152    TESTINST_DSWAP("dshd", 0x2000ffffffbbbbff);
153    TESTINST_DSWAP("dshd", 0xeeeeff33ff22ffff);
154    TESTINST_DSWAP("dshd", 0x2000ffffffffffff);
155    TESTINST_DSWAP("dshd", 0x2000ffffffffbbbb);
156    TESTINST_DSWAP("dshd", 0x2000ffffffffffff);
157    TESTINST_DSWAP("dshd", 0x7fffffffddddffff);
158    TESTINST_DSWAP("dshd", 0x2000ffffffff2222);
159    TESTINST_DSWAP("dshd", 0x2000ffffffffffff);
160    TESTINST_DSWAP("dshd", 0xfffffff31415927f);
161    TESTINST_DSWAP("dshd", 0xffffffffffff0008);
162    TESTINST_DSWAP("dshd", 0xffff0000ffffffff);
163    TESTINST_DSWAP("dshd", 0xff0000ffffffffff);
164    TESTINST_DSWAP("dshd", 0xfffffffff0000fff);
165 
166    printf("--- WSBH ---\n");
167    TESTINST_DSWAP("wsbh", 0x2000ffffffffffff);
168    TESTINST_DSWAP("wsbh", 0xffff0000ffffffff);
169    TESTINST_DSWAP("wsbh", 0x2000ffffffffffff);
170    TESTINST_DSWAP("wsbh", 0x2000ffffeeeeffff);
171    TESTINST_DSWAP("wsbh", 0x2000ffffffffffff);
172    TESTINST_DSWAP("wsbh", 0x31415927ffffffff);
173    TESTINST_DSWAP("wsbh", 0x2000ffffffffffff);
174    TESTINST_DSWAP("wsbh", 0x2000ffffffccccff);
175    TESTINST_DSWAP("wsbh", 0xeeeeffffffffffff);
176    TESTINST_DSWAP("wsbh", 0x2000ffff0000ffff);
177    TESTINST_DSWAP("wsbh", 0x2000ffffffffbbbb);
178    TESTINST_DSWAP("wsbh", 0x2000ffffffffffff);
179    TESTINST_DSWAP("wsbh", 0x7fffffff5555ffff);
180    TESTINST_DSWAP("wsbh", 0x2000ffffff123123);
181    TESTINST_DSWAP("wsbh", 0x2000ffffffffffff);
182    TESTINST_DSWAP("wsbh", 0xfffffff31415927f);
183    TESTINST_DSWAP("wsbh", 0xffffffffffff0008);
184    TESTINST_DSWAP("wsbh", 0xffff0000ffff88ff);
185    TESTINST_DSWAP("wsbh", 0xff0000ffffffffff);
186    TESTINST_DSWAP("wsbh", 0xfff10ffff0000fff);
187 #else
188    printf("This test is testing mips64r2 instructions.\n");
189 #endif
190 
191    return 0;
192 }
193