v6intARM.c revision b32f58018498ea2225959b0ba11c18f0c433deef
1
2/* How to compile:
3   gcc -O -g -Wall -mcpu=cortex-a8 -o testarmv6int testarmv6int.c
4*/
5
6#include <stdio.h>
7
8/* test macros to generate and output the result of a single instruction */
9#define TESTINST2(instruction, RMval, RD, RM, carryin) \
10{ \
11	unsigned int out; \
12	unsigned int cpsr; \
13\
14	__asm__ volatile( \
15		"movs %3,%3;" \
16		"msrne cpsr_f,#(1<<29);" \
17		"msreq cpsr_f,#0;" \
18		"mov " #RM ",%2;" \
19                /* set #RD to 0x55555555 so we can see which parts get overwritten */ \
20                "mov " #RD ", #0x55" "\n\t" \
21                "orr " #RD "," #RD "," #RD ", LSL #8" "\n\t" \
22                "orr " #RD "," #RD "," #RD ", LSL #16" "\n\t" \
23		instruction ";" \
24		"mov %0," #RD ";" \
25		"mrs %1,cpsr;" \
26		: "=&r" (out), "=&r" (cpsr) \
27		: "r" (RMval), "r" (carryin) \
28		: #RD, #RM, "cc", "memory" \
29	); \
30	printf("%s :: rd 0x%08x rm 0x%08x, carryin %d, cpsr 0x%08x %c%c%c%c\n", \
31		instruction, out, RMval, \
32		carryin ? 1 : 0, \
33		cpsr & 0xffff0000, \
34		((1<<31) & cpsr) ? 'N' : ' ', \
35		((1<<30) & cpsr) ? 'Z' : ' ', \
36		((1<<29) & cpsr) ? 'C' : ' ', \
37		((1<<28) & cpsr) ? 'V' : ' ' \
38		); \
39}
40
41#define TESTINST3(instruction, RMval, RNval, RD, RM, RN, carryin) \
42{ \
43	unsigned int out; \
44	unsigned int cpsr; \
45\
46	__asm__ volatile( \
47		"movs %4,%4;" \
48		"msrne cpsr_f,#(1<<29);" \
49		"msreq cpsr_f,#0;" \
50		"mov " #RM ",%2;" \
51		"mov " #RN ",%3;" \
52		instruction ";" \
53		"mov %0," #RD ";" \
54		"mrs %1,cpsr;" \
55		: "=&r" (out), "=&r" (cpsr) \
56		: "r" (RMval), "r" (RNval), "r" (carryin) \
57		: #RD, #RM, #RN, "cc", "memory" \
58	); \
59	printf("%s :: rd 0x%08x rm 0x%08x, rn 0x%08x, carryin %d, cpsr 0x%08x %c%c%c%c\n", \
60		instruction, out, RMval, RNval, \
61		carryin ? 1 : 0, \
62		cpsr & 0xffff0000, \
63		((1<<31) & cpsr) ? 'N' : ' ', \
64		((1<<30) & cpsr) ? 'Z' : ' ', \
65		((1<<29) & cpsr) ? 'C' : ' ', \
66		((1<<28) & cpsr) ? 'V' : ' ' \
67		); \
68}
69
70#define TESTINST4(instruction, RMval, RNval, RSval, RD, RM, RN, RS, carryin) \
71{ \
72	unsigned int out; \
73	unsigned int cpsr; \
74\
75	__asm__ volatile( \
76		"movs %5,%5;" \
77		"msrne cpsr_f,#(1<<29);" \
78		"msreq cpsr_f,#0;" \
79		"mov " #RM ",%2;" \
80		"mov " #RN ",%3;" \
81		"mov " #RS ",%4;" \
82		instruction ";" \
83		"mov %0," #RD ";" \
84		"mrs %1,cpsr;" \
85		: "=&r" (out), "=&r" (cpsr) \
86		: "r" (RMval), "r" (RNval), "r" (RSval), "r" (carryin) \
87		: #RD, #RM, #RN, #RS, "cc", "memory" \
88	); \
89	printf("%s :: rd 0x%08x rm 0x%08x, rn 0x%08x rs 0x%08x, carryin %d, cpsr 0x%08x %c%c%c%c\n", \
90		instruction, out, RMval, RNval, RSval, \
91		carryin ? 1 : 0, \
92		cpsr & 0xffff0000, \
93		((1<<31) & cpsr) ? 'N' : ' ', \
94		((1<<30) & cpsr) ? 'Z' : ' ', \
95		((1<<29) & cpsr) ? 'C' : ' ', \
96		((1<<28) & cpsr) ? 'V' : ' ' \
97		); \
98}
99
100#define TESTINST4_2OUT(instruction, RDval, RD2val, RMval, RSval, RD, RD2, RM, RS, carryin) \
101{ \
102	unsigned int out; \
103	unsigned int out2; \
104	unsigned int cpsr; \
105\
106	__asm__ volatile( \
107		"movs %7,%7;" \
108		"msrne cpsr_f,#(1<<29);" \
109		"msreq cpsr_f,#0;" \
110		"mov " #RD ",%3;" \
111		"mov " #RD2 ",%4;" \
112		"mov " #RM ",%5;" \
113		"mov " #RS ",%6;" \
114		instruction ";" \
115		"mov %0," #RD ";" \
116		"mov %1," #RD2 ";" \
117		"mrs %2,cpsr;" \
118		: "=&r" (out), "=&r" (out2), "=&r" (cpsr) \
119		: "r" (RDval), "r" (RD2val), "r" (RMval), "r" (RSval), "r" (carryin) \
120		: #RD, #RD2, #RM, #RS, "cc", "memory" \
121	); \
122	printf("%s :: rd 0x%08x rd2 0x%08x, rm 0x%08x rs 0x%08x, carryin %d, cpsr 0x%08x %c%c%c%c\n", \
123		instruction, out, out2, RMval, RSval, \
124		carryin ? 1 : 0, \
125		cpsr & 0xffff0000, \
126		((1<<31) & cpsr) ? 'N' : ' ', \
127		((1<<30) & cpsr) ? 'Z' : ' ', \
128		((1<<29) & cpsr) ? 'C' : ' ', \
129		((1<<28) & cpsr) ? 'V' : ' ' \
130		); \
131}
132
133/* helpers */
134#define TESTCARRY { int c = 0; for (c = 0; c < 2; c++) {
135#define TESTCARRYEND }}
136
137
138
139
140int main(int argc, char **argv)
141{
142
143	printf("MOV\n");
144	TESTINST2("mov  r0, r1", 1, r0, r1, 0);
145	TESTINST2("cpy  r0, r1", 1, r0, r1, 0);
146	TESTINST2("mov  r0, #0", 0, r0, r1, 0);
147	TESTINST2("mov  r0, #1", 0, r0, r1, 0);
148	TESTCARRY
149	TESTINST2("movs r0, r1", 1, r0, r1, c);
150	TESTINST2("movs r0, r1", 0, r0, r1, c);
151	TESTINST2("movs r0, r1", 0x80000000, r0, r1, c);
152	TESTINST2("movs r0, #0", 0, r0, r1, c);
153	TESTINST2("movs r0, #1", 0, r0, r1, c);
154	TESTCARRYEND
155
156	printf("MVN\n");
157	TESTINST2("mvn  r0, r1", 1, r0, r1, 0);
158	TESTCARRY
159	TESTINST2("mvns r0, r1", 1, r0, r1, c);
160	TESTINST2("mvns r0, r1", 0, r0, r1, c);
161	TESTINST2("mvns r0, r1", 0x80000000, r0, r1, c);
162	TESTCARRYEND
163
164	printf("ADD\n");
165	TESTINST3("adds r0, r1, r2", 0, 0, r0, r1, r2, 0);
166	TESTINST3("adds r0, r1, r2", 0, 1, r0, r1, r2, 0);
167	TESTINST3("adds r0, r1, r2", 1, 0, r0, r1, r2, 0);
168	TESTINST3("adds r0, r1, r2", 1, 1, r0, r1, r2, 0);
169	TESTINST3("adds r0, r1, r2", 0, -1, r0, r1, r2, 0);
170	TESTINST3("adds r0, r1, r2", 1, -1, r0, r1, r2, 0);
171	TESTINST3("adds r0, r1, r2", 0x7fffffff, 1, r0, r1, r2, 0);
172	TESTINST3("adds r0, r1, r2", 0x80000000, -1, r0, r1, r2, 0);
173	TESTINST3("adds r0, r1, r2", 0x80000000, 0, r0, r1, r2, 0);
174
175	printf("ADC\n");
176	TESTINST3("adcs r0, r1, r2", 0, 0, r0, r1, r2, 0);
177	TESTINST3("adcs r0, r1, r2", 0, 0, r0, r1, r2, 1);
178
179	printf("LSL\n");
180	TESTINST3("lsl  r0, r1, r2", 0xffffffff, 0, r0, r1, r2, 0);
181	TESTINST3("lsl  r0, r1, r2", 0xffffffff, 1, r0, r1, r2, 0);
182	TESTINST3("lsl  r0, r1, r2", 0xffffffff, 2, r0, r1, r2, 0);
183	TESTINST3("lsl  r0, r1, r2", 0xffffffff, 31, r0, r1, r2, 0);
184	TESTINST3("lsl  r0, r1, r2", 0xffffffff, 32, r0, r1, r2, 0);
185	TESTINST3("lsl  r0, r1, r2", 0xffffffff, 33, r0, r1, r2, 0);
186	TESTINST3("lsl  r0, r1, r2", 0xffffffff, 63, r0, r1, r2, 0);
187	TESTINST3("lsl  r0, r1, r2", 0xffffffff, 64, r0, r1, r2, 0);
188	TESTINST3("lsl  r0, r1, r2", 0xffffffff, 255, r0, r1, r2, 0);
189	TESTINST3("lsl  r0, r1, r2", 0xffffffff, 256, r0, r1, r2, 0);
190
191	TESTINST3("lsl  r0, r1, r2", 0x1, 0, r0, r1, r2, 0);
192	TESTINST3("lsl  r0, r1, r2", 0x1, 1, r0, r1, r2, 0);
193	TESTINST3("lsl  r0, r1, r2", 0x1, 31, r0, r1, r2, 0);
194	TESTINST3("lsl  r0, r1, r2", 0x2, 31, r0, r1, r2, 0);
195
196	printf("LSLS\n");
197	TESTCARRY
198	TESTINST3("lsls r0, r1, r2", 0xffffffff, 0, r0, r1, r2, c);
199	TESTINST3("lsls r0, r1, r2", 0xffffffff, 1, r0, r1, r2, c);
200	TESTINST3("lsls r0, r1, r2", 0xffffffff, 2, r0, r1, r2, c);
201	TESTINST3("lsls r0, r1, r2", 0xffffffff, 31, r0, r1, r2, c);
202	TESTINST3("lsls r0, r1, r2", 0xffffffff, 32, r0, r1, r2, c);
203	TESTINST3("lsls r0, r1, r2", 0xffffffff, 33, r0, r1, r2, c);
204	TESTINST3("lsls r0, r1, r2", 0xffffffff, 63, r0, r1, r2, c);
205	TESTINST3("lsls r0, r1, r2", 0xffffffff, 64, r0, r1, r2, c);
206	TESTINST3("lsls r0, r1, r2", 0xffffffff, 255, r0, r1, r2, c);
207	TESTINST3("lsls r0, r1, r2", 0xffffffff, 256, r0, r1, r2, c);
208	TESTINST3("lsls r0, r1, r2", 0x1, 0, r0, r1, r2, c);
209	TESTINST3("lsls r0, r1, r2", 0x1, 1, r0, r1, r2, c);
210	TESTINST3("lsls r0, r1, r2", 0x1, 31, r0, r1, r2, c);
211	TESTINST3("lsls r0, r1, r2", 0x2, 31, r0, r1, r2, c);
212	TESTCARRYEND
213
214	printf("LSL immediate\n");
215	TESTCARRY
216	TESTINST2("lsl  r0, r1, #0", 0xffffffff, r0, r1, c);
217	TESTINST2("lsl  r0, r1, #1", 0xffffffff, r0, r1, c);
218	TESTINST2("lsl  r0, r1, #31", 0xffffffff, r0, r1, c);
219	TESTINST2("lsl  r0, r1, #0", 0x1, r0, r1, c);
220	TESTINST2("lsl  r0, r1, #1", 0x1, r0, r1, c);
221	TESTINST2("lsl  r0, r1, #31", 0x1, r0, r1, c);
222	TESTINST2("lsl  r0, r1, #31", 0x2, r0, r1, c);
223	TESTCARRYEND
224
225	printf("LSLS immediate\n");
226	TESTCARRY
227	TESTINST2("lsls r0, r1, #0", 0xffffffff, r0, r1, c);
228	TESTINST2("lsls r0, r1, #1", 0xffffffff, r0, r1, c);
229	TESTINST2("lsls r0, r1, #31", 0xffffffff, r0, r1, c);
230	TESTINST2("lsls r0, r1, #0", 0x1, r0, r1, c);
231	TESTINST2("lsls r0, r1, #1", 0x1, r0, r1, c);
232	TESTINST2("lsls r0, r1, #31", 0x1, r0, r1, c);
233	TESTINST2("lsls r0, r1, #31", 0x2, r0, r1, c);
234	TESTCARRYEND
235
236	printf("LSR\n");
237	TESTINST3("lsr  r0, r1, r2", 0xffffffff, 0, r0, r1, r2, 0);
238	TESTINST3("lsr  r0, r1, r2", 0xffffffff, 1, r0, r1, r2, 0);
239	TESTINST3("lsr  r0, r1, r2", 0xffffffff, 2, r0, r1, r2, 0);
240	TESTINST3("lsr  r0, r1, r2", 0xffffffff, 31, r0, r1, r2, 0);
241	TESTINST3("lsr  r0, r1, r2", 0xffffffff, 32, r0, r1, r2, 0);
242	TESTINST3("lsr  r0, r1, r2", 0xffffffff, 33, r0, r1, r2, 0);
243	TESTINST3("lsr  r0, r1, r2", 0xffffffff, 63, r0, r1, r2, 0);
244	TESTINST3("lsr  r0, r1, r2", 0xffffffff, 64, r0, r1, r2, 0);
245	TESTINST3("lsr  r0, r1, r2", 0xffffffff, 255, r0, r1, r2, 0);
246	TESTINST3("lsr  r0, r1, r2", 0xffffffff, 256, r0, r1, r2, 0);
247
248	printf("LSRS\n");
249	TESTCARRY
250	TESTINST3("lsrs r0, r1, r2", 0xffffffff, 0, r0, r1, r2, c);
251	TESTINST3("lsrs r0, r1, r2", 0xffffffff, 1, r0, r1, r2, c);
252	TESTINST3("lsrs r0, r1, r2", 0xffffffff, 2, r0, r1, r2, c);
253	TESTINST3("lsrs r0, r1, r2", 0xffffffff, 31, r0, r1, r2, c);
254	TESTINST3("lsrs r0, r1, r2", 0xffffffff, 32, r0, r1, r2, c);
255	TESTINST3("lsrs r0, r1, r2", 0xffffffff, 33, r0, r1, r2, c);
256	TESTINST3("lsrs r0, r1, r2", 0xffffffff, 63, r0, r1, r2, c);
257	TESTINST3("lsrs r0, r1, r2", 0xffffffff, 64, r0, r1, r2, c);
258	TESTINST3("lsrs r0, r1, r2", 0xffffffff, 255, r0, r1, r2, c);
259	TESTCARRYEND
260
261	printf("LSR immediate\n");
262	TESTINST2("lsr  r0, r1, #0", 0xffffffff, r0, r1, 0);
263	TESTINST2("lsr  r0, r1, #1", 0xffffffff, r0, r1, 0);
264	TESTINST2("lsr  r0, r1, #31", 0xffffffff, r0, r1, 0);
265	TESTINST2("lsr  r0, r1, #32", 0xffffffff, r0, r1, 0);
266	TESTINST2("lsr  r0, r1, #16", 0x00010000, r0, r1, 0);
267	TESTINST2("lsr  r0, r1, #17", 0x00010000, r0, r1, 0);
268	TESTINST2("lsr  r0, r1, #18", 0x00010000, r0, r1, 0);
269
270	printf("LSRS immediate\n");
271	TESTCARRY
272	TESTINST2("lsrs r0, r1, #0", 0xffffffff, r0, r1, c);
273	TESTINST2("lsrs r0, r1, #1", 0xffffffff, r0, r1, c);
274	TESTINST2("lsrs r0, r1, #31", 0xffffffff, r0, r1, c);
275	TESTINST2("lsrs r0, r1, #32", 0xffffffff, r0, r1, c);
276	TESTINST2("lsrs r0, r1, #16", 0x00010000, r0, r1, c);
277	TESTINST2("lsrs r0, r1, #17", 0x00010000, r0, r1, c);
278	TESTINST2("lsrs r0, r1, #18", 0x00010000, r0, r1, c);
279	TESTCARRYEND
280
281	printf("ASR\n");
282	TESTCARRY
283	TESTINST3("asr  r0, r1, r2", 0xffffffff, 0, r0, r1, r2, c);
284	TESTINST3("asr  r0, r1, r2", 0xffffffff, 1, r0, r1, r2, c);
285	TESTINST3("asr  r0, r1, r2", 0xffffffff, 2, r0, r1, r2, c);
286	TESTINST3("asr  r0, r1, r2", 0xffffffff, 31, r0, r1, r2, c);
287	TESTINST3("asr  r0, r1, r2", 0xffffffff, 32, r0, r1, r2, c);
288	TESTINST3("asr  r0, r1, r2", 0xffffffff, 33, r0, r1, r2, c);
289	TESTINST3("asr  r0, r1, r2", 0xffffffff, 63, r0, r1, r2, c);
290	TESTINST3("asr  r0, r1, r2", 0xffffffff, 64, r0, r1, r2, c);
291	TESTINST3("asr  r0, r1, r2", 0xffffffff, 255, r0, r1, r2, c);
292	TESTINST3("asr  r0, r1, r2", 0xffffffff, 256, r0, r1, r2, c);
293	TESTINST3("asr  r0, r1, r2", 0x7fffffff, 0, r0, r1, r2, c);
294	TESTINST3("asr  r0, r1, r2", 0x7fffffff, 1, r0, r1, r2, c);
295	TESTINST3("asr  r0, r1, r2", 0x7fffffff, 2, r0, r1, r2, c);
296	TESTINST3("asr  r0, r1, r2", 0x7fffffff, 31, r0, r1, r2, c);
297	TESTINST3("asr  r0, r1, r2", 0x7fffffff, 32, r0, r1, r2, c);
298	TESTINST3("asr  r0, r1, r2", 0x7fffffff, 33, r0, r1, r2, c);
299	TESTINST3("asr  r0, r1, r2", 0x7fffffff, 63, r0, r1, r2, c);
300	TESTINST3("asr  r0, r1, r2", 0x7fffffff, 64, r0, r1, r2, c);
301	TESTINST3("asr  r0, r1, r2", 0x7fffffff, 255, r0, r1, r2, c);
302	TESTINST3("asr  r0, r1, r2", 0x7fffffff, 256, r0, r1, r2, c);
303	TESTCARRYEND
304
305	printf("ASRS\n");
306	TESTCARRY
307	TESTINST3("asrs r0, r1, r2", 0xffffffff, 0, r0, r1, r2, c);
308	TESTINST3("asrs r0, r1, r2", 0xffffffff, 1, r0, r1, r2, c);
309	TESTINST3("asrs r0, r1, r2", 0xffffffff, 2, r0, r1, r2, c);
310	TESTINST3("asrs r0, r1, r2", 0xffffffff, 31, r0, r1, r2, c);
311	TESTINST3("asrs r0, r1, r2", 0xffffffff, 32, r0, r1, r2, c);
312	TESTINST3("asrs r0, r1, r2", 0xffffffff, 33, r0, r1, r2, c);
313	TESTINST3("asrs r0, r1, r2", 0xffffffff, 63, r0, r1, r2, c);
314	TESTINST3("asrs r0, r1, r2", 0xffffffff, 64, r0, r1, r2, c);
315	TESTINST3("asrs r0, r1, r2", 0xffffffff, 255, r0, r1, r2, c);
316	TESTINST3("asrs r0, r1, r2", 0xffffffff, 256, r0, r1, r2, c);
317	TESTINST3("asrs r0, r1, r2", 0x7fffffff, 0, r0, r1, r2, c);
318	TESTINST3("asrs r0, r1, r2", 0x7fffffff, 1, r0, r1, r2, c);
319	TESTINST3("asrs r0, r1, r2", 0x7fffffff, 2, r0, r1, r2, c);
320	TESTINST3("asrs r0, r1, r2", 0x7fffffff, 31, r0, r1, r2, c);
321	TESTINST3("asrs r0, r1, r2", 0x7fffffff, 32, r0, r1, r2, c);
322	TESTINST3("asrs r0, r1, r2", 0x7fffffff, 33, r0, r1, r2, c);
323	TESTINST3("asrs r0, r1, r2", 0x7fffffff, 63, r0, r1, r2, c);
324	TESTINST3("asrs r0, r1, r2", 0x7fffffff, 64, r0, r1, r2, c);
325	TESTINST3("asrs r0, r1, r2", 0x7fffffff, 255, r0, r1, r2, c);
326	TESTINST3("asrs r0, r1, r2", 0x7fffffff, 256, r0, r1, r2, c);
327	TESTCARRYEND
328
329	TESTCARRY
330	TESTINST3("asrs r0, r1, r2", 0x8, 0, r0, r1, r2, c);
331	TESTINST3("asrs r0, r1, r2", 0x8, 1, r0, r1, r2, c);
332	TESTINST3("asrs r0, r1, r2", 0x8, 2, r0, r1, r2, c);
333	TESTINST3("asrs r0, r1, r2", 0x8, 3, r0, r1, r2, c);
334	TESTINST3("asrs r0, r1, r2", 0x8, 4, r0, r1, r2, c);
335	TESTINST3("asrs r0, r1, r2", 0x8, 5, r0, r1, r2, c);
336	TESTCARRYEND
337
338	TESTINST3("asrs r0, r1, r2", 0x80000001, 1, r0, r1, r2, 0);
339	TESTINST3("asrs r0, r1, r2", 0x80000001, 2, r0, r1, r2, 0);
340
341	printf("ASR immediate\n");
342	TESTINST2("asr  r0, r1, #0", 0xffffffff, r0, r1, 0);
343	TESTINST2("asr  r0, r1, #1", 0xffffffff, r0, r1, 0);
344	TESTINST2("asr  r0, r1, #31", 0xffffffff, r0, r1, 0);
345	TESTINST2("asr  r0, r1, #32", 0xffffffff, r0, r1, 0);
346	TESTINST2("asr  r0, r1, #0", 0x7fffffff, r0, r1, 0);
347	TESTINST2("asr  r0, r1, #1", 0x7fffffff, r0, r1, 0);
348	TESTINST2("asr  r0, r1, #31", 0x7fffffff, r0, r1, 0);
349	TESTINST2("asr  r0, r1, #32", 0x7fffffff, r0, r1, 0);
350	TESTINST2("asr  r0, r1, #16", 0x00010000, r0, r1, 0);
351	TESTINST2("asr  r0, r1, #17", 0x00010000, r0, r1, 0);
352	TESTINST2("asr  r0, r1, #18", 0x00010000, r0, r1, 0);
353
354	printf("ASRS immediate\n");
355	TESTCARRY
356	TESTINST2("asrs r0, r1, #0", 0xffffffff, r0, r1, c);
357	TESTINST2("asrs r0, r1, #1", 0xffffffff, r0, r1, c);
358	TESTINST2("asrs r0, r1, #31", 0xffffffff, r0, r1, c);
359	TESTINST2("asrs r0, r1, #32", 0xffffffff, r0, r1, c);
360	TESTINST2("asrs r0, r1, #0", 0x7fffffff, r0, r1, c);
361	TESTINST2("asrs r0, r1, #1", 0x7fffffff, r0, r1, c);
362	TESTINST2("asrs r0, r1, #31", 0x7fffffff, r0, r1, c);
363	TESTINST2("asrs r0, r1, #32", 0x7fffffff, r0, r1, c);
364	TESTINST2("asrs r0, r1, #16", 0x00010000, r0, r1, c);
365	TESTINST2("asrs r0, r1, #17", 0x00010000, r0, r1, c);
366	TESTINST2("asrs r0, r1, #18", 0x00010000, r0, r1, c);
367	TESTCARRYEND
368
369	printf("ROR\n");
370	TESTCARRY
371	TESTINST3("ror  r0, r1, r2", 0x00088000, 0, r0, r1, r2, c);
372	TESTINST3("ror  r0, r1, r2", 0x80088000, 1, r0, r1, r2, c);
373	TESTINST3("ror  r0, r1, r2", 0x00088000, 1, r0, r1, r2, c);
374	TESTINST3("ror  r0, r1, r2", 0x00088000, 2, r0, r1, r2, c);
375	TESTINST3("ror  r0, r1, r2", 0x00088000, 31, r0, r1, r2, c);
376	TESTINST3("ror  r0, r1, r2", 0x00088000, 32, r0, r1, r2, c);
377	TESTINST3("ror  r0, r1, r2", 0x00088000, 33, r0, r1, r2, c);
378	TESTINST3("ror  r0, r1, r2", 0x00088000, 63, r0, r1, r2, c);
379	TESTINST3("ror  r0, r1, r2", 0x00088000, 64, r0, r1, r2, c);
380	TESTINST3("ror  r0, r1, r2", 0x00088000, 255, r0, r1, r2, c);
381	TESTINST3("ror  r0, r1, r2", 0x00088000, 256, r0, r1, r2, c);
382	TESTINST3("ror  r0, r1, r2", 0x80088000, 256, r0, r1, r2, c);
383	TESTINST3("ror  r0, r1, r2", 0x00088000, 257, r0, r1, r2, c);
384	TESTCARRYEND
385
386	printf("RORS\n");
387	TESTCARRY
388	TESTINST3("rors r0, r1, r2", 0x00088000, 0, r0, r1, r2, c);
389	TESTINST3("rors r0, r1, r2", 0x80088000, 0, r0, r1, r2, c);
390	TESTINST3("rors r0, r1, r2", 0x00088000, 1, r0, r1, r2, c);
391	TESTINST3("rors r0, r1, r2", 0x00088000, 2, r0, r1, r2, c);
392	TESTINST3("rors r0, r1, r2", 0x00088000, 31, r0, r1, r2, c);
393	TESTINST3("rors r0, r1, r2", 0x00088000, 32, r0, r1, r2, c);
394	TESTINST3("rors r0, r1, r2", 0x00088000, 33, r0, r1, r2, c);
395	TESTINST3("rors r0, r1, r2", 0x00088000, 63, r0, r1, r2, c);
396	TESTINST3("rors r0, r1, r2", 0x00088000, 64, r0, r1, r2, c);
397	TESTINST3("rors r0, r1, r2", 0x00088000, 255, r0, r1, r2, c);
398	TESTINST3("rors r0, r1, r2", 0x00088000, 256, r0, r1, r2, c);
399	TESTINST3("rors r0, r1, r2", 0x80088000, 256, r0, r1, r2, c);
400	TESTINST3("rors r0, r1, r2", 0x00088000, 257, r0, r1, r2, c);
401	TESTCARRYEND
402
403	printf("ROR immediate\n");
404	TESTCARRY
405	TESTINST2("ror  r0, r1, #0", 0x00088000, r0, r1, c);
406	TESTINST2("ror  r0, r1, #1", 0x00088000, r0, r1, c);
407	TESTINST2("ror  r0, r1, #31", 0x00088000, r0, r1, c);
408	TESTINST2("ror  r0, r1, #16", 0x00010000, r0, r1, c);
409	TESTINST2("ror  r0, r1, #17", 0x00010000, r0, r1, c);
410	TESTINST2("ror  r0, r1, #18", 0x00010000, r0, r1, c);
411	TESTCARRYEND
412
413	printf("RORS immediate\n");
414	TESTCARRY
415	TESTINST2("rors r0, r1, #0", 0x00088000, r0, r1, c);
416	TESTINST2("rors r0, r1, #1", 0x00088000, r0, r1, c);
417	TESTINST2("rors r0, r1, #31", 0x00088000, r0, r1, c);
418	TESTINST2("rors r0, r1, #16", 0x00010000, r0, r1, c);
419	TESTINST2("rors r0, r1, #17", 0x00010000, r0, r1, c);
420	TESTINST2("rors r0, r1, #18", 0x00010000, r0, r1, c);
421	TESTCARRYEND
422
423	printf("shift with barrel shifter\n");
424	TESTCARRY
425	TESTINST4("add  r0, r1, r2, lsl r3", 0, 0xffffffff, 0, r0, r1, r2, r3, c);
426	TESTINST4("add  r0, r1, r2, lsl r3", 0, 0xffffffff, 1, r0, r1, r2, r3, c);
427	TESTINST4("add  r0, r1, r2, lsl r3", 0, 0xffffffff, 31, r0, r1, r2, r3, c);
428	TESTINST4("add  r0, r1, r2, lsl r3", 0, 0xffffffff, 32, r0, r1, r2, r3, c);
429	TESTINST4("add  r0, r1, r2, lsl r3", 0, 0xffffffff, 255, r0, r1, r2, r3, c);
430	TESTINST4("add  r0, r1, r2, lsl r3", 0, 0xffffffff, 256, r0, r1, r2, r3, c);
431	TESTINST4("add  r0, r1, r2, lsr r3", 0, 0xffffffff, 0, r0, r1, r2, r3, c);
432	TESTINST4("add  r0, r1, r2, lsr r3", 0, 0xffffffff, 1, r0, r1, r2, r3, c);
433	TESTINST4("add  r0, r1, r2, lsr r3", 0, 0xffffffff, 31, r0, r1, r2, r3, c);
434	TESTINST4("add  r0, r1, r2, lsr r3", 0, 0xffffffff, 32, r0, r1, r2, r3, c);
435	TESTINST4("add  r0, r1, r2, lsr r3", 0, 0xffffffff, 255, r0, r1, r2, r3, c);
436	TESTINST4("add  r0, r1, r2, lsr r3", 0, 0xffffffff, 256, r0, r1, r2, r3, c);
437	TESTINST4("add  r0, r1, r2, asr r3", 0, 0x7fffffff, 0, r0, r1, r2, r3, c);
438	TESTINST4("add  r0, r1, r2, asr r3", 0, 0x7fffffff, 1, r0, r1, r2, r3, c);
439	TESTINST4("add  r0, r1, r2, asr r3", 0, 0x7fffffff, 31, r0, r1, r2, r3, c);
440	TESTINST4("add  r0, r1, r2, asr r3", 0, 0x7fffffff, 32, r0, r1, r2, r3, c);
441	TESTINST4("add  r0, r1, r2, asr r3", 0, 0x7fffffff, 255, r0, r1, r2, r3, c);
442	TESTINST4("add  r0, r1, r2, asr r3", 0, 0x7fffffff, 256, r0, r1, r2, r3, c);
443	TESTINST4("add  r0, r1, r2, lsr r3", 0, 0xffffffff, 256, r0, r1, r2, r3, c);
444	TESTCARRYEND
445
446	TESTCARRY
447	TESTINST4("add  r0, r1, r2, asr r3", 0, 0x8, 0, r0, r1, r2, r3, c);
448	TESTINST4("add  r0, r1, r2, asr r3", 0, 0x8, 1, r0, r1, r2, r3, c);
449	TESTINST4("add  r0, r1, r2, asr r3", 0, 0x8, 2, r0, r1, r2, r3, c);
450	TESTINST4("add  r0, r1, r2, asr r3", 0, 0x8, 3, r0, r1, r2, r3, c);
451	TESTINST4("add  r0, r1, r2, asr r3", 0, 0x8, 4, r0, r1, r2, r3, c);
452	TESTINST4("add  r0, r1, r2, asr r3", 0, 0x8, 5, r0, r1, r2, r3, c);
453	TESTCARRYEND
454
455	TESTCARRY
456	TESTINST4("add  r0, r1, r2, ror r3", 0, 0x00088000, 0, r0, r1, r2, r3, c);
457	TESTINST4("add  r0, r1, r2, ror r3", 0, 0x80088000, 0, r0, r1, r2, r3, c);
458	TESTINST4("add  r0, r1, r2, ror r3", 0, 0x00088000, 1, r0, r1, r2, r3, c);
459	TESTINST4("add  r0, r1, r2, ror r3", 0, 0x00088000, 31, r0, r1, r2, r3, c);
460	TESTINST4("add  r0, r1, r2, ror r3", 0, 0x00088000, 32, r0, r1, r2, r3, c);
461	TESTINST4("add  r0, r1, r2, ror r3", 0, 0x00088000, 255, r0, r1, r2, r3, c);
462	TESTINST4("add  r0, r1, r2, ror r3", 0, 0x00088000, 256, r0, r1, r2, r3, c);
463	TESTINST4("add  r0, r1, r2, ror r3", 0, 0x80088000, 256, r0, r1, r2, r3, c);
464	TESTINST4("add  r0, r1, r2, ror r3", 0, 0x00088000, 257, r0, r1, r2, r3, c);
465	TESTCARRYEND
466
467	TESTCARRY
468	TESTINST4("adds r0, r1, r2, lsl r3", 0, 0xffffffff, 0, r0, r1, r2, r3, c);
469	TESTINST4("adds r0, r1, r2, lsl r3", 0, 0xffffffff, 1, r0, r1, r2, r3, c);
470	TESTINST4("adds r0, r1, r2, lsl r3", 0, 0xffffffff, 31, r0, r1, r2, r3, c);
471	TESTINST4("adds r0, r1, r2, lsl r3", 0, 0xffffffff, 32, r0, r1, r2, r3, c);
472	TESTINST4("adds r0, r1, r2, lsl r3", 0, 0xffffffff, 255, r0, r1, r2, r3, c);
473	TESTINST4("adds r0, r1, r2, lsl r3", 0, 0xffffffff, 256, r0, r1, r2, r3, c);
474	TESTINST4("adds r0, r1, r2, lsr r3", 0, 0xffffffff, 0, r0, r1, r2, r3, c);
475	TESTINST4("adds r0, r1, r2, lsr r3", 0, 0xffffffff, 1, r0, r1, r2, r3, c);
476	TESTINST4("adds r0, r1, r2, lsr r3", 0, 0xffffffff, 31, r0, r1, r2, r3, c);
477	TESTINST4("adds r0, r1, r2, lsr r3", 0, 0xffffffff, 32, r0, r1, r2, r3, c);
478	TESTINST4("adds r0, r1, r2, lsr r3", 0, 0xffffffff, 255, r0, r1, r2, r3, c);
479	TESTINST4("adds r0, r1, r2, lsr r3", 0, 0xffffffff, 256, r0, r1, r2, r3, c);
480
481	TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 0, r0, r1, r2, r3, c);
482	TESTINST4("adds r0, r1, r2, ror r3", 0, 0x80088000, 0, r0, r1, r2, r3, c);
483	TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 1, r0, r1, r2, r3, c);
484	TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 31, r0, r1, r2, r3, c);
485	TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 32, r0, r1, r2, r3, c);
486	TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 255, r0, r1, r2, r3, c);
487	TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 256, r0, r1, r2, r3, c);
488	TESTINST4("adds r0, r1, r2, ror r3", 0, 0x80088000, 256, r0, r1, r2, r3, c);
489	TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 257, r0, r1, r2, r3, c);
490	TESTCARRYEND
491
492	TESTCARRY
493	TESTINST4("adcs r0, r1, r2, lsl r3", 0, 0xffffffff, 0, r0, r1, r2, r3, c);
494	TESTINST4("adcs r0, r1, r2, lsr r3", 0, 0xffffffff, 0, r0, r1, r2, r3, c);
495	TESTINST4("adcs r0, r1, r2, lsl r3", 0, 0xffffffff, 1, r0, r1, r2, r3, c);
496	TESTINST4("adcs r0, r1, r2, lsr r3", 0, 0xffffffff, 1, r0, r1, r2, r3, c);
497	TESTCARRYEND
498
499	printf("MUL\n");
500	TESTINST3("mul  r0, r1, r2", 0, 0, r0, r1, r2, 0);
501	TESTINST3("mul  r0, r1, r2", 0xffffffff, 0, r0, r1, r2, 0);
502	TESTINST3("mul  r0, r1, r2", 0, 0xffffffff, r0, r1, r2, 0);
503	TESTINST3("mul  r0, r1, r2", 0xffffffff, 0xffffffff, r0, r1, r2, 0);
504	TESTINST3("mul  r0, r1, r2", 0x7fffffff, 0x7fffffff, r0, r1, r2, 0);
505	TESTINST3("mul  r0, r1, r2", 0x0000ffff, 0x0000ffff, r0, r1, r2, 0);
506
507	printf("MULS\n");
508	TESTINST3("muls r0, r1, r2", 0, 0, r0, r1, r2, 0);
509	TESTINST3("muls r0, r1, r2", 0xffffffff, 0, r0, r1, r2, 0);
510	TESTINST3("muls r0, r1, r2", 0, 0xffffffff, r0, r1, r2, 0);
511	TESTINST3("muls r0, r1, r2", 0xffffffff, 0xffffffff, r0, r1, r2, 0);
512	TESTINST3("muls r0, r1, r2", 0x7fffffff, 0x7fffffff, r0, r1, r2, 0);
513	TESTINST3("muls r0, r1, r2", 0x0000ffff, 0x0000ffff, r0, r1, r2, 0);
514
515	printf("MLA\n");
516	TESTINST4("mla  r0, r1, r2, r3", 0, 0, 1, r0, r1, r2, r3, 0);
517	TESTINST4("mla  r0, r1, r2, r3", 0xffffffff, 0, 1, r0, r1, r2, r3, 0);
518	TESTINST4("mla  r0, r1, r2, r3", 0, 0xffffffff, 1, r0, r1, r2, r3, 0);
519	TESTINST4("mla  r0, r1, r2, r3", 0xffffffff, 0xffffffff, 1, r0, r1, r2, r3, 0);
520	TESTINST4("mla  r0, r1, r2, r3", 0x7fffffff, 0x7fffffff, 1, r0, r1, r2, r3, 0);
521	TESTINST4("mla  r0, r1, r2, r3", 0x0000ffff, 0x0000ffff, 1, r0, r1, r2, r3, 0);
522
523	printf("MLAS\n");
524	TESTINST4("mlas r0, r1, r2, r3", 0, 0, 1, r0, r1, r2, r3, 0);
525	TESTINST4("mlas r0, r1, r2, r3", 0xffffffff, 0, 1, r0, r1, r2, r3, 0);
526	TESTINST4("mlas r0, r1, r2, r3", 0, 0xffffffff, 1, r0, r1, r2, r3, 0);
527	TESTINST4("mlas r0, r1, r2, r3", 0xffffffff, 0xffffffff, 1, r0, r1, r2, r3, 0);
528	TESTINST4("mlas r0, r1, r2, r3", 0x7fffffff, 0x7fffffff, 1, r0, r1, r2, r3, 0);
529	TESTINST4("mlas r0, r1, r2, r3", 0x0000ffff, 0x0000ffff, 1, r0, r1, r2, r3, 0);
530
531	printf("MLS\n");
532	TESTINST4("mls  r0, r1, r2, r3", 0, 0, 1, r0, r1, r2, r3, 0);
533	TESTINST4("mls  r0, r1, r2, r3", 0xffffffff, 0, 1, r0, r1, r2, r3, 0);
534	TESTINST4("mls  r0, r1, r2, r3", 0, 0xffffffff, 1, r0, r1, r2, r3, 0);
535	TESTINST4("mls  r0, r1, r2, r3", 0xffffffff, 0xffffffff, 1, r0, r1, r2, r3, 0);
536	TESTINST4("mls  r0, r1, r2, r3", 0x7fffffff, 0x7fffffff, 1, r0, r1, r2, r3, 0);
537	TESTINST4("mls  r0, r1, r2, r3", 0x0000ffff, 0x0000ffff, 1, r0, r1, r2, r3, 0);
538
539	printf("UMULL\n");
540	TESTINST4_2OUT("umull  r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0);
541	TESTINST4_2OUT("umull  r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0);
542	TESTINST4_2OUT("umull  r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0);
543	TESTINST4_2OUT("umull  r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0);
544	TESTINST4_2OUT("umull  r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0);
545	TESTINST4_2OUT("umull  r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0);
546	TESTINST4_2OUT("umulls r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0);
547	TESTINST4_2OUT("umulls r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0);
548	TESTINST4_2OUT("umulls r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0);
549	TESTINST4_2OUT("umulls r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0);
550	TESTINST4_2OUT("umulls r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0);
551	TESTINST4_2OUT("umulls r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0);
552
553	printf("SMULL\n");
554	TESTINST4_2OUT("smull  r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0);
555	TESTINST4_2OUT("smull  r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0);
556	TESTINST4_2OUT("smull  r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0);
557	TESTINST4_2OUT("smull  r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0);
558	TESTINST4_2OUT("smull  r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0);
559	TESTINST4_2OUT("smull  r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0);
560	TESTINST4_2OUT("smulls r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0);
561	TESTINST4_2OUT("smulls r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0);
562	TESTINST4_2OUT("smulls r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0);
563	TESTINST4_2OUT("smulls r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0);
564	TESTINST4_2OUT("smulls r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0);
565	TESTINST4_2OUT("smulls r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0);
566
567	printf("UMLAL\n");
568	TESTINST4_2OUT("umlal  r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0);
569	TESTINST4_2OUT("umlal  r0, r1, r2, r3", 0, 1, 0, 0, r0, r1, r2, r3, 0);
570	TESTINST4_2OUT("umlal  r0, r1, r2, r3", 1, 1, 0, 0, r0, r1, r2, r3, 0);
571	TESTINST4_2OUT("umlal  r0, r1, r2, r3", 0, 0xffffffff, 1, 1, r0, r1, r2, r3, 0);
572	TESTINST4_2OUT("umlal  r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0);
573	TESTINST4_2OUT("umlal  r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0);
574	TESTINST4_2OUT("umlal  r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0);
575	TESTINST4_2OUT("umlal  r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0);
576	TESTINST4_2OUT("umlal  r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0);
577	TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0);
578	TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 1, 0, 0, r0, r1, r2, r3, 0);
579	TESTINST4_2OUT("umlals r0, r1, r2, r3", 1, 1, 0, 0, r0, r1, r2, r3, 0);
580	TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0xffffffff, 1, 1, r0, r1, r2, r3, 0);
581	TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0);
582	TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0);
583	TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0);
584	TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0);
585	TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0);
586
587	printf("SMLAL\n");
588	TESTINST4_2OUT("smlal  r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0);
589	TESTINST4_2OUT("smlal  r0, r1, r2, r3", 0, 1, 0, 0, r0, r1, r2, r3, 0);
590	TESTINST4_2OUT("smlal  r0, r1, r2, r3", 1, 1, 0, 0, r0, r1, r2, r3, 0);
591	TESTINST4_2OUT("smlal  r0, r1, r2, r3", 0, 0xffffffff, 1, 1, r0, r1, r2, r3, 0);
592	TESTINST4_2OUT("smlal  r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0);
593	TESTINST4_2OUT("smlal  r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0);
594	TESTINST4_2OUT("smlal  r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0);
595	TESTINST4_2OUT("smlal  r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0);
596	TESTINST4_2OUT("smlal  r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0);
597	TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0);
598	TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 1, 0, 0, r0, r1, r2, r3, 0);
599	TESTINST4_2OUT("smlals r0, r1, r2, r3", 1, 1, 0, 0, r0, r1, r2, r3, 0);
600	TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0xffffffff, 1, 1, r0, r1, r2, r3, 0);
601	TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0);
602	TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0);
603	TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0);
604	TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0);
605	TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0);
606
607	printf("CLZ\n");
608	TESTCARRY
609	TESTINST2("clz  r0, r1", 0, r0, r1, c);
610	TESTINST2("clz  r0, r1", 1, r0, r1, c);
611	TESTINST2("clz  r0, r1", 0x10, r0, r1, c);
612	TESTINST2("clz  r0, r1", 0xffffffff, r0, r1, c);
613	TESTCARRYEND
614
615	printf("extend instructions\n");
616	TESTINST2("uxtb r0, r1", 0, r0, r1, 0);
617	TESTINST2("uxtb r0, r1", 1, r0, r1, 0);
618	TESTINST2("uxtb r0, r1", 0xff, r0, r1, 0);
619	TESTINST2("uxtb r0, r1", 0xffffffff, r0, r1, 0);
620	TESTINST2("sxtb r0, r1", 0, r0, r1, 0);
621	TESTINST2("sxtb r0, r1", 1, r0, r1, 0);
622	TESTINST2("sxtb r0, r1", 0xff, r0, r1, 0);
623	TESTINST2("sxtb r0, r1", 0xffffffff, r0, r1, 0);
624
625	TESTINST2("uxth r0, r1", 0, r0, r1, 0);
626	TESTINST2("uxth r0, r1", 1, r0, r1, 0);
627	TESTINST2("uxth r0, r1", 0xffff, r0, r1, 0);
628	TESTINST2("uxth r0, r1", 0xffffffff, r0, r1, 0);
629	TESTINST2("sxth r0, r1", 0, r0, r1, 0);
630	TESTINST2("sxth r0, r1", 1, r0, r1, 0);
631	TESTINST2("sxth r0, r1", 0x7fff, r0, r1, 0);
632	TESTINST2("sxth r0, r1", 0xffff, r0, r1, 0);
633	TESTINST2("sxth r0, r1", 0x10ffff, r0, r1, 0);
634	TESTINST2("sxth r0, r1", 0x107fff, r0, r1, 0);
635	TESTINST2("sxth r0, r1", 0xffffffff, r0, r1, 0);
636
637	TESTINST2("uxtb r0, r1, ror #0", 0x000000ff, r0, r1, 0);
638	TESTINST2("uxtb r0, r1, ror #8", 0x000000ff, r0, r1, 0);
639	TESTINST2("uxtb r0, r1, ror #8", 0x0000ff00, r0, r1, 0);
640	TESTINST2("uxtb r0, r1, ror #16", 0x00ff0000, r0, r1, 0);
641	TESTINST2("uxtb r0, r1, ror #24", 0xff000000, r0, r1, 0);
642
643	TESTINST2("uxtb16 r0, r1", 0xffffffff, r0, r1, 0);
644	TESTINST2("uxtb16 r0, r1, ror #16", 0x0000ffff, r0, r1, 0);
645	TESTINST2("sxtb16 r0, r1", 0xffffffff, r0, r1, 0);
646	TESTINST2("sxtb16 r0, r1", 0x00ff00ff, r0, r1, 0);
647	TESTINST2("sxtb16 r0, r1", 0x007f007f, r0, r1, 0);
648
649	printf("------------ BFI ------------\n");
650
651        /* bfi  rDst, rSrc, #lsb-in-dst, #number-of-bits-to-copy */
652	TESTINST2("bfi  r0, r1, #0, #11", 0xAAAAAAAA, r0, r1, 0);
653	TESTINST2("bfi  r0, r1, #1, #11", 0xAAAAAAAA, r0, r1, 0);
654	TESTINST2("bfi  r0, r1, #2, #11", 0xAAAAAAAA, r0, r1, 0);
655
656	TESTINST2("bfi  r0, r1, #19, #11", 0xFFFFFFFF, r0, r1, 0);
657	TESTINST2("bfi  r0, r1, #20, #11", 0xFFFFFFFF, r0, r1, 0);
658	TESTINST2("bfi  r0, r1, #21, #11", 0xFFFFFFFF, r0, r1, 0);
659
660	TESTINST2("bfi  r0, r1, #0, #32", 0xFFFFFFFF, r0, r1, 0);
661	TESTINST2("bfi  r0, r1, #1, #31", 0xFFFFFFFF, r0, r1, 0);
662
663	TESTINST2("bfi  r0, r1, #29, #3", 0xFFFFFFFF, r0, r1, 0);
664	TESTINST2("bfi  r0, r1, #30, #2", 0xFFFFFFFF, r0, r1, 0);
665	TESTINST2("bfi  r0, r1, #31, #1", 0xFFFFFFFF, r0, r1, 0);
666
667	printf("------------ BFC ------------\n");
668
669        /* bfi  rDst, #lsb-in-dst, #number-of-bits-to-copy */
670	TESTINST2("bfc  r0, #0, #11", 0xAAAAAAAA, r0, r1, 0);
671	TESTINST2("bfc  r0, #1, #11", 0xAAAAAAAA, r0, r1, 0);
672	TESTINST2("bfc  r0, #2, #11", 0xAAAAAAAA, r0, r1, 0);
673
674	TESTINST2("bfc  r0, #19, #11", 0xFFFFFFFF, r0, r1, 0);
675	TESTINST2("bfc  r0, #20, #11", 0xFFFFFFFF, r0, r1, 0);
676	TESTINST2("bfc  r0, #21, #11", 0xFFFFFFFF, r0, r1, 0);
677
678	TESTINST2("bfc  r0, #0, #32", 0xFFFFFFFF, r0, r1, 0);
679	TESTINST2("bfc  r0, #1, #31", 0xFFFFFFFF, r0, r1, 0);
680
681	TESTINST2("bfc  r0, #29, #3", 0xFFFFFFFF, r0, r1, 0);
682	TESTINST2("bfc  r0, #30, #2", 0xFFFFFFFF, r0, r1, 0);
683	TESTINST2("bfc  r0, #31, #1", 0xFFFFFFFF, r0, r1, 0);
684
685	printf("------------ SBFX ------------\n");
686
687        /* sbfx rDst, rSrc, #lsb, #width */
688        TESTINST2("sbfx  r0, r1, #0, #1", 0x00000000, r0, r1, 0);
689        TESTINST2("sbfx  r0, r1, #0, #1", 0x00000001, r0, r1, 0);
690        TESTINST2("sbfx  r0, r1, #1, #1", 0x00000000, r0, r1, 0);
691        TESTINST2("sbfx  r0, r1, #1, #1", 0x00000001, r0, r1, 0);
692        TESTINST2("sbfx  r0, r1, #1, #1", 0x00000002, r0, r1, 0);
693        TESTINST2("sbfx  r0, r1, #1, #1", 0x00000003, r0, r1, 0);
694
695        TESTINST2("sbfx  r0, r1, #0, #2", 0x00000000, r0, r1, 0);
696        TESTINST2("sbfx  r0, r1, #0, #2", 0x00000001, r0, r1, 0);
697        TESTINST2("sbfx  r0, r1, #1, #2", 0x00000000, r0, r1, 0);
698        TESTINST2("sbfx  r0, r1, #1, #2", 0x00000001, r0, r1, 0);
699        TESTINST2("sbfx  r0, r1, #1, #2", 0x00000002, r0, r1, 0);
700        TESTINST2("sbfx  r0, r1, #1, #2", 0x00000003, r0, r1, 0);
701
702        TESTINST2("sbfx  r0, r1, #0, #11", 0xAAAAAAAA, r0, r1, 0);
703        TESTINST2("sbfx  r0, r1, #1, #11", 0xAAAAAAAA, r0, r1, 0);
704        TESTINST2("sbfx  r0, r1, #2, #11", 0xAAAAAAAA, r0, r1, 0);
705
706        TESTINST2("sbfx  r0, r1, #2, #11", 0xAAAAAAAA, r0, r1, 0);
707
708        TESTINST2("sbfx  r0, r1, #31, #1", 0xAAAAAAAA, r0, r1, 0);
709        TESTINST2("sbfx  r0, r1, #30, #2", 0xAAAAAAAA, r0, r1, 0);
710
711	printf("------------ UBFX ------------\n");
712
713        /* ubfx rDst, rSrc, #lsb, #width */
714        TESTINST2("ubfx  r0, r1, #0, #1", 0x00000000, r0, r1, 0);
715        TESTINST2("ubfx  r0, r1, #0, #1", 0x00000001, r0, r1, 0);
716        TESTINST2("ubfx  r0, r1, #1, #1", 0x00000000, r0, r1, 0);
717        TESTINST2("ubfx  r0, r1, #1, #1", 0x00000001, r0, r1, 0);
718        TESTINST2("ubfx  r0, r1, #1, #1", 0x00000002, r0, r1, 0);
719        TESTINST2("ubfx  r0, r1, #1, #1", 0x00000003, r0, r1, 0);
720
721        TESTINST2("ubfx  r0, r1, #0, #2", 0x00000000, r0, r1, 0);
722        TESTINST2("ubfx  r0, r1, #0, #2", 0x00000001, r0, r1, 0);
723        TESTINST2("ubfx  r0, r1, #1, #2", 0x00000000, r0, r1, 0);
724        TESTINST2("ubfx  r0, r1, #1, #2", 0x00000001, r0, r1, 0);
725        TESTINST2("ubfx  r0, r1, #1, #2", 0x00000002, r0, r1, 0);
726        TESTINST2("ubfx  r0, r1, #1, #2", 0x00000003, r0, r1, 0);
727
728        TESTINST2("ubfx  r0, r1, #0, #11", 0xAAAAAAAA, r0, r1, 0);
729        TESTINST2("ubfx  r0, r1, #1, #11", 0xAAAAAAAA, r0, r1, 0);
730        TESTINST2("ubfx  r0, r1, #2, #11", 0xAAAAAAAA, r0, r1, 0);
731
732        TESTINST2("ubfx  r0, r1, #2, #11", 0xAAAAAAAA, r0, r1, 0);
733
734        TESTINST2("ubfx  r0, r1, #31, #1", 0xAAAAAAAA, r0, r1, 0);
735        TESTINST2("ubfx  r0, r1, #30, #2", 0xAAAAAAAA, r0, r1, 0);
736
737	printf("------------ SMULL{B,T}{B,T} ------------\n");
738        /* SMULxx rD, rN, rM */
739
740	TESTINST3("smulbb r0, r1, r2", 0x00030000, 0x00040000,  r0, r1, r2, 0);
741	TESTINST3("smulbb r0, r1, r2", 0x00030001, 0x00040002,  r0, r1, r2, 0);
742	TESTINST3("smulbb r0, r1, r2", 0x00038001, 0x00047fff,  r0, r1, r2, 0);
743	TESTINST3("smulbb r0, r1, r2", 0x00037fff, 0x00047fff,  r0, r1, r2, 0);
744	TESTINST3("smulbb r0, r1, r2", 0x0003ffff, 0x0004ffff,  r0, r1, r2, 0);
745
746	printf("------------ SXTAB ------------\n");
747        TESTINST3("sxtab r0, r1, r2, ROR #24", 0x31415927, 0x27182819,
748                  r0, r1, r2, 0);
749        TESTINST3("sxtab r0, r1, r2, ROR #16", 0x31415927, 0x27182819,
750                  r0, r1, r2, 0);
751        TESTINST3("sxtab r0, r1, r2, ROR #8", 0x31415927, 0x27182819,
752                  r0, r1, r2, 0);
753        TESTINST3("sxtab r0, r1, r2, ROR #0", 0x31415927, 0x27182819,
754                  r0, r1, r2, 0);
755
756        TESTINST3("sxtab r0, r1, r2, ROR #24", 0x31415927, 0x27182899,
757                  r0, r1, r2, 0);
758        TESTINST3("sxtab r0, r1, r2, ROR #16", 0x31415927, 0x27182899,
759                  r0, r1, r2, 0);
760        TESTINST3("sxtab r0, r1, r2, ROR #8", 0x31415927, 0x27182899,
761                  r0, r1, r2, 0);
762        TESTINST3("sxtab r0, r1, r2, ROR #0", 0x31415927, 0x27182899,
763                  r0, r1, r2, 0);
764
765	printf("------------ UXTAB ------------\n");
766        TESTINST3("uxtab r0, r1, r2, ROR #24", 0x31415927, 0x27182819,
767                  r0, r1, r2, 0);
768        TESTINST3("uxtab r0, r1, r2, ROR #16", 0x31415927, 0x27182819,
769                  r0, r1, r2, 0);
770        TESTINST3("uxtab r0, r1, r2, ROR #8", 0x31415927, 0x27182819,
771                  r0, r1, r2, 0);
772        TESTINST3("uxtab r0, r1, r2, ROR #0", 0x31415927, 0x27182819,
773                  r0, r1, r2, 0);
774
775        TESTINST3("uxtab r0, r1, r2, ROR #24", 0x31415927, 0x27182899,
776                  r0, r1, r2, 0);
777        TESTINST3("uxtab r0, r1, r2, ROR #16", 0x31415927, 0x27182899,
778                  r0, r1, r2, 0);
779        TESTINST3("uxtab r0, r1, r2, ROR #8", 0x31415927, 0x27182899,
780                  r0, r1, r2, 0);
781        TESTINST3("uxtab r0, r1, r2, ROR #0", 0x31415927, 0x27182899,
782                  r0, r1, r2, 0);
783
784	printf("------------ SXTAH ------------\n");
785        TESTINST3("sxtah r0, r1, r2, ROR #24", 0x31415927, 0x27182819,
786                  r0, r1, r2, 0);
787        TESTINST3("sxtah r0, r1, r2, ROR #16", 0x31415927, 0x27182819,
788                  r0, r1, r2, 0);
789        TESTINST3("sxtah r0, r1, r2, ROR #8 ", 0x31415927, 0x27182819,
790                  r0, r1, r2, 0);
791        TESTINST3("sxtah r0, r1, r2, ROR #0 ", 0x31415927, 0x27182819,
792                  r0, r1, r2, 0);
793
794        TESTINST3("sxtah r0, r1, r2, ROR #24", 0x31415927, 0x27189819,
795                  r0, r1, r2, 0);
796        TESTINST3("sxtah r0, r1, r2, ROR #16", 0x31415927, 0x27189819,
797                  r0, r1, r2, 0);
798        TESTINST3("sxtah r0, r1, r2, ROR #8 ", 0x31415927, 0x27189819,
799                  r0, r1, r2, 0);
800        TESTINST3("sxtah r0, r1, r2, ROR #0 ", 0x31415927, 0x27189819,
801                  r0, r1, r2, 0);
802
803	printf("------------ UXTAH ------------\n");
804        TESTINST3("uxtah r0, r1, r2, ROR #24", 0x31415927, 0x27182819,
805                  r0, r1, r2, 0);
806        TESTINST3("uxtah r0, r1, r2, ROR #16", 0x31415927, 0x27182819,
807                  r0, r1, r2, 0);
808        TESTINST3("uxtah r0, r1, r2, ROR #8 ", 0x31415927, 0x27182819,
809                  r0, r1, r2, 0);
810        TESTINST3("uxtah r0, r1, r2, ROR #0 ", 0x31415927, 0x27182819,
811                  r0, r1, r2, 0);
812
813        TESTINST3("uxtah r0, r1, r2, ROR #24", 0x31415927, 0x27189819,
814                  r0, r1, r2, 0);
815        TESTINST3("uxtah r0, r1, r2, ROR #16", 0x31415927, 0x27189819,
816                  r0, r1, r2, 0);
817        TESTINST3("uxtah r0, r1, r2, ROR #8 ", 0x31415927, 0x27189819,
818                  r0, r1, r2, 0);
819        TESTINST3("uxtah r0, r1, r2, ROR #0 ", 0x31415927, 0x27189819,
820                  r0, r1, r2, 0);
821
822	printf("------------ PLD/PLDW (begin) ------------\n");
823        /* These don't have any effect on the architected state, so,
824           uh, there's no result values to check.  Just _do_ some of
825           them and check Valgrind's instruction decoder eats them up
826           without complaining. */
827        { int alocal;
828          printf("pld  reg +/- imm12  cases\n");
829          __asm__ __volatile__( "pld [%0, #128]" : :/*in*/"r"(&alocal) );
830          __asm__ __volatile__( "pld [%0, #-128]" : :/*in*/"r"(&alocal) );
831          __asm__ __volatile__( "pld [r15, #-128]" : :/*in*/"r"(&alocal) );
832
833          // apparently pldw is v7 only
834          //__asm__ __volatile__( "pldw [%0, #128]" : :/*in*/"r"(&alocal) );
835          //__asm__ __volatile__( "pldw [%0, #-128]" : :/*in*/"r"(&alocal) );
836          //__asm__ __volatile__( "pldw [r15, #128]" : :/*in*/"r"(&alocal) );
837
838          printf("pld  reg +/- shifted reg  cases\n");
839          __asm__ __volatile__( "pld [%0, %1]" : : /*in*/"r"(&alocal), "r"(0) );
840          __asm__ __volatile__( "pld [%0, %1, LSL #1]" : : /*in*/"r"(&alocal), "r"(0) );
841          __asm__ __volatile__( "pld [%0, %1, LSR #1]" : : /*in*/"r"(&alocal), "r"(0) );
842          __asm__ __volatile__( "pld [%0, %1, ASR #1]" : : /*in*/"r"(&alocal), "r"(0) );
843          __asm__ __volatile__( "pld [%0, %1, ROR #1]" : : /*in*/"r"(&alocal), "r"(0) );
844          __asm__ __volatile__( "pld [%0, %1, RRX]" : : /*in*/"r"(&alocal), "r"(0) );
845        }
846	printf("------------ PLD/PLDW (done) ------------\n");
847
848
849	return 0;
850}
851
852/* How to compile:
853   gcc -O -g -Wall -mcpu=cortex-a8 -o testarmv6int testarmv6int.c
854*/
855
856#include <stdio.h>
857
858/* test macros to generate and output the result of a single instruction */
859#define TESTINST2(instruction, RMval, RD, RM, carryin) \
860{ \
861	unsigned int out; \
862	unsigned int cpsr; \
863\
864	__asm__ volatile( \
865		"movs %3,%3;" \
866		"msrne cpsr_f,#(1<<29);" \
867		"msreq cpsr_f,#0;" \
868		"mov " #RM ",%2;" \
869                /* set #RD to 0x55555555 so we can see which parts get overwritten */ \
870                "mov " #RD ", #0x55" "\n\t" \
871                "orr " #RD "," #RD "," #RD ", LSL #8" "\n\t" \
872                "orr " #RD "," #RD "," #RD ", LSL #16" "\n\t" \
873		instruction ";" \
874		"mov %0," #RD ";" \
875		"mrs %1,cpsr;" \
876		: "=&r" (out), "=&r" (cpsr) \
877		: "r" (RMval), "r" (carryin) \
878		: #RD, #RM, "cc", "memory" \
879	); \
880	printf("%s :: rd 0x%08x rm 0x%08x, carryin %d, cpsr 0x%08x %c%c%c%c\n", \
881		instruction, out, RMval, \
882		carryin ? 1 : 0, \
883		cpsr & 0xffff0000, \
884		((1<<31) & cpsr) ? 'N' : ' ', \
885		((1<<30) & cpsr) ? 'Z' : ' ', \
886		((1<<29) & cpsr) ? 'C' : ' ', \
887		((1<<28) & cpsr) ? 'V' : ' ' \
888		); \
889}
890
891#define TESTINST3(instruction, RMval, RNval, RD, RM, RN, carryin) \
892{ \
893	unsigned int out; \
894	unsigned int cpsr; \
895\
896	__asm__ volatile( \
897		"movs %4,%4;" \
898		"msrne cpsr_f,#(1<<29);" \
899		"msreq cpsr_f,#0;" \
900		"mov " #RM ",%2;" \
901		"mov " #RN ",%3;" \
902		instruction ";" \
903		"mov %0," #RD ";" \
904		"mrs %1,cpsr;" \
905		: "=&r" (out), "=&r" (cpsr) \
906		: "r" (RMval), "r" (RNval), "r" (carryin) \
907		: #RD, #RM, #RN, "cc", "memory" \
908	); \
909	printf("%s :: rd 0x%08x rm 0x%08x, rn 0x%08x, carryin %d, cpsr 0x%08x %c%c%c%c\n", \
910		instruction, out, RMval, RNval, \
911		carryin ? 1 : 0, \
912		cpsr & 0xffff0000, \
913		((1<<31) & cpsr) ? 'N' : ' ', \
914		((1<<30) & cpsr) ? 'Z' : ' ', \
915		((1<<29) & cpsr) ? 'C' : ' ', \
916		((1<<28) & cpsr) ? 'V' : ' ' \
917		); \
918}
919
920#define TESTINST4(instruction, RMval, RNval, RSval, RD, RM, RN, RS, carryin) \
921{ \
922	unsigned int out; \
923	unsigned int cpsr; \
924\
925	__asm__ volatile( \
926		"movs %5,%5;" \
927		"msrne cpsr_f,#(1<<29);" \
928		"msreq cpsr_f,#0;" \
929		"mov " #RM ",%2;" \
930		"mov " #RN ",%3;" \
931		"mov " #RS ",%4;" \
932		instruction ";" \
933		"mov %0," #RD ";" \
934		"mrs %1,cpsr;" \
935		: "=&r" (out), "=&r" (cpsr) \
936		: "r" (RMval), "r" (RNval), "r" (RSval), "r" (carryin) \
937		: #RD, #RM, #RN, #RS, "cc", "memory" \
938	); \
939	printf("%s :: rd 0x%08x rm 0x%08x, rn 0x%08x rs 0x%08x, carryin %d, cpsr 0x%08x %c%c%c%c\n", \
940		instruction, out, RMval, RNval, RSval, \
941		carryin ? 1 : 0, \
942		cpsr & 0xffff0000, \
943		((1<<31) & cpsr) ? 'N' : ' ', \
944		((1<<30) & cpsr) ? 'Z' : ' ', \
945		((1<<29) & cpsr) ? 'C' : ' ', \
946		((1<<28) & cpsr) ? 'V' : ' ' \
947		); \
948}
949
950#define TESTINST4_2OUT(instruction, RDval, RD2val, RMval, RSval, RD, RD2, RM, RS, carryin) \
951{ \
952	unsigned int out; \
953	unsigned int out2; \
954	unsigned int cpsr; \
955\
956	__asm__ volatile( \
957		"movs %7,%7;" \
958		"msrne cpsr_f,#(1<<29);" \
959		"msreq cpsr_f,#0;" \
960		"mov " #RD ",%3;" \
961		"mov " #RD2 ",%4;" \
962		"mov " #RM ",%5;" \
963		"mov " #RS ",%6;" \
964		instruction ";" \
965		"mov %0," #RD ";" \
966		"mov %1," #RD2 ";" \
967		"mrs %2,cpsr;" \
968		: "=&r" (out), "=&r" (out2), "=&r" (cpsr) \
969		: "r" (RDval), "r" (RD2val), "r" (RMval), "r" (RSval), "r" (carryin) \
970		: #RD, #RD2, #RM, #RS, "cc", "memory" \
971	); \
972	printf("%s :: rd 0x%08x rd2 0x%08x, rm 0x%08x rs 0x%08x, carryin %d, cpsr 0x%08x %c%c%c%c\n", \
973		instruction, out, out2, RMval, RSval, \
974		carryin ? 1 : 0, \
975		cpsr & 0xffff0000, \
976		((1<<31) & cpsr) ? 'N' : ' ', \
977		((1<<30) & cpsr) ? 'Z' : ' ', \
978		((1<<29) & cpsr) ? 'C' : ' ', \
979		((1<<28) & cpsr) ? 'V' : ' ' \
980		); \
981}
982
983/* helpers */
984#define TESTCARRY { int c = 0; for (c = 0; c < 2; c++) {
985#define TESTCARRYEND }}
986
987
988
989
990int main(int argc, char **argv)
991{
992
993	printf("MOV\n");
994	TESTINST2("mov  r0, r1", 1, r0, r1, 0);
995	TESTINST2("cpy  r0, r1", 1, r0, r1, 0);
996	TESTINST2("mov  r0, #0", 0, r0, r1, 0);
997	TESTINST2("mov  r0, #1", 0, r0, r1, 0);
998	TESTCARRY
999	TESTINST2("movs r0, r1", 1, r0, r1, c);
1000	TESTINST2("movs r0, r1", 0, r0, r1, c);
1001	TESTINST2("movs r0, r1", 0x80000000, r0, r1, c);
1002	TESTINST2("movs r0, #0", 0, r0, r1, c);
1003	TESTINST2("movs r0, #1", 0, r0, r1, c);
1004	TESTCARRYEND
1005
1006	printf("MVN\n");
1007	TESTINST2("mvn  r0, r1", 1, r0, r1, 0);
1008	TESTCARRY
1009	TESTINST2("mvns r0, r1", 1, r0, r1, c);
1010	TESTINST2("mvns r0, r1", 0, r0, r1, c);
1011	TESTINST2("mvns r0, r1", 0x80000000, r0, r1, c);
1012	TESTCARRYEND
1013
1014	printf("ADD\n");
1015	TESTINST3("adds r0, r1, r2", 0, 0, r0, r1, r2, 0);
1016	TESTINST3("adds r0, r1, r2", 0, 1, r0, r1, r2, 0);
1017	TESTINST3("adds r0, r1, r2", 1, 0, r0, r1, r2, 0);
1018	TESTINST3("adds r0, r1, r2", 1, 1, r0, r1, r2, 0);
1019	TESTINST3("adds r0, r1, r2", 0, -1, r0, r1, r2, 0);
1020	TESTINST3("adds r0, r1, r2", 1, -1, r0, r1, r2, 0);
1021	TESTINST3("adds r0, r1, r2", 0x7fffffff, 1, r0, r1, r2, 0);
1022	TESTINST3("adds r0, r1, r2", 0x80000000, -1, r0, r1, r2, 0);
1023	TESTINST3("adds r0, r1, r2", 0x80000000, 0, r0, r1, r2, 0);
1024
1025	printf("ADC\n");
1026	TESTINST3("adcs r0, r1, r2", 0, 0, r0, r1, r2, 0);
1027	TESTINST3("adcs r0, r1, r2", 0, 0, r0, r1, r2, 1);
1028
1029	printf("LSL\n");
1030	TESTINST3("lsl  r0, r1, r2", 0xffffffff, 0, r0, r1, r2, 0);
1031	TESTINST3("lsl  r0, r1, r2", 0xffffffff, 1, r0, r1, r2, 0);
1032	TESTINST3("lsl  r0, r1, r2", 0xffffffff, 2, r0, r1, r2, 0);
1033	TESTINST3("lsl  r0, r1, r2", 0xffffffff, 31, r0, r1, r2, 0);
1034	TESTINST3("lsl  r0, r1, r2", 0xffffffff, 32, r0, r1, r2, 0);
1035	TESTINST3("lsl  r0, r1, r2", 0xffffffff, 33, r0, r1, r2, 0);
1036	TESTINST3("lsl  r0, r1, r2", 0xffffffff, 63, r0, r1, r2, 0);
1037	TESTINST3("lsl  r0, r1, r2", 0xffffffff, 64, r0, r1, r2, 0);
1038	TESTINST3("lsl  r0, r1, r2", 0xffffffff, 255, r0, r1, r2, 0);
1039	TESTINST3("lsl  r0, r1, r2", 0xffffffff, 256, r0, r1, r2, 0);
1040
1041	TESTINST3("lsl  r0, r1, r2", 0x1, 0, r0, r1, r2, 0);
1042	TESTINST3("lsl  r0, r1, r2", 0x1, 1, r0, r1, r2, 0);
1043	TESTINST3("lsl  r0, r1, r2", 0x1, 31, r0, r1, r2, 0);
1044	TESTINST3("lsl  r0, r1, r2", 0x2, 31, r0, r1, r2, 0);
1045
1046	printf("LSLS\n");
1047	TESTCARRY
1048	TESTINST3("lsls r0, r1, r2", 0xffffffff, 0, r0, r1, r2, c);
1049	TESTINST3("lsls r0, r1, r2", 0xffffffff, 1, r0, r1, r2, c);
1050	TESTINST3("lsls r0, r1, r2", 0xffffffff, 2, r0, r1, r2, c);
1051	TESTINST3("lsls r0, r1, r2", 0xffffffff, 31, r0, r1, r2, c);
1052	TESTINST3("lsls r0, r1, r2", 0xffffffff, 32, r0, r1, r2, c);
1053	TESTINST3("lsls r0, r1, r2", 0xffffffff, 33, r0, r1, r2, c);
1054	TESTINST3("lsls r0, r1, r2", 0xffffffff, 63, r0, r1, r2, c);
1055	TESTINST3("lsls r0, r1, r2", 0xffffffff, 64, r0, r1, r2, c);
1056	TESTINST3("lsls r0, r1, r2", 0xffffffff, 255, r0, r1, r2, c);
1057	TESTINST3("lsls r0, r1, r2", 0xffffffff, 256, r0, r1, r2, c);
1058	TESTINST3("lsls r0, r1, r2", 0x1, 0, r0, r1, r2, c);
1059	TESTINST3("lsls r0, r1, r2", 0x1, 1, r0, r1, r2, c);
1060	TESTINST3("lsls r0, r1, r2", 0x1, 31, r0, r1, r2, c);
1061	TESTINST3("lsls r0, r1, r2", 0x2, 31, r0, r1, r2, c);
1062	TESTCARRYEND
1063
1064	printf("LSL immediate\n");
1065	TESTCARRY
1066	TESTINST2("lsl  r0, r1, #0", 0xffffffff, r0, r1, c);
1067	TESTINST2("lsl  r0, r1, #1", 0xffffffff, r0, r1, c);
1068	TESTINST2("lsl  r0, r1, #31", 0xffffffff, r0, r1, c);
1069	TESTINST2("lsl  r0, r1, #0", 0x1, r0, r1, c);
1070	TESTINST2("lsl  r0, r1, #1", 0x1, r0, r1, c);
1071	TESTINST2("lsl  r0, r1, #31", 0x1, r0, r1, c);
1072	TESTINST2("lsl  r0, r1, #31", 0x2, r0, r1, c);
1073	TESTCARRYEND
1074
1075	printf("LSLS immediate\n");
1076	TESTCARRY
1077	TESTINST2("lsls r0, r1, #0", 0xffffffff, r0, r1, c);
1078	TESTINST2("lsls r0, r1, #1", 0xffffffff, r0, r1, c);
1079	TESTINST2("lsls r0, r1, #31", 0xffffffff, r0, r1, c);
1080	TESTINST2("lsls r0, r1, #0", 0x1, r0, r1, c);
1081	TESTINST2("lsls r0, r1, #1", 0x1, r0, r1, c);
1082	TESTINST2("lsls r0, r1, #31", 0x1, r0, r1, c);
1083	TESTINST2("lsls r0, r1, #31", 0x2, r0, r1, c);
1084	TESTCARRYEND
1085
1086	printf("LSR\n");
1087	TESTINST3("lsr  r0, r1, r2", 0xffffffff, 0, r0, r1, r2, 0);
1088	TESTINST3("lsr  r0, r1, r2", 0xffffffff, 1, r0, r1, r2, 0);
1089	TESTINST3("lsr  r0, r1, r2", 0xffffffff, 2, r0, r1, r2, 0);
1090	TESTINST3("lsr  r0, r1, r2", 0xffffffff, 31, r0, r1, r2, 0);
1091	TESTINST3("lsr  r0, r1, r2", 0xffffffff, 32, r0, r1, r2, 0);
1092	TESTINST3("lsr  r0, r1, r2", 0xffffffff, 33, r0, r1, r2, 0);
1093	TESTINST3("lsr  r0, r1, r2", 0xffffffff, 63, r0, r1, r2, 0);
1094	TESTINST3("lsr  r0, r1, r2", 0xffffffff, 64, r0, r1, r2, 0);
1095	TESTINST3("lsr  r0, r1, r2", 0xffffffff, 255, r0, r1, r2, 0);
1096	TESTINST3("lsr  r0, r1, r2", 0xffffffff, 256, r0, r1, r2, 0);
1097
1098	printf("LSRS\n");
1099	TESTCARRY
1100	TESTINST3("lsrs r0, r1, r2", 0xffffffff, 0, r0, r1, r2, c);
1101	TESTINST3("lsrs r0, r1, r2", 0xffffffff, 1, r0, r1, r2, c);
1102	TESTINST3("lsrs r0, r1, r2", 0xffffffff, 2, r0, r1, r2, c);
1103	TESTINST3("lsrs r0, r1, r2", 0xffffffff, 31, r0, r1, r2, c);
1104	TESTINST3("lsrs r0, r1, r2", 0xffffffff, 32, r0, r1, r2, c);
1105	TESTINST3("lsrs r0, r1, r2", 0xffffffff, 33, r0, r1, r2, c);
1106	TESTINST3("lsrs r0, r1, r2", 0xffffffff, 63, r0, r1, r2, c);
1107	TESTINST3("lsrs r0, r1, r2", 0xffffffff, 64, r0, r1, r2, c);
1108	TESTINST3("lsrs r0, r1, r2", 0xffffffff, 255, r0, r1, r2, c);
1109	TESTCARRYEND
1110
1111	printf("LSR immediate\n");
1112	TESTINST2("lsr  r0, r1, #0", 0xffffffff, r0, r1, 0);
1113	TESTINST2("lsr  r0, r1, #1", 0xffffffff, r0, r1, 0);
1114	TESTINST2("lsr  r0, r1, #31", 0xffffffff, r0, r1, 0);
1115	TESTINST2("lsr  r0, r1, #32", 0xffffffff, r0, r1, 0);
1116	TESTINST2("lsr  r0, r1, #16", 0x00010000, r0, r1, 0);
1117	TESTINST2("lsr  r0, r1, #17", 0x00010000, r0, r1, 0);
1118	TESTINST2("lsr  r0, r1, #18", 0x00010000, r0, r1, 0);
1119
1120	printf("LSRS immediate\n");
1121	TESTCARRY
1122	TESTINST2("lsrs r0, r1, #0", 0xffffffff, r0, r1, c);
1123	TESTINST2("lsrs r0, r1, #1", 0xffffffff, r0, r1, c);
1124	TESTINST2("lsrs r0, r1, #31", 0xffffffff, r0, r1, c);
1125	TESTINST2("lsrs r0, r1, #32", 0xffffffff, r0, r1, c);
1126	TESTINST2("lsrs r0, r1, #16", 0x00010000, r0, r1, c);
1127	TESTINST2("lsrs r0, r1, #17", 0x00010000, r0, r1, c);
1128	TESTINST2("lsrs r0, r1, #18", 0x00010000, r0, r1, c);
1129	TESTCARRYEND
1130
1131	printf("ASR\n");
1132	TESTCARRY
1133	TESTINST3("asr  r0, r1, r2", 0xffffffff, 0, r0, r1, r2, c);
1134	TESTINST3("asr  r0, r1, r2", 0xffffffff, 1, r0, r1, r2, c);
1135	TESTINST3("asr  r0, r1, r2", 0xffffffff, 2, r0, r1, r2, c);
1136	TESTINST3("asr  r0, r1, r2", 0xffffffff, 31, r0, r1, r2, c);
1137	TESTINST3("asr  r0, r1, r2", 0xffffffff, 32, r0, r1, r2, c);
1138	TESTINST3("asr  r0, r1, r2", 0xffffffff, 33, r0, r1, r2, c);
1139	TESTINST3("asr  r0, r1, r2", 0xffffffff, 63, r0, r1, r2, c);
1140	TESTINST3("asr  r0, r1, r2", 0xffffffff, 64, r0, r1, r2, c);
1141	TESTINST3("asr  r0, r1, r2", 0xffffffff, 255, r0, r1, r2, c);
1142	TESTINST3("asr  r0, r1, r2", 0xffffffff, 256, r0, r1, r2, c);
1143	TESTINST3("asr  r0, r1, r2", 0x7fffffff, 0, r0, r1, r2, c);
1144	TESTINST3("asr  r0, r1, r2", 0x7fffffff, 1, r0, r1, r2, c);
1145	TESTINST3("asr  r0, r1, r2", 0x7fffffff, 2, r0, r1, r2, c);
1146	TESTINST3("asr  r0, r1, r2", 0x7fffffff, 31, r0, r1, r2, c);
1147	TESTINST3("asr  r0, r1, r2", 0x7fffffff, 32, r0, r1, r2, c);
1148	TESTINST3("asr  r0, r1, r2", 0x7fffffff, 33, r0, r1, r2, c);
1149	TESTINST3("asr  r0, r1, r2", 0x7fffffff, 63, r0, r1, r2, c);
1150	TESTINST3("asr  r0, r1, r2", 0x7fffffff, 64, r0, r1, r2, c);
1151	TESTINST3("asr  r0, r1, r2", 0x7fffffff, 255, r0, r1, r2, c);
1152	TESTINST3("asr  r0, r1, r2", 0x7fffffff, 256, r0, r1, r2, c);
1153	TESTCARRYEND
1154
1155	printf("ASRS\n");
1156	TESTCARRY
1157	TESTINST3("asrs r0, r1, r2", 0xffffffff, 0, r0, r1, r2, c);
1158	TESTINST3("asrs r0, r1, r2", 0xffffffff, 1, r0, r1, r2, c);
1159	TESTINST3("asrs r0, r1, r2", 0xffffffff, 2, r0, r1, r2, c);
1160	TESTINST3("asrs r0, r1, r2", 0xffffffff, 31, r0, r1, r2, c);
1161	TESTINST3("asrs r0, r1, r2", 0xffffffff, 32, r0, r1, r2, c);
1162	TESTINST3("asrs r0, r1, r2", 0xffffffff, 33, r0, r1, r2, c);
1163	TESTINST3("asrs r0, r1, r2", 0xffffffff, 63, r0, r1, r2, c);
1164	TESTINST3("asrs r0, r1, r2", 0xffffffff, 64, r0, r1, r2, c);
1165	TESTINST3("asrs r0, r1, r2", 0xffffffff, 255, r0, r1, r2, c);
1166	TESTINST3("asrs r0, r1, r2", 0xffffffff, 256, r0, r1, r2, c);
1167	TESTINST3("asrs r0, r1, r2", 0x7fffffff, 0, r0, r1, r2, c);
1168	TESTINST3("asrs r0, r1, r2", 0x7fffffff, 1, r0, r1, r2, c);
1169	TESTINST3("asrs r0, r1, r2", 0x7fffffff, 2, r0, r1, r2, c);
1170	TESTINST3("asrs r0, r1, r2", 0x7fffffff, 31, r0, r1, r2, c);
1171	TESTINST3("asrs r0, r1, r2", 0x7fffffff, 32, r0, r1, r2, c);
1172	TESTINST3("asrs r0, r1, r2", 0x7fffffff, 33, r0, r1, r2, c);
1173	TESTINST3("asrs r0, r1, r2", 0x7fffffff, 63, r0, r1, r2, c);
1174	TESTINST3("asrs r0, r1, r2", 0x7fffffff, 64, r0, r1, r2, c);
1175	TESTINST3("asrs r0, r1, r2", 0x7fffffff, 255, r0, r1, r2, c);
1176	TESTINST3("asrs r0, r1, r2", 0x7fffffff, 256, r0, r1, r2, c);
1177	TESTCARRYEND
1178
1179	TESTCARRY
1180	TESTINST3("asrs r0, r1, r2", 0x8, 0, r0, r1, r2, c);
1181	TESTINST3("asrs r0, r1, r2", 0x8, 1, r0, r1, r2, c);
1182	TESTINST3("asrs r0, r1, r2", 0x8, 2, r0, r1, r2, c);
1183	TESTINST3("asrs r0, r1, r2", 0x8, 3, r0, r1, r2, c);
1184	TESTINST3("asrs r0, r1, r2", 0x8, 4, r0, r1, r2, c);
1185	TESTINST3("asrs r0, r1, r2", 0x8, 5, r0, r1, r2, c);
1186	TESTCARRYEND
1187
1188	TESTINST3("asrs r0, r1, r2", 0x80000001, 1, r0, r1, r2, 0);
1189	TESTINST3("asrs r0, r1, r2", 0x80000001, 2, r0, r1, r2, 0);
1190
1191	printf("ASR immediate\n");
1192	TESTINST2("asr  r0, r1, #0", 0xffffffff, r0, r1, 0);
1193	TESTINST2("asr  r0, r1, #1", 0xffffffff, r0, r1, 0);
1194	TESTINST2("asr  r0, r1, #31", 0xffffffff, r0, r1, 0);
1195	TESTINST2("asr  r0, r1, #32", 0xffffffff, r0, r1, 0);
1196	TESTINST2("asr  r0, r1, #0", 0x7fffffff, r0, r1, 0);
1197	TESTINST2("asr  r0, r1, #1", 0x7fffffff, r0, r1, 0);
1198	TESTINST2("asr  r0, r1, #31", 0x7fffffff, r0, r1, 0);
1199	TESTINST2("asr  r0, r1, #32", 0x7fffffff, r0, r1, 0);
1200	TESTINST2("asr  r0, r1, #16", 0x00010000, r0, r1, 0);
1201	TESTINST2("asr  r0, r1, #17", 0x00010000, r0, r1, 0);
1202	TESTINST2("asr  r0, r1, #18", 0x00010000, r0, r1, 0);
1203
1204	printf("ASRS immediate\n");
1205	TESTCARRY
1206	TESTINST2("asrs r0, r1, #0", 0xffffffff, r0, r1, c);
1207	TESTINST2("asrs r0, r1, #1", 0xffffffff, r0, r1, c);
1208	TESTINST2("asrs r0, r1, #31", 0xffffffff, r0, r1, c);
1209	TESTINST2("asrs r0, r1, #32", 0xffffffff, r0, r1, c);
1210	TESTINST2("asrs r0, r1, #0", 0x7fffffff, r0, r1, c);
1211	TESTINST2("asrs r0, r1, #1", 0x7fffffff, r0, r1, c);
1212	TESTINST2("asrs r0, r1, #31", 0x7fffffff, r0, r1, c);
1213	TESTINST2("asrs r0, r1, #32", 0x7fffffff, r0, r1, c);
1214	TESTINST2("asrs r0, r1, #16", 0x00010000, r0, r1, c);
1215	TESTINST2("asrs r0, r1, #17", 0x00010000, r0, r1, c);
1216	TESTINST2("asrs r0, r1, #18", 0x00010000, r0, r1, c);
1217	TESTCARRYEND
1218
1219	printf("ROR\n");
1220	TESTCARRY
1221	TESTINST3("ror  r0, r1, r2", 0x00088000, 0, r0, r1, r2, c);
1222	TESTINST3("ror  r0, r1, r2", 0x80088000, 1, r0, r1, r2, c);
1223	TESTINST3("ror  r0, r1, r2", 0x00088000, 1, r0, r1, r2, c);
1224	TESTINST3("ror  r0, r1, r2", 0x00088000, 2, r0, r1, r2, c);
1225	TESTINST3("ror  r0, r1, r2", 0x00088000, 31, r0, r1, r2, c);
1226	TESTINST3("ror  r0, r1, r2", 0x00088000, 32, r0, r1, r2, c);
1227	TESTINST3("ror  r0, r1, r2", 0x00088000, 33, r0, r1, r2, c);
1228	TESTINST3("ror  r0, r1, r2", 0x00088000, 63, r0, r1, r2, c);
1229	TESTINST3("ror  r0, r1, r2", 0x00088000, 64, r0, r1, r2, c);
1230	TESTINST3("ror  r0, r1, r2", 0x00088000, 255, r0, r1, r2, c);
1231	TESTINST3("ror  r0, r1, r2", 0x00088000, 256, r0, r1, r2, c);
1232	TESTINST3("ror  r0, r1, r2", 0x80088000, 256, r0, r1, r2, c);
1233	TESTINST3("ror  r0, r1, r2", 0x00088000, 257, r0, r1, r2, c);
1234	TESTCARRYEND
1235
1236	printf("RORS\n");
1237	TESTCARRY
1238	TESTINST3("rors r0, r1, r2", 0x00088000, 0, r0, r1, r2, c);
1239	TESTINST3("rors r0, r1, r2", 0x80088000, 0, r0, r1, r2, c);
1240	TESTINST3("rors r0, r1, r2", 0x00088000, 1, r0, r1, r2, c);
1241	TESTINST3("rors r0, r1, r2", 0x00088000, 2, r0, r1, r2, c);
1242	TESTINST3("rors r0, r1, r2", 0x00088000, 31, r0, r1, r2, c);
1243	TESTINST3("rors r0, r1, r2", 0x00088000, 32, r0, r1, r2, c);
1244	TESTINST3("rors r0, r1, r2", 0x00088000, 33, r0, r1, r2, c);
1245	TESTINST3("rors r0, r1, r2", 0x00088000, 63, r0, r1, r2, c);
1246	TESTINST3("rors r0, r1, r2", 0x00088000, 64, r0, r1, r2, c);
1247	TESTINST3("rors r0, r1, r2", 0x00088000, 255, r0, r1, r2, c);
1248	TESTINST3("rors r0, r1, r2", 0x00088000, 256, r0, r1, r2, c);
1249	TESTINST3("rors r0, r1, r2", 0x80088000, 256, r0, r1, r2, c);
1250	TESTINST3("rors r0, r1, r2", 0x00088000, 257, r0, r1, r2, c);
1251	TESTCARRYEND
1252
1253	printf("ROR immediate\n");
1254	TESTCARRY
1255	TESTINST2("ror  r0, r1, #0", 0x00088000, r0, r1, c);
1256	TESTINST2("ror  r0, r1, #1", 0x00088000, r0, r1, c);
1257	TESTINST2("ror  r0, r1, #31", 0x00088000, r0, r1, c);
1258	TESTINST2("ror  r0, r1, #16", 0x00010000, r0, r1, c);
1259	TESTINST2("ror  r0, r1, #17", 0x00010000, r0, r1, c);
1260	TESTINST2("ror  r0, r1, #18", 0x00010000, r0, r1, c);
1261	TESTCARRYEND
1262
1263	printf("RORS immediate\n");
1264	TESTCARRY
1265	TESTINST2("rors r0, r1, #0", 0x00088000, r0, r1, c);
1266	TESTINST2("rors r0, r1, #1", 0x00088000, r0, r1, c);
1267	TESTINST2("rors r0, r1, #31", 0x00088000, r0, r1, c);
1268	TESTINST2("rors r0, r1, #16", 0x00010000, r0, r1, c);
1269	TESTINST2("rors r0, r1, #17", 0x00010000, r0, r1, c);
1270	TESTINST2("rors r0, r1, #18", 0x00010000, r0, r1, c);
1271	TESTCARRYEND
1272
1273	printf("shift with barrel shifter\n");
1274	TESTCARRY
1275	TESTINST4("add  r0, r1, r2, lsl r3", 0, 0xffffffff, 0, r0, r1, r2, r3, c);
1276	TESTINST4("add  r0, r1, r2, lsl r3", 0, 0xffffffff, 1, r0, r1, r2, r3, c);
1277	TESTINST4("add  r0, r1, r2, lsl r3", 0, 0xffffffff, 31, r0, r1, r2, r3, c);
1278	TESTINST4("add  r0, r1, r2, lsl r3", 0, 0xffffffff, 32, r0, r1, r2, r3, c);
1279	TESTINST4("add  r0, r1, r2, lsl r3", 0, 0xffffffff, 255, r0, r1, r2, r3, c);
1280	TESTINST4("add  r0, r1, r2, lsl r3", 0, 0xffffffff, 256, r0, r1, r2, r3, c);
1281	TESTINST4("add  r0, r1, r2, lsr r3", 0, 0xffffffff, 0, r0, r1, r2, r3, c);
1282	TESTINST4("add  r0, r1, r2, lsr r3", 0, 0xffffffff, 1, r0, r1, r2, r3, c);
1283	TESTINST4("add  r0, r1, r2, lsr r3", 0, 0xffffffff, 31, r0, r1, r2, r3, c);
1284	TESTINST4("add  r0, r1, r2, lsr r3", 0, 0xffffffff, 32, r0, r1, r2, r3, c);
1285	TESTINST4("add  r0, r1, r2, lsr r3", 0, 0xffffffff, 255, r0, r1, r2, r3, c);
1286	TESTINST4("add  r0, r1, r2, lsr r3", 0, 0xffffffff, 256, r0, r1, r2, r3, c);
1287	TESTINST4("add  r0, r1, r2, asr r3", 0, 0x7fffffff, 0, r0, r1, r2, r3, c);
1288	TESTINST4("add  r0, r1, r2, asr r3", 0, 0x7fffffff, 1, r0, r1, r2, r3, c);
1289	TESTINST4("add  r0, r1, r2, asr r3", 0, 0x7fffffff, 31, r0, r1, r2, r3, c);
1290	TESTINST4("add  r0, r1, r2, asr r3", 0, 0x7fffffff, 32, r0, r1, r2, r3, c);
1291	TESTINST4("add  r0, r1, r2, asr r3", 0, 0x7fffffff, 255, r0, r1, r2, r3, c);
1292	TESTINST4("add  r0, r1, r2, asr r3", 0, 0x7fffffff, 256, r0, r1, r2, r3, c);
1293	TESTINST4("add  r0, r1, r2, lsr r3", 0, 0xffffffff, 256, r0, r1, r2, r3, c);
1294	TESTCARRYEND
1295
1296	TESTCARRY
1297	TESTINST4("add  r0, r1, r2, asr r3", 0, 0x8, 0, r0, r1, r2, r3, c);
1298	TESTINST4("add  r0, r1, r2, asr r3", 0, 0x8, 1, r0, r1, r2, r3, c);
1299	TESTINST4("add  r0, r1, r2, asr r3", 0, 0x8, 2, r0, r1, r2, r3, c);
1300	TESTINST4("add  r0, r1, r2, asr r3", 0, 0x8, 3, r0, r1, r2, r3, c);
1301	TESTINST4("add  r0, r1, r2, asr r3", 0, 0x8, 4, r0, r1, r2, r3, c);
1302	TESTINST4("add  r0, r1, r2, asr r3", 0, 0x8, 5, r0, r1, r2, r3, c);
1303	TESTCARRYEND
1304
1305	TESTCARRY
1306	TESTINST4("add  r0, r1, r2, ror r3", 0, 0x00088000, 0, r0, r1, r2, r3, c);
1307	TESTINST4("add  r0, r1, r2, ror r3", 0, 0x80088000, 0, r0, r1, r2, r3, c);
1308	TESTINST4("add  r0, r1, r2, ror r3", 0, 0x00088000, 1, r0, r1, r2, r3, c);
1309	TESTINST4("add  r0, r1, r2, ror r3", 0, 0x00088000, 31, r0, r1, r2, r3, c);
1310	TESTINST4("add  r0, r1, r2, ror r3", 0, 0x00088000, 32, r0, r1, r2, r3, c);
1311	TESTINST4("add  r0, r1, r2, ror r3", 0, 0x00088000, 255, r0, r1, r2, r3, c);
1312	TESTINST4("add  r0, r1, r2, ror r3", 0, 0x00088000, 256, r0, r1, r2, r3, c);
1313	TESTINST4("add  r0, r1, r2, ror r3", 0, 0x80088000, 256, r0, r1, r2, r3, c);
1314	TESTINST4("add  r0, r1, r2, ror r3", 0, 0x00088000, 257, r0, r1, r2, r3, c);
1315	TESTCARRYEND
1316
1317	TESTCARRY
1318	TESTINST4("adds r0, r1, r2, lsl r3", 0, 0xffffffff, 0, r0, r1, r2, r3, c);
1319	TESTINST4("adds r0, r1, r2, lsl r3", 0, 0xffffffff, 1, r0, r1, r2, r3, c);
1320	TESTINST4("adds r0, r1, r2, lsl r3", 0, 0xffffffff, 31, r0, r1, r2, r3, c);
1321	TESTINST4("adds r0, r1, r2, lsl r3", 0, 0xffffffff, 32, r0, r1, r2, r3, c);
1322	TESTINST4("adds r0, r1, r2, lsl r3", 0, 0xffffffff, 255, r0, r1, r2, r3, c);
1323	TESTINST4("adds r0, r1, r2, lsl r3", 0, 0xffffffff, 256, r0, r1, r2, r3, c);
1324	TESTINST4("adds r0, r1, r2, lsr r3", 0, 0xffffffff, 0, r0, r1, r2, r3, c);
1325	TESTINST4("adds r0, r1, r2, lsr r3", 0, 0xffffffff, 1, r0, r1, r2, r3, c);
1326	TESTINST4("adds r0, r1, r2, lsr r3", 0, 0xffffffff, 31, r0, r1, r2, r3, c);
1327	TESTINST4("adds r0, r1, r2, lsr r3", 0, 0xffffffff, 32, r0, r1, r2, r3, c);
1328	TESTINST4("adds r0, r1, r2, lsr r3", 0, 0xffffffff, 255, r0, r1, r2, r3, c);
1329	TESTINST4("adds r0, r1, r2, lsr r3", 0, 0xffffffff, 256, r0, r1, r2, r3, c);
1330
1331	TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 0, r0, r1, r2, r3, c);
1332	TESTINST4("adds r0, r1, r2, ror r3", 0, 0x80088000, 0, r0, r1, r2, r3, c);
1333	TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 1, r0, r1, r2, r3, c);
1334	TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 31, r0, r1, r2, r3, c);
1335	TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 32, r0, r1, r2, r3, c);
1336	TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 255, r0, r1, r2, r3, c);
1337	TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 256, r0, r1, r2, r3, c);
1338	TESTINST4("adds r0, r1, r2, ror r3", 0, 0x80088000, 256, r0, r1, r2, r3, c);
1339	TESTINST4("adds r0, r1, r2, ror r3", 0, 0x00088000, 257, r0, r1, r2, r3, c);
1340	TESTCARRYEND
1341
1342	TESTCARRY
1343	TESTINST4("adcs r0, r1, r2, lsl r3", 0, 0xffffffff, 0, r0, r1, r2, r3, c);
1344	TESTINST4("adcs r0, r1, r2, lsr r3", 0, 0xffffffff, 0, r0, r1, r2, r3, c);
1345	TESTINST4("adcs r0, r1, r2, lsl r3", 0, 0xffffffff, 1, r0, r1, r2, r3, c);
1346	TESTINST4("adcs r0, r1, r2, lsr r3", 0, 0xffffffff, 1, r0, r1, r2, r3, c);
1347	TESTCARRYEND
1348
1349	printf("MUL\n");
1350	TESTINST3("mul  r0, r1, r2", 0, 0, r0, r1, r2, 0);
1351	TESTINST3("mul  r0, r1, r2", 0xffffffff, 0, r0, r1, r2, 0);
1352	TESTINST3("mul  r0, r1, r2", 0, 0xffffffff, r0, r1, r2, 0);
1353	TESTINST3("mul  r0, r1, r2", 0xffffffff, 0xffffffff, r0, r1, r2, 0);
1354	TESTINST3("mul  r0, r1, r2", 0x7fffffff, 0x7fffffff, r0, r1, r2, 0);
1355	TESTINST3("mul  r0, r1, r2", 0x0000ffff, 0x0000ffff, r0, r1, r2, 0);
1356
1357	printf("MULS\n");
1358	TESTINST3("muls r0, r1, r2", 0, 0, r0, r1, r2, 0);
1359	TESTINST3("muls r0, r1, r2", 0xffffffff, 0, r0, r1, r2, 0);
1360	TESTINST3("muls r0, r1, r2", 0, 0xffffffff, r0, r1, r2, 0);
1361	TESTINST3("muls r0, r1, r2", 0xffffffff, 0xffffffff, r0, r1, r2, 0);
1362	TESTINST3("muls r0, r1, r2", 0x7fffffff, 0x7fffffff, r0, r1, r2, 0);
1363	TESTINST3("muls r0, r1, r2", 0x0000ffff, 0x0000ffff, r0, r1, r2, 0);
1364
1365	printf("MLA\n");
1366	TESTINST4("mla  r0, r1, r2, r3", 0, 0, 1, r0, r1, r2, r3, 0);
1367	TESTINST4("mla  r0, r1, r2, r3", 0xffffffff, 0, 1, r0, r1, r2, r3, 0);
1368	TESTINST4("mla  r0, r1, r2, r3", 0, 0xffffffff, 1, r0, r1, r2, r3, 0);
1369	TESTINST4("mla  r0, r1, r2, r3", 0xffffffff, 0xffffffff, 1, r0, r1, r2, r3, 0);
1370	TESTINST4("mla  r0, r1, r2, r3", 0x7fffffff, 0x7fffffff, 1, r0, r1, r2, r3, 0);
1371	TESTINST4("mla  r0, r1, r2, r3", 0x0000ffff, 0x0000ffff, 1, r0, r1, r2, r3, 0);
1372
1373	printf("MLAS\n");
1374	TESTINST4("mlas r0, r1, r2, r3", 0, 0, 1, r0, r1, r2, r3, 0);
1375	TESTINST4("mlas r0, r1, r2, r3", 0xffffffff, 0, 1, r0, r1, r2, r3, 0);
1376	TESTINST4("mlas r0, r1, r2, r3", 0, 0xffffffff, 1, r0, r1, r2, r3, 0);
1377	TESTINST4("mlas r0, r1, r2, r3", 0xffffffff, 0xffffffff, 1, r0, r1, r2, r3, 0);
1378	TESTINST4("mlas r0, r1, r2, r3", 0x7fffffff, 0x7fffffff, 1, r0, r1, r2, r3, 0);
1379	TESTINST4("mlas r0, r1, r2, r3", 0x0000ffff, 0x0000ffff, 1, r0, r1, r2, r3, 0);
1380
1381	printf("MLS\n");
1382	TESTINST4("mls  r0, r1, r2, r3", 0, 0, 1, r0, r1, r2, r3, 0);
1383	TESTINST4("mls  r0, r1, r2, r3", 0xffffffff, 0, 1, r0, r1, r2, r3, 0);
1384	TESTINST4("mls  r0, r1, r2, r3", 0, 0xffffffff, 1, r0, r1, r2, r3, 0);
1385	TESTINST4("mls  r0, r1, r2, r3", 0xffffffff, 0xffffffff, 1, r0, r1, r2, r3, 0);
1386	TESTINST4("mls  r0, r1, r2, r3", 0x7fffffff, 0x7fffffff, 1, r0, r1, r2, r3, 0);
1387	TESTINST4("mls  r0, r1, r2, r3", 0x0000ffff, 0x0000ffff, 1, r0, r1, r2, r3, 0);
1388
1389	printf("UMULL\n");
1390	TESTINST4_2OUT("umull  r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0);
1391	TESTINST4_2OUT("umull  r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0);
1392	TESTINST4_2OUT("umull  r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0);
1393	TESTINST4_2OUT("umull  r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0);
1394	TESTINST4_2OUT("umull  r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0);
1395	TESTINST4_2OUT("umull  r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0);
1396	TESTINST4_2OUT("umulls r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0);
1397	TESTINST4_2OUT("umulls r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0);
1398	TESTINST4_2OUT("umulls r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0);
1399	TESTINST4_2OUT("umulls r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0);
1400	TESTINST4_2OUT("umulls r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0);
1401	TESTINST4_2OUT("umulls r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0);
1402
1403	printf("SMULL\n");
1404	TESTINST4_2OUT("smull  r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0);
1405	TESTINST4_2OUT("smull  r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0);
1406	TESTINST4_2OUT("smull  r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0);
1407	TESTINST4_2OUT("smull  r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0);
1408	TESTINST4_2OUT("smull  r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0);
1409	TESTINST4_2OUT("smull  r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0);
1410	TESTINST4_2OUT("smulls r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0);
1411	TESTINST4_2OUT("smulls r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0);
1412	TESTINST4_2OUT("smulls r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0);
1413	TESTINST4_2OUT("smulls r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0);
1414	TESTINST4_2OUT("smulls r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0);
1415	TESTINST4_2OUT("smulls r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0);
1416
1417	printf("UMLAL\n");
1418	TESTINST4_2OUT("umlal  r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0);
1419	TESTINST4_2OUT("umlal  r0, r1, r2, r3", 0, 1, 0, 0, r0, r1, r2, r3, 0);
1420	TESTINST4_2OUT("umlal  r0, r1, r2, r3", 1, 1, 0, 0, r0, r1, r2, r3, 0);
1421	TESTINST4_2OUT("umlal  r0, r1, r2, r3", 0, 0xffffffff, 1, 1, r0, r1, r2, r3, 0);
1422	TESTINST4_2OUT("umlal  r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0);
1423	TESTINST4_2OUT("umlal  r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0);
1424	TESTINST4_2OUT("umlal  r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0);
1425	TESTINST4_2OUT("umlal  r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0);
1426	TESTINST4_2OUT("umlal  r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0);
1427	TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0);
1428	TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 1, 0, 0, r0, r1, r2, r3, 0);
1429	TESTINST4_2OUT("umlals r0, r1, r2, r3", 1, 1, 0, 0, r0, r1, r2, r3, 0);
1430	TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0xffffffff, 1, 1, r0, r1, r2, r3, 0);
1431	TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0);
1432	TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0);
1433	TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0);
1434	TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0);
1435	TESTINST4_2OUT("umlals r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0);
1436
1437	printf("SMLAL\n");
1438	TESTINST4_2OUT("smlal  r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0);
1439	TESTINST4_2OUT("smlal  r0, r1, r2, r3", 0, 1, 0, 0, r0, r1, r2, r3, 0);
1440	TESTINST4_2OUT("smlal  r0, r1, r2, r3", 1, 1, 0, 0, r0, r1, r2, r3, 0);
1441	TESTINST4_2OUT("smlal  r0, r1, r2, r3", 0, 0xffffffff, 1, 1, r0, r1, r2, r3, 0);
1442	TESTINST4_2OUT("smlal  r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0);
1443	TESTINST4_2OUT("smlal  r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0);
1444	TESTINST4_2OUT("smlal  r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0);
1445	TESTINST4_2OUT("smlal  r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0);
1446	TESTINST4_2OUT("smlal  r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0);
1447	TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0, 0, 0, r0, r1, r2, r3, 0);
1448	TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 1, 0, 0, r0, r1, r2, r3, 0);
1449	TESTINST4_2OUT("smlals r0, r1, r2, r3", 1, 1, 0, 0, r0, r1, r2, r3, 0);
1450	TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0xffffffff, 1, 1, r0, r1, r2, r3, 0);
1451	TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0, 0, 1, r0, r1, r2, r3, 0);
1452	TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0, 1, 0, r0, r1, r2, r3, 0);
1453	TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0, 1, 1, r0, r1, r2, r3, 0);
1454	TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0, 0xffff, 0xffff, r0, r1, r2, r3, 0);
1455	TESTINST4_2OUT("smlals r0, r1, r2, r3", 0, 0, 0xffffffff, 0xffffffff, r0, r1, r2, r3, 0);
1456
1457	printf("CLZ\n");
1458	TESTCARRY
1459	TESTINST2("clz  r0, r1", 0, r0, r1, c);
1460	TESTINST2("clz  r0, r1", 1, r0, r1, c);
1461	TESTINST2("clz  r0, r1", 0x10, r0, r1, c);
1462	TESTINST2("clz  r0, r1", 0xffffffff, r0, r1, c);
1463	TESTCARRYEND
1464
1465	printf("extend instructions\n");
1466	TESTINST2("uxtb r0, r1", 0, r0, r1, 0);
1467	TESTINST2("uxtb r0, r1", 1, r0, r1, 0);
1468	TESTINST2("uxtb r0, r1", 0xff, r0, r1, 0);
1469	TESTINST2("uxtb r0, r1", 0xffffffff, r0, r1, 0);
1470	TESTINST2("sxtb r0, r1", 0, r0, r1, 0);
1471	TESTINST2("sxtb r0, r1", 1, r0, r1, 0);
1472	TESTINST2("sxtb r0, r1", 0xff, r0, r1, 0);
1473	TESTINST2("sxtb r0, r1", 0xffffffff, r0, r1, 0);
1474
1475	TESTINST2("uxth r0, r1", 0, r0, r1, 0);
1476	TESTINST2("uxth r0, r1", 1, r0, r1, 0);
1477	TESTINST2("uxth r0, r1", 0xffff, r0, r1, 0);
1478	TESTINST2("uxth r0, r1", 0xffffffff, r0, r1, 0);
1479	TESTINST2("sxth r0, r1", 0, r0, r1, 0);
1480	TESTINST2("sxth r0, r1", 1, r0, r1, 0);
1481	TESTINST2("sxth r0, r1", 0x7fff, r0, r1, 0);
1482	TESTINST2("sxth r0, r1", 0xffff, r0, r1, 0);
1483	TESTINST2("sxth r0, r1", 0x10ffff, r0, r1, 0);
1484	TESTINST2("sxth r0, r1", 0x107fff, r0, r1, 0);
1485	TESTINST2("sxth r0, r1", 0xffffffff, r0, r1, 0);
1486
1487	TESTINST2("uxtb r0, r1, ror #0", 0x000000ff, r0, r1, 0);
1488	TESTINST2("uxtb r0, r1, ror #8", 0x000000ff, r0, r1, 0);
1489	TESTINST2("uxtb r0, r1, ror #8", 0x0000ff00, r0, r1, 0);
1490	TESTINST2("uxtb r0, r1, ror #16", 0x00ff0000, r0, r1, 0);
1491	TESTINST2("uxtb r0, r1, ror #24", 0xff000000, r0, r1, 0);
1492
1493	TESTINST2("uxtb16 r0, r1", 0xffffffff, r0, r1, 0);
1494	TESTINST2("uxtb16 r0, r1, ror #16", 0x0000ffff, r0, r1, 0);
1495	TESTINST2("sxtb16 r0, r1", 0xffffffff, r0, r1, 0);
1496	TESTINST2("sxtb16 r0, r1", 0x00ff00ff, r0, r1, 0);
1497	TESTINST2("sxtb16 r0, r1", 0x007f007f, r0, r1, 0);
1498
1499	printf("------------ BFI ------------\n");
1500
1501        /* bfi  rDst, rSrc, #lsb-in-dst, #number-of-bits-to-copy */
1502	TESTINST2("bfi  r0, r1, #0, #11", 0xAAAAAAAA, r0, r1, 0);
1503	TESTINST2("bfi  r0, r1, #1, #11", 0xAAAAAAAA, r0, r1, 0);
1504	TESTINST2("bfi  r0, r1, #2, #11", 0xAAAAAAAA, r0, r1, 0);
1505
1506	TESTINST2("bfi  r0, r1, #19, #11", 0xFFFFFFFF, r0, r1, 0);
1507	TESTINST2("bfi  r0, r1, #20, #11", 0xFFFFFFFF, r0, r1, 0);
1508	TESTINST2("bfi  r0, r1, #21, #11", 0xFFFFFFFF, r0, r1, 0);
1509
1510	TESTINST2("bfi  r0, r1, #0, #32", 0xFFFFFFFF, r0, r1, 0);
1511	TESTINST2("bfi  r0, r1, #1, #31", 0xFFFFFFFF, r0, r1, 0);
1512
1513	TESTINST2("bfi  r0, r1, #29, #3", 0xFFFFFFFF, r0, r1, 0);
1514	TESTINST2("bfi  r0, r1, #30, #2", 0xFFFFFFFF, r0, r1, 0);
1515	TESTINST2("bfi  r0, r1, #31, #1", 0xFFFFFFFF, r0, r1, 0);
1516
1517	printf("------------ BFC ------------\n");
1518
1519        /* bfi  rDst, #lsb-in-dst, #number-of-bits-to-copy */
1520	TESTINST2("bfc  r0, #0, #11", 0xAAAAAAAA, r0, r1, 0);
1521	TESTINST2("bfc  r0, #1, #11", 0xAAAAAAAA, r0, r1, 0);
1522	TESTINST2("bfc  r0, #2, #11", 0xAAAAAAAA, r0, r1, 0);
1523
1524	TESTINST2("bfc  r0, #19, #11", 0xFFFFFFFF, r0, r1, 0);
1525	TESTINST2("bfc  r0, #20, #11", 0xFFFFFFFF, r0, r1, 0);
1526	TESTINST2("bfc  r0, #21, #11", 0xFFFFFFFF, r0, r1, 0);
1527
1528	TESTINST2("bfc  r0, #0, #32", 0xFFFFFFFF, r0, r1, 0);
1529	TESTINST2("bfc  r0, #1, #31", 0xFFFFFFFF, r0, r1, 0);
1530
1531	TESTINST2("bfc  r0, #29, #3", 0xFFFFFFFF, r0, r1, 0);
1532	TESTINST2("bfc  r0, #30, #2", 0xFFFFFFFF, r0, r1, 0);
1533	TESTINST2("bfc  r0, #31, #1", 0xFFFFFFFF, r0, r1, 0);
1534
1535	printf("------------ SBFX ------------\n");
1536
1537        /* sbfx rDst, rSrc, #lsb, #width */
1538        TESTINST2("sbfx  r0, r1, #0, #1", 0x00000000, r0, r1, 0);
1539        TESTINST2("sbfx  r0, r1, #0, #1", 0x00000001, r0, r1, 0);
1540        TESTINST2("sbfx  r0, r1, #1, #1", 0x00000000, r0, r1, 0);
1541        TESTINST2("sbfx  r0, r1, #1, #1", 0x00000001, r0, r1, 0);
1542        TESTINST2("sbfx  r0, r1, #1, #1", 0x00000002, r0, r1, 0);
1543        TESTINST2("sbfx  r0, r1, #1, #1", 0x00000003, r0, r1, 0);
1544
1545        TESTINST2("sbfx  r0, r1, #0, #2", 0x00000000, r0, r1, 0);
1546        TESTINST2("sbfx  r0, r1, #0, #2", 0x00000001, r0, r1, 0);
1547        TESTINST2("sbfx  r0, r1, #1, #2", 0x00000000, r0, r1, 0);
1548        TESTINST2("sbfx  r0, r1, #1, #2", 0x00000001, r0, r1, 0);
1549        TESTINST2("sbfx  r0, r1, #1, #2", 0x00000002, r0, r1, 0);
1550        TESTINST2("sbfx  r0, r1, #1, #2", 0x00000003, r0, r1, 0);
1551
1552        TESTINST2("sbfx  r0, r1, #0, #11", 0xAAAAAAAA, r0, r1, 0);
1553        TESTINST2("sbfx  r0, r1, #1, #11", 0xAAAAAAAA, r0, r1, 0);
1554        TESTINST2("sbfx  r0, r1, #2, #11", 0xAAAAAAAA, r0, r1, 0);
1555
1556        TESTINST2("sbfx  r0, r1, #2, #11", 0xAAAAAAAA, r0, r1, 0);
1557
1558        TESTINST2("sbfx  r0, r1, #31, #1", 0xAAAAAAAA, r0, r1, 0);
1559        TESTINST2("sbfx  r0, r1, #30, #2", 0xAAAAAAAA, r0, r1, 0);
1560
1561	printf("------------ UBFX ------------\n");
1562
1563        /* ubfx rDst, rSrc, #lsb, #width */
1564        TESTINST2("ubfx  r0, r1, #0, #1", 0x00000000, r0, r1, 0);
1565        TESTINST2("ubfx  r0, r1, #0, #1", 0x00000001, r0, r1, 0);
1566        TESTINST2("ubfx  r0, r1, #1, #1", 0x00000000, r0, r1, 0);
1567        TESTINST2("ubfx  r0, r1, #1, #1", 0x00000001, r0, r1, 0);
1568        TESTINST2("ubfx  r0, r1, #1, #1", 0x00000002, r0, r1, 0);
1569        TESTINST2("ubfx  r0, r1, #1, #1", 0x00000003, r0, r1, 0);
1570
1571        TESTINST2("ubfx  r0, r1, #0, #2", 0x00000000, r0, r1, 0);
1572        TESTINST2("ubfx  r0, r1, #0, #2", 0x00000001, r0, r1, 0);
1573        TESTINST2("ubfx  r0, r1, #1, #2", 0x00000000, r0, r1, 0);
1574        TESTINST2("ubfx  r0, r1, #1, #2", 0x00000001, r0, r1, 0);
1575        TESTINST2("ubfx  r0, r1, #1, #2", 0x00000002, r0, r1, 0);
1576        TESTINST2("ubfx  r0, r1, #1, #2", 0x00000003, r0, r1, 0);
1577
1578        TESTINST2("ubfx  r0, r1, #0, #11", 0xAAAAAAAA, r0, r1, 0);
1579        TESTINST2("ubfx  r0, r1, #1, #11", 0xAAAAAAAA, r0, r1, 0);
1580        TESTINST2("ubfx  r0, r1, #2, #11", 0xAAAAAAAA, r0, r1, 0);
1581
1582        TESTINST2("ubfx  r0, r1, #2, #11", 0xAAAAAAAA, r0, r1, 0);
1583
1584        TESTINST2("ubfx  r0, r1, #31, #1", 0xAAAAAAAA, r0, r1, 0);
1585        TESTINST2("ubfx  r0, r1, #30, #2", 0xAAAAAAAA, r0, r1, 0);
1586
1587	printf("------------ SMULL{B,T}{B,T} ------------\n");
1588        /* SMULxx rD, rN, rM */
1589
1590	TESTINST3("smulbb r0, r1, r2", 0x00030000, 0x00040000,  r0, r1, r2, 0);
1591	TESTINST3("smulbb r0, r1, r2", 0x00030001, 0x00040002,  r0, r1, r2, 0);
1592	TESTINST3("smulbb r0, r1, r2", 0x00038001, 0x00047fff,  r0, r1, r2, 0);
1593	TESTINST3("smulbb r0, r1, r2", 0x00037fff, 0x00047fff,  r0, r1, r2, 0);
1594	TESTINST3("smulbb r0, r1, r2", 0x0003ffff, 0x0004ffff,  r0, r1, r2, 0);
1595
1596	printf("------------ SXTAB ------------\n");
1597        TESTINST3("sxtab r0, r1, r2, ROR #24", 0x31415927, 0x27182819,
1598                  r0, r1, r2, 0);
1599        TESTINST3("sxtab r0, r1, r2, ROR #16", 0x31415927, 0x27182819,
1600                  r0, r1, r2, 0);
1601        TESTINST3("sxtab r0, r1, r2, ROR #8", 0x31415927, 0x27182819,
1602                  r0, r1, r2, 0);
1603        TESTINST3("sxtab r0, r1, r2, ROR #0", 0x31415927, 0x27182819,
1604                  r0, r1, r2, 0);
1605
1606        TESTINST3("sxtab r0, r1, r2, ROR #24", 0x31415927, 0x27182899,
1607                  r0, r1, r2, 0);
1608        TESTINST3("sxtab r0, r1, r2, ROR #16", 0x31415927, 0x27182899,
1609                  r0, r1, r2, 0);
1610        TESTINST3("sxtab r0, r1, r2, ROR #8", 0x31415927, 0x27182899,
1611                  r0, r1, r2, 0);
1612        TESTINST3("sxtab r0, r1, r2, ROR #0", 0x31415927, 0x27182899,
1613                  r0, r1, r2, 0);
1614
1615	printf("------------ UXTAB ------------\n");
1616        TESTINST3("uxtab r0, r1, r2, ROR #24", 0x31415927, 0x27182819,
1617                  r0, r1, r2, 0);
1618        TESTINST3("uxtab r0, r1, r2, ROR #16", 0x31415927, 0x27182819,
1619                  r0, r1, r2, 0);
1620        TESTINST3("uxtab r0, r1, r2, ROR #8", 0x31415927, 0x27182819,
1621                  r0, r1, r2, 0);
1622        TESTINST3("uxtab r0, r1, r2, ROR #0", 0x31415927, 0x27182819,
1623                  r0, r1, r2, 0);
1624
1625        TESTINST3("uxtab r0, r1, r2, ROR #24", 0x31415927, 0x27182899,
1626                  r0, r1, r2, 0);
1627        TESTINST3("uxtab r0, r1, r2, ROR #16", 0x31415927, 0x27182899,
1628                  r0, r1, r2, 0);
1629        TESTINST3("uxtab r0, r1, r2, ROR #8", 0x31415927, 0x27182899,
1630                  r0, r1, r2, 0);
1631        TESTINST3("uxtab r0, r1, r2, ROR #0", 0x31415927, 0x27182899,
1632                  r0, r1, r2, 0);
1633
1634	printf("------------ SXTAH ------------\n");
1635        TESTINST3("sxtah r0, r1, r2, ROR #24", 0x31415927, 0x27182819,
1636                  r0, r1, r2, 0);
1637        TESTINST3("sxtah r0, r1, r2, ROR #16", 0x31415927, 0x27182819,
1638                  r0, r1, r2, 0);
1639        TESTINST3("sxtah r0, r1, r2, ROR #8 ", 0x31415927, 0x27182819,
1640                  r0, r1, r2, 0);
1641        TESTINST3("sxtah r0, r1, r2, ROR #0 ", 0x31415927, 0x27182819,
1642                  r0, r1, r2, 0);
1643
1644        TESTINST3("sxtah r0, r1, r2, ROR #24", 0x31415927, 0x27189819,
1645                  r0, r1, r2, 0);
1646        TESTINST3("sxtah r0, r1, r2, ROR #16", 0x31415927, 0x27189819,
1647                  r0, r1, r2, 0);
1648        TESTINST3("sxtah r0, r1, r2, ROR #8 ", 0x31415927, 0x27189819,
1649                  r0, r1, r2, 0);
1650        TESTINST3("sxtah r0, r1, r2, ROR #0 ", 0x31415927, 0x27189819,
1651                  r0, r1, r2, 0);
1652
1653	printf("------------ UXTAH ------------\n");
1654        TESTINST3("uxtah r0, r1, r2, ROR #24", 0x31415927, 0x27182819,
1655                  r0, r1, r2, 0);
1656        TESTINST3("uxtah r0, r1, r2, ROR #16", 0x31415927, 0x27182819,
1657                  r0, r1, r2, 0);
1658        TESTINST3("uxtah r0, r1, r2, ROR #8 ", 0x31415927, 0x27182819,
1659                  r0, r1, r2, 0);
1660        TESTINST3("uxtah r0, r1, r2, ROR #0 ", 0x31415927, 0x27182819,
1661                  r0, r1, r2, 0);
1662
1663        TESTINST3("uxtah r0, r1, r2, ROR #24", 0x31415927, 0x27189819,
1664                  r0, r1, r2, 0);
1665        TESTINST3("uxtah r0, r1, r2, ROR #16", 0x31415927, 0x27189819,
1666                  r0, r1, r2, 0);
1667        TESTINST3("uxtah r0, r1, r2, ROR #8 ", 0x31415927, 0x27189819,
1668                  r0, r1, r2, 0);
1669        TESTINST3("uxtah r0, r1, r2, ROR #0 ", 0x31415927, 0x27189819,
1670                  r0, r1, r2, 0);
1671
1672	printf("------------ PLD/PLDW (begin) ------------\n");
1673        /* These don't have any effect on the architected state, so,
1674           uh, there's no result values to check.  Just _do_ some of
1675           them and check Valgrind's instruction decoder eats them up
1676           without complaining. */
1677        { int alocal;
1678          printf("pld  reg +/- imm12  cases\n");
1679          __asm__ __volatile__( "pld [%0, #128]" : :/*in*/"r"(&alocal) );
1680          __asm__ __volatile__( "pld [%0, #-128]" : :/*in*/"r"(&alocal) );
1681          __asm__ __volatile__( "pld [r15, #-128]" : :/*in*/"r"(&alocal) );
1682
1683          // apparently pldw is v7 only
1684          //__asm__ __volatile__( "pldw [%0, #128]" : :/*in*/"r"(&alocal) );
1685          //__asm__ __volatile__( "pldw [%0, #-128]" : :/*in*/"r"(&alocal) );
1686          //__asm__ __volatile__( "pldw [r15, #128]" : :/*in*/"r"(&alocal) );
1687
1688          printf("pld  reg +/- shifted reg  cases\n");
1689          __asm__ __volatile__( "pld [%0, %1]" : : /*in*/"r"(&alocal), "r"(0) );
1690          __asm__ __volatile__( "pld [%0, %1, LSL #1]" : : /*in*/"r"(&alocal), "r"(0) );
1691          __asm__ __volatile__( "pld [%0, %1, LSR #1]" : : /*in*/"r"(&alocal), "r"(0) );
1692          __asm__ __volatile__( "pld [%0, %1, ASR #1]" : : /*in*/"r"(&alocal), "r"(0) );
1693          __asm__ __volatile__( "pld [%0, %1, ROR #1]" : : /*in*/"r"(&alocal), "r"(0) );
1694          __asm__ __volatile__( "pld [%0, %1, RRX]" : : /*in*/"r"(&alocal), "r"(0) );
1695        }
1696	printf("------------ PLD/PLDW (done) ------------\n");
1697
1698	printf("------------ RBIT ------------\n");
1699	TESTINST2("rbit r0, r1", 0x00000000, r0, r1, 0);
1700	TESTINST2("rbit r0, r1", 0xFFFFFFFF, r0, r1, 0);
1701	TESTINST2("rbit r0, r1", 0x80000000, r0, r1, 0);
1702	TESTINST2("rbit r0, r1", 0x00000001, r0, r1, 0);
1703	TESTINST2("rbit r0, r1", 0x31415927, r0, r1, 0);
1704	TESTINST2("rbit r0, r1", 0x14141562, r0, r1, 0);
1705   TESTINST2("rbit r0, r1", 0xabe8391f, r0, r1, 0);
1706   TESTINST2("rbit r0, r1", 0x9028aa80, r0, r1, 0);
1707   TESTINST2("rbit r0, r1", 0xead1fc6d, r0, r1, 0);
1708   TESTINST2("rbit r0, r1", 0x35c98c55, r0, r1, 0);
1709   TESTINST2("rbit r0, r1", 0x534af1eb, r0, r1, 0);
1710   TESTINST2("rbit r0, r1", 0x45511b08, r0, r1, 0);
1711   TESTINST2("rbit r0, r1", 0x90077f71, r0, r1, 0);
1712   TESTINST2("rbit r0, r1", 0xde8ca84b, r0, r1, 0);
1713   TESTINST2("rbit r0, r1", 0xe37a0dda, r0, r1, 0);
1714   TESTINST2("rbit r0, r1", 0xe5b83d4b, r0, r1, 0);
1715   TESTINST2("rbit r0, r1", 0xbb6d14ec, r0, r1, 0);
1716   TESTINST2("rbit r0, r1", 0x68983cc9, r0, r1, 0);
1717
1718	printf("------------ REV ------------\n");
1719	TESTINST2("rev r0, r1", 0x00000000, r0, r1, 0);
1720	TESTINST2("rev r0, r1", 0xFFFFFFFF, r0, r1, 0);
1721	TESTINST2("rev r0, r1", 0x80000000, r0, r1, 0);
1722	TESTINST2("rev r0, r1", 0x00000001, r0, r1, 0);
1723	TESTINST2("rev r0, r1", 0x31415927, r0, r1, 0);
1724	TESTINST2("rev r0, r1", 0x14141562, r0, r1, 0);
1725   TESTINST2("rev r0, r1", 0xabe8391f, r0, r1, 0);
1726   TESTINST2("rev r0, r1", 0x9028aa80, r0, r1, 0);
1727   TESTINST2("rev r0, r1", 0xead1fc6d, r0, r1, 0);
1728   TESTINST2("rev r0, r1", 0x35c98c55, r0, r1, 0);
1729   TESTINST2("rev r0, r1", 0x534af1eb, r0, r1, 0);
1730   TESTINST2("rev r0, r1", 0x45511b08, r0, r1, 0);
1731   TESTINST2("rev r0, r1", 0x90077f71, r0, r1, 0);
1732   TESTINST2("rev r0, r1", 0xde8ca84b, r0, r1, 0);
1733   TESTINST2("rev r0, r1", 0xe37a0dda, r0, r1, 0);
1734   TESTINST2("rev r0, r1", 0xe5b83d4b, r0, r1, 0);
1735   TESTINST2("rev r0, r1", 0xbb6d14ec, r0, r1, 0);
1736   TESTINST2("rev r0, r1", 0x68983cc9, r0, r1, 0);
1737
1738	printf("------------ REV16 ------------\n");
1739	TESTINST2("rev16 r0, r1", 0x00000000, r0, r1, 0);
1740	TESTINST2("rev16 r0, r1", 0xFFFFFFFF, r0, r1, 0);
1741	TESTINST2("rev16 r0, r1", 0x80000000, r0, r1, 0);
1742	TESTINST2("rev16 r0, r1", 0x00000001, r0, r1, 0);
1743	TESTINST2("rev16 r0, r1", 0x31415927, r0, r1, 0);
1744	TESTINST2("rev16 r0, r1", 0x14141562, r0, r1, 0);
1745   TESTINST2("rev16 r0, r1", 0xabe8391f, r0, r1, 0);
1746   TESTINST2("rev16 r0, r1", 0x9028aa80, r0, r1, 0);
1747   TESTINST2("rev16 r0, r1", 0xead1fc6d, r0, r1, 0);
1748   TESTINST2("rev16 r0, r1", 0x35c98c55, r0, r1, 0);
1749   TESTINST2("rev16 r0, r1", 0x534af1eb, r0, r1, 0);
1750   TESTINST2("rev16 r0, r1", 0x45511b08, r0, r1, 0);
1751   TESTINST2("rev16 r0, r1", 0x90077f71, r0, r1, 0);
1752   TESTINST2("rev16 r0, r1", 0xde8ca84b, r0, r1, 0);
1753   TESTINST2("rev16 r0, r1", 0xe37a0dda, r0, r1, 0);
1754   TESTINST2("rev16 r0, r1", 0xe5b83d4b, r0, r1, 0);
1755   TESTINST2("rev16 r0, r1", 0xbb6d14ec, r0, r1, 0);
1756   TESTINST2("rev16 r0, r1", 0x68983cc9, r0, r1, 0);
1757
1758	printf("------------ NOP (begin) ------------\n");
1759        printf("nop\n");
1760        __asm__ __volatile__("nop" ::: "memory","cc");
1761        printf("nopeq\n");
1762        __asm__ __volatile__("nopeq" ::: "memory","cc");
1763        printf("nopne\n");
1764        __asm__ __volatile__("nopne" ::: "memory","cc");
1765	printf("------------ NOP (end) ------------\n");
1766
1767	return 0;
1768}
1769