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