1// RUN: llvm-mc -triple thumbv7 -show-encoding < %s | FileCheck %s
2
3// Test each of the Thumb1 data-processing instructions
4// The assembly syntax for these instructions allows an optional Rd register
5//   OP{S}{<c>}{<q>}  {<Rd>,} <Rn>, <Rm>
6// Assemblers should chose the narrow thumb encoding when possible, i.e.
7//   - Rd == Rn
8//   - Rd, Rn and Rm are < r8
9// In addition, some operations are commutative, allowing the transormation
10// when:
11//   - Rd == Rn || Rd == Rm
12//   - Rd, Rn and Rm are < r8
13
14// AND (commutative)
15    ANDS     r0, r2, r1          // Must be wide - 3 distinct registers
16    ANDS     r2, r2, r1          // Should choose narrow
17    ANDS     r2, r1, r2          // Should choose narrow - commutative
18    ANDS.W   r0, r0, r1          // Explicitly wide
19    ANDS.W   r3, r1, r3
20    AND      r0, r1, r0          // Must use wide encoding as not flag-setting
21    ANDS     r7, r7, r1          // Should use narrow
22    ANDS     r7, r1, r7          // Commutative
23    ANDS     r8, r1, r8          // high registers so must use wide encoding
24    ANDS     r8, r8, r1
25    ANDS     r0, r8, r0
26    ANDS     r1, r1, r8
27    ANDS     r2, r2, r1, lsl #1  // Must use wide - shifted register
28    ANDS     r0, r1, r0, lsr #1
29// CHECK: ands.w  r0, r2, r1              @ encoding: [0x12,0xea,0x01,0x00]
30// CHECK: ands    r2, r1                  @ encoding: [0x0a,0x40]
31// CHECK: ands    r2, r1                  @ encoding: [0x0a,0x40]
32// CHECK: ands.w  r0, r0, r1              @ encoding: [0x10,0xea,0x01,0x00]
33// CHECK: ands.w  r3, r1, r3              @ encoding: [0x11,0xea,0x03,0x03]
34// CHECK: and.w   r0, r1, r0              @ encoding: [0x01,0xea,0x00,0x00]
35// CHECK: ands    r7, r1                  @ encoding: [0x0f,0x40]
36// CHECK: ands    r7, r1                  @ encoding: [0x0f,0x40]
37// CHECK: ands.w  r8, r1, r8              @ encoding: [0x11,0xea,0x08,0x08]
38// CHECK: ands.w  r8, r8, r1              @ encoding: [0x18,0xea,0x01,0x08]
39// CHECK: ands.w  r0, r8, r0              @ encoding: [0x18,0xea,0x00,0x00]
40// CHECK: ands.w  r1, r1, r8              @ encoding: [0x11,0xea,0x08,0x01]
41// CHECK: ands.w  r2, r2, r1, lsl #1      @ encoding: [0x12,0xea,0x41,0x02]
42// CHECK: ands.w  r0, r1, r0, lsr #1      @ encoding: [0x11,0xea,0x50,0x00]
43
44    IT EQ
45    ANDEQ    r0, r2, r1          // Must be wide - 3 distinct registers
46    IT EQ
47    ANDEQ    r3, r3, r1          // Should choose narrow
48    IT EQ
49    ANDEQ    r3, r1, r3          // Should choose narrow - commutative
50    IT EQ
51    ANDEQ.W  r0, r0, r1          // Explicitly wide
52    IT EQ
53    ANDEQ.W  r2, r1, r2
54    IT EQ
55    ANDSEQ   r0, r1, r0          // Must use wide encoding as flag-setting
56    IT EQ
57    ANDEQ    r7, r7, r1          // Should use narrow
58    IT EQ
59    ANDEQ    r7, r1, r7          // Commutative
60    IT EQ
61    ANDEQ    r8, r1, r8          // high registers so must use wide encoding
62    IT EQ
63    ANDEQ    r8, r8, r1
64    IT EQ
65    ANDEQ    r4, r8, r4
66    IT EQ
67    ANDEQ    r4, r4, r8
68    IT EQ
69    ANDEQ    r0, r0, r1, lsl #1  // Must use wide - shifted register
70    IT EQ
71    ANDEQ    r5, r1, r5, lsr #1
72// CHECK: it eq                           @ encoding: [0x08,0xbf]
73// CHECK: andeq.w  r0, r2, r1             @ encoding: [0x02,0xea,0x01,0x00]
74// CHECK: it eq                           @ encoding: [0x08,0xbf]
75// CHECK: andeq    r3, r1                 @ encoding: [0x0b,0x40]
76// CHECK: it eq                           @ encoding: [0x08,0xbf]
77// CHECK: andeq    r3, r1                 @ encoding: [0x0b,0x40]
78// CHECK: it eq                           @ encoding: [0x08,0xbf]
79// CHECK: andeq.w  r0, r0, r1             @ encoding: [0x00,0xea,0x01,0x00]
80// CHECK: it eq                           @ encoding: [0x08,0xbf]
81// CHECK: andeq.w  r2, r1, r2             @ encoding: [0x01,0xea,0x02,0x02]
82// CHECK: it eq                           @ encoding: [0x08,0xbf]
83// CHECK: andseq.w r0, r1, r0             @ encoding: [0x11,0xea,0x00,0x00]
84// CHECK: it eq                           @ encoding: [0x08,0xbf]
85// CHECK: andeq    r7, r1                 @ encoding: [0x0f,0x40]
86// CHECK: it eq                           @ encoding: [0x08,0xbf]
87// CHECK: andeq    r7, r1                 @ encoding: [0x0f,0x40]
88// CHECK: it eq                           @ encoding: [0x08,0xbf]
89// CHECK: andeq.w  r8, r1, r8             @ encoding: [0x01,0xea,0x08,0x08]
90// CHECK: it eq                           @ encoding: [0x08,0xbf]
91// CHECK: andeq.w  r8, r8, r1             @ encoding: [0x08,0xea,0x01,0x08]
92// CHECK: it eq                           @ encoding: [0x08,0xbf]
93// CHECK: andeq.w  r4, r8, r4             @ encoding: [0x08,0xea,0x04,0x04]
94// CHECK: it eq                           @ encoding: [0x08,0xbf]
95// CHECK: andeq.w  r4, r4, r8             @ encoding: [0x04,0xea,0x08,0x04]
96// CHECK: it eq                           @ encoding: [0x08,0xbf]
97// CHECK: andeq.w  r0, r0, r1, lsl #1     @ encoding: [0x00,0xea,0x41,0x00]
98// CHECK: it eq                           @ encoding: [0x08,0xbf]
99// CHECK: andeq.w  r5, r1, r5, lsr #1     @ encoding: [0x01,0xea,0x55,0x05]
100
101// EOR (commutative)
102    EORS     r0, r2, r1          // Must be wide - 3 distinct registers
103    EORS     r5, r5, r1          // Should choose narrow
104    EORS     r5, r1, r5          // Should choose narrow - commutative
105    EORS.W   r0, r0, r1          // Explicitly wide
106    EORS.W   r2, r1, r2
107    EOR      r1, r1, r1          // Must use wide encoding as not flag-setting
108    EORS     r7, r7, r1          // Should use narrow
109    EORS     r7, r1, r7          // Commutative
110    EORS     r8, r1, r8          // high registers so must use wide encoding
111    EORS     r8, r8, r1
112    EORS     r6, r8, r6
113    EORS     r0, r0, r8
114    EORS     r2, r2, r1, lsl #1  // Must use wide - shifted register
115    EORS     r0, r1, r0, lsr #1
116// CHECK: eors.w  r0, r2, r1              @ encoding: [0x92,0xea,0x01,0x00]
117// CHECK: eors    r5, r1                  @ encoding: [0x4d,0x40]
118// CHECK: eors    r5, r1                  @ encoding: [0x4d,0x40]
119// CHECK: eors.w  r0, r0, r1              @ encoding: [0x90,0xea,0x01,0x00]
120// CHECK: eors.w  r2, r1, r2              @ encoding: [0x91,0xea,0x02,0x02]
121// CHECK: eor.w   r1, r1, r1              @ encoding: [0x81,0xea,0x01,0x01]
122// CHECK: eors    r7, r1                  @ encoding: [0x4f,0x40]
123// CHECK: eors    r7, r1                  @ encoding: [0x4f,0x40]
124// CHECK: eors.w  r8, r1, r8              @ encoding: [0x91,0xea,0x08,0x08]
125// CHECK: eors.w  r8, r8, r1              @ encoding: [0x98,0xea,0x01,0x08]
126// CHECK: eors.w  r6, r8, r6              @ encoding: [0x98,0xea,0x06,0x06]
127// CHECK: eors.w  r0, r0, r8              @ encoding: [0x90,0xea,0x08,0x00]
128// CHECK: eors.w  r2, r2, r1, lsl #1      @ encoding: [0x92,0xea,0x41,0x02]
129// CHECK: eors.w  r0, r1, r0, lsr #1      @ encoding: [0x91,0xea,0x50,0x00]
130
131    IT EQ
132    EOREQ    r3, r2, r1          // Must be wide - 3 distinct registers
133    IT EQ
134    EOREQ    r0, r0, r1          // Should choose narrow
135    IT EQ
136    EOREQ    r2, r1, r2          // Should choose narrow - commutative
137    IT EQ
138    EOREQ.W  r3, r3, r1          // Explicitly wide
139    IT EQ
140    EOREQ.W  r0, r1, r0
141    IT EQ
142    EORSEQ   r1, r1, r1          // Must use wide encoding as flag-setting
143    IT EQ
144    EOREQ    r7, r7, r1          // Should use narrow
145    IT EQ
146    EOREQ    r7, r1, r7          // Commutative
147    IT EQ
148    EOREQ    r8, r1, r8          // high registers so must use wide encoding
149    IT EQ
150    EOREQ    r8, r8, r1
151    IT EQ
152    EOREQ    r0, r8, r0
153    IT EQ
154    EOREQ    r3, r3, r8
155    IT EQ
156    EOREQ    r4, r4, r1, lsl #1  // Must use wide - shifted register
157    IT EQ
158    EOREQ    r0, r1, r0, lsr #1
159// CHECK: it eq                           @ encoding: [0x08,0xbf]
160// CHECK: eoreq.w  r3, r2, r1             @ encoding: [0x82,0xea,0x01,0x03]
161// CHECK: it eq                           @ encoding: [0x08,0xbf]
162// CHECK: eoreq    r0, r1                 @ encoding: [0x48,0x40]
163// CHECK: it eq                           @ encoding: [0x08,0xbf]
164// CHECK: eoreq    r2, r1                 @ encoding: [0x4a,0x40]
165// CHECK: it eq                           @ encoding: [0x08,0xbf]
166// CHECK: eoreq.w  r3, r3, r1             @ encoding: [0x83,0xea,0x01,0x03]
167// CHECK: it eq                           @ encoding: [0x08,0xbf]
168// CHECK: eoreq.w  r0, r1, r0             @ encoding: [0x81,0xea,0x00,0x00]
169// CHECK: it eq                           @ encoding: [0x08,0xbf]
170// CHECK: eorseq.w r1, r1, r1             @ encoding: [0x91,0xea,0x01,0x01]
171// CHECK: it eq                           @ encoding: [0x08,0xbf]
172// CHECK: eoreq    r7, r1                 @ encoding: [0x4f,0x40]
173// CHECK: it eq                           @ encoding: [0x08,0xbf]
174// CHECK: eoreq    r7, r1                 @ encoding: [0x4f,0x40]
175// CHECK: it eq                           @ encoding: [0x08,0xbf]
176// CHECK: eoreq.w  r8, r1, r8             @ encoding: [0x81,0xea,0x08,0x08]
177// CHECK: it eq                           @ encoding: [0x08,0xbf]
178// CHECK: eoreq.w  r8, r8, r1             @ encoding: [0x88,0xea,0x01,0x08]
179// CHECK: it eq                           @ encoding: [0x08,0xbf]
180// CHECK: eoreq.w  r0, r8, r0             @ encoding: [0x88,0xea,0x00,0x00]
181// CHECK: it eq                           @ encoding: [0x08,0xbf]
182// CHECK: eoreq.w  r3, r3, r8             @ encoding: [0x83,0xea,0x08,0x03]
183// CHECK: it eq                           @ encoding: [0x08,0xbf]
184// CHECK: eoreq.w  r4, r4, r1, lsl #1     @ encoding: [0x84,0xea,0x41,0x04]
185// CHECK: it eq                           @ encoding: [0x08,0xbf]
186// CHECK: eoreq.w  r0, r1, r0, lsr #1     @ encoding: [0x81,0xea,0x50,0x00]
187
188// LSL
189    LSLS     r0, r2, r1          // Must be wide - 3 distinct registers
190    LSLS     r2, r2, r1          // Should choose narrow
191    LSLS     r2, r1, r2          // Should choose wide - not commutative
192    LSLS.W   r0, r0, r1          // Explicitly wide
193    LSLS.W   r4, r1, r4
194    LSL      r4, r1, r4          // Must use wide encoding as not flag-setting
195    LSLS     r7, r7, r1          // Should use narrow
196    LSLS     r8, r1, r8          // high registers so must use wide encoding
197    LSLS     r8, r8, r1
198    LSLS     r3, r8, r3
199    LSLS     r5, r5, r8
200// CHECK: lsls.w  r0, r2, r1              @ encoding: [0x12,0xfa,0x01,0xf0]
201// CHECK: lsls    r2, r1                  @ encoding: [0x8a,0x40]
202// CHECK: lsls.w  r2, r1, r2              @ encoding: [0x11,0xfa,0x02,0xf2]
203// CHECK: lsls.w  r0, r0, r1              @ encoding: [0x10,0xfa,0x01,0xf0]
204// CHECK: lsls.w  r4, r1, r4              @ encoding: [0x11,0xfa,0x04,0xf4]
205// CHECK: lsl.w   r4, r1, r4              @ encoding: [0x01,0xfa,0x04,0xf4]
206// CHECK: lsls    r7, r1                  @ encoding: [0x8f,0x40]
207// CHECK: lsls.w  r8, r1, r8              @ encoding: [0x11,0xfa,0x08,0xf8]
208// CHECK: lsls.w  r8, r8, r1              @ encoding: [0x18,0xfa,0x01,0xf8]
209// CHECK: lsls.w  r3, r8, r3              @ encoding: [0x18,0xfa,0x03,0xf3]
210// CHECK: lsls.w  r5, r5, r8              @ encoding: [0x15,0xfa,0x08,0xf5]
211
212    IT EQ
213    LSLEQ    r0, r2, r1          // Must be wide - 3 distinct registers
214    IT EQ
215    LSLEQ    r2, r2, r1          // Should choose narrow
216    IT EQ
217    LSLEQ    r2, r1, r2          // Should choose wide - not commutative
218    IT EQ
219    LSLEQ.W  r0, r0, r1          // Explicitly wide
220    IT EQ
221    LSLEQ.W  r3, r1, r3
222    IT EQ
223    LSLSEQ   r4, r1, r4          // Must use wide encoding as flag-setting
224    IT EQ
225    LSLEQ    r7, r7, r1          // Should use narrow
226    IT EQ
227    LSLEQ    r8, r1, r8          // high registers so must use wide encoding
228    IT EQ
229    LSLEQ    r8, r8, r1
230    IT EQ
231    LSLEQ    r0, r8, r0
232    IT EQ
233    LSLEQ    r3, r3, r8
234// CHECK: it eq                           @ encoding: [0x08,0xbf]
235// CHECK: lsleq.w  r0, r2, r1             @ encoding: [0x02,0xfa,0x01,0xf0]
236// CHECK: it eq                           @ encoding: [0x08,0xbf]
237// CHECK: lsleq    r2, r1                 @ encoding: [0x8a,0x40]
238// CHECK: it eq                           @ encoding: [0x08,0xbf]
239// CHECK: lsleq.w  r2, r1, r2             @ encoding: [0x01,0xfa,0x02,0xf2]
240// CHECK: it eq                           @ encoding: [0x08,0xbf]
241// CHECK: lsleq.w  r0, r0, r1             @ encoding: [0x00,0xfa,0x01,0xf0]
242// CHECK: it eq                           @ encoding: [0x08,0xbf]
243// CHECK: lsleq.w  r3, r1, r3             @ encoding: [0x01,0xfa,0x03,0xf3]
244// CHECK: it eq                           @ encoding: [0x08,0xbf]
245// CHECK: lslseq.w r4, r1, r4             @ encoding: [0x11,0xfa,0x04,0xf4]
246// CHECK: it eq                           @ encoding: [0x08,0xbf]
247// CHECK: lsleq    r7, r1                 @ encoding: [0x8f,0x40]
248// CHECK: it eq                           @ encoding: [0x08,0xbf]
249// CHECK: lsleq.w  r8, r1, r8             @ encoding: [0x01,0xfa,0x08,0xf8]
250// CHECK: it eq                           @ encoding: [0x08,0xbf]
251// CHECK: lsleq.w  r8, r8, r1             @ encoding: [0x08,0xfa,0x01,0xf8]
252// CHECK: it eq                           @ encoding: [0x08,0xbf]
253// CHECK: lsleq.w  r0, r8, r0             @ encoding: [0x08,0xfa,0x00,0xf0]
254// CHECK: it eq                           @ encoding: [0x08,0xbf]
255// CHECK: lsleq.w  r3, r3, r8             @ encoding: [0x03,0xfa,0x08,0xf3]
256
257// LSR
258    LSRS     r6, r2, r1          // Must be wide - 3 distinct registers
259    LSRS     r2, r2, r1          // Should choose narrow
260    LSRS     r2, r1, r2          // Should choose wide - not commutative
261    LSRS.W   r2, r2, r1          // Explicitly wide
262    LSRS.W   r3, r1, r3
263    LSR      r4, r1, r4          // Must use wide encoding as not flag-setting
264    LSRS     r7, r7, r1          // Should use narrow
265    LSRS     r8, r1, r8          // high registers so must use wide encoding
266    LSRS     r8, r8, r1
267    LSRS     r2, r8, r2
268    LSRS     r5, r5, r8
269// CHECK: lsrs.w  r6, r2, r1              @ encoding: [0x32,0xfa,0x01,0xf6]
270// CHECK: lsrs    r2, r1                  @ encoding: [0xca,0x40]
271// CHECK: lsrs.w  r2, r1, r2              @ encoding: [0x31,0xfa,0x02,0xf2]
272// CHECK: lsrs.w  r2, r2, r1              @ encoding: [0x32,0xfa,0x01,0xf2]
273// CHECK: lsrs.w  r3, r1, r3              @ encoding: [0x31,0xfa,0x03,0xf3]
274// CHECK: lsr.w   r4, r1, r4              @ encoding: [0x21,0xfa,0x04,0xf4]
275// CHECK: lsrs    r7, r1                  @ encoding: [0xcf,0x40]
276// CHECK: lsrs.w  r8, r1, r8              @ encoding: [0x31,0xfa,0x08,0xf8]
277// CHECK: lsrs.w  r8, r8, r1              @ encoding: [0x38,0xfa,0x01,0xf8]
278// CHECK: lsrs.w  r2, r8, r2              @ encoding: [0x38,0xfa,0x02,0xf2]
279// CHECK: lsrs.w  r5, r5, r8              @ encoding: [0x35,0xfa,0x08,0xf5]
280
281    IT EQ
282    LSREQ    r6, r2, r1          // Must be wide - 3 distinct registers
283    IT EQ
284    LSREQ    r7, r7, r1          // Should choose narrow
285    IT EQ
286    LSREQ    r7, r1, r7          // Should choose wide - not commutative
287    IT EQ
288    LSREQ.W  r7, r7, r1          // Explicitly wide
289    IT EQ
290    LSREQ.W  r2, r1, r2
291    IT EQ
292    LSRSEQ   r0, r1, r0          // Must use wide encoding as flag-setting
293    IT EQ
294    LSREQ    r7, r7, r1          // Should use narrow
295    IT EQ
296    LSREQ    r8, r1, r8          // high registers so must use wide encoding
297    IT EQ
298    LSREQ    r8, r8, r1
299    IT EQ
300    LSREQ    r1, r8, r1
301    IT EQ
302    LSREQ    r4, r4, r8
303// CHECK: it eq                           @ encoding: [0x08,0xbf]
304// CHECK: lsreq.w  r6, r2, r1             @ encoding: [0x22,0xfa,0x01,0xf6]
305// CHECK: it eq                           @ encoding: [0x08,0xbf]
306// CHECK: lsreq    r7, r1                 @ encoding: [0xcf,0x40]
307// CHECK: it eq                           @ encoding: [0x08,0xbf]
308// CHECK: lsreq.w  r7, r1, r7             @ encoding: [0x21,0xfa,0x07,0xf7]
309// CHECK: it eq                           @ encoding: [0x08,0xbf]
310// CHECK: lsreq.w  r7, r7, r1             @ encoding: [0x27,0xfa,0x01,0xf7]
311// CHECK: it eq                           @ encoding: [0x08,0xbf]
312// CHECK: lsreq.w  r2, r1, r2             @ encoding: [0x21,0xfa,0x02,0xf2]
313// CHECK: it eq                           @ encoding: [0x08,0xbf]
314// CHECK: lsrseq.w r0, r1, r0             @ encoding: [0x31,0xfa,0x00,0xf0]
315// CHECK: it eq                           @ encoding: [0x08,0xbf]
316// CHECK: lsreq    r7, r1                 @ encoding: [0xcf,0x40]
317// CHECK: it eq                           @ encoding: [0x08,0xbf]
318// CHECK: lsreq.w  r8, r1, r8             @ encoding: [0x21,0xfa,0x08,0xf8]
319// CHECK: it eq                           @ encoding: [0x08,0xbf]
320// CHECK: lsreq.w  r8, r8, r1             @ encoding: [0x28,0xfa,0x01,0xf8]
321// CHECK: it eq                           @ encoding: [0x08,0xbf]
322// CHECK: lsreq.w  r1, r8, r1             @ encoding: [0x28,0xfa,0x01,0xf1]
323// CHECK: it eq                           @ encoding: [0x08,0xbf]
324// CHECK: lsreq.w  r4, r4, r8             @ encoding: [0x24,0xfa,0x08,0xf4]
325
326// ASR
327    ASRS     r7, r6, r5          // Must be wide - 3 distinct registers
328    ASRS     r0, r0, r1          // Should choose narrow
329    ASRS     r0, r1, r0          // Should choose wide - not commutative
330    ASRS.W   r3, r3, r1          // Explicitly wide
331    ASRS.W   r1, r1, r1
332    ASR      r0, r1, r0          // Must use wide encoding as not flag-setting
333    ASRS     r7, r7, r1          // Should use narrow
334    ASRS     r8, r1, r8          // high registers so must use wide encoding
335    ASRS     r8, r8, r1
336    ASRS     r5, r8, r5
337    ASRS     r5, r5, r8
338// CHECK: asrs.w  r7, r6, r5              @ encoding: [0x56,0xfa,0x05,0xf7]
339// CHECK: asrs    r0, r1                  @ encoding: [0x08,0x41]
340// CHECK: asrs.w  r0, r1, r0              @ encoding: [0x51,0xfa,0x00,0xf0]
341// CHECK: asrs.w  r3, r3, r1              @ encoding: [0x53,0xfa,0x01,0xf3]
342// CHECK: asrs.w  r1, r1, r1              @ encoding: [0x51,0xfa,0x01,0xf1]
343// CHECK: asr.w   r0, r1, r0              @ encoding: [0x41,0xfa,0x00,0xf0]
344// CHECK: asrs    r7, r1                  @ encoding: [0x0f,0x41]
345// CHECK: asrs.w  r8, r1, r8              @ encoding: [0x51,0xfa,0x08,0xf8]
346// CHECK: asrs.w  r8, r8, r1              @ encoding: [0x58,0xfa,0x01,0xf8]
347// CHECK: asrs.w  r5, r8, r5              @ encoding: [0x58,0xfa,0x05,0xf5]
348// CHECK: asrs.w  r5, r5, r8              @ encoding: [0x55,0xfa,0x08,0xf5]
349
350    IT EQ
351    ASREQ    r0, r2, r1          // Must be wide - 3 distinct registers
352    IT EQ
353    ASREQ    r2, r2, r1          // Should choose narrow
354    IT EQ
355    ASREQ    r1, r2, r1          // Should choose wide - not commutative
356    IT EQ
357    ASREQ.W  r4, r4, r1          // Explicitly wide
358    IT EQ
359    ASREQ.W  r6, r1, r6
360    IT EQ
361    ASRSEQ   r3, r1, r3          // Must use wide encoding as flag-setting
362    IT EQ
363    ASREQ    r7, r7, r1          // Should use narrow
364    IT EQ
365    ASREQ    r8, r1, r8          // high registers so must use wide encoding
366    IT EQ
367    ASREQ    r8, r8, r1
368    IT EQ
369    ASREQ    r1, r8, r1
370    IT EQ
371    ASREQ    r3, r3, r8
372// CHECK: it eq                           @ encoding: [0x08,0xbf]
373// CHECK: asreq.w  r0, r2, r1             @ encoding: [0x42,0xfa,0x01,0xf0]
374// CHECK: it eq                           @ encoding: [0x08,0xbf]
375// CHECK: asreq    r2, r1                 @ encoding: [0x0a,0x41]
376// CHECK: it eq                           @ encoding: [0x08,0xbf]
377// CHECK: asreq.w  r1, r2, r1             @ encoding: [0x42,0xfa,0x01,0xf1]
378// CHECK: it eq                           @ encoding: [0x08,0xbf]
379// CHECK: asreq.w  r4, r4, r1             @ encoding: [0x44,0xfa,0x01,0xf4]
380// CHECK: it eq                           @ encoding: [0x08,0xbf]
381// CHECK: asreq.w  r6, r1, r6             @ encoding: [0x41,0xfa,0x06,0xf6]
382// CHECK: it eq                           @ encoding: [0x08,0xbf]
383// CHECK: asrseq.w r3, r1, r3             @ encoding: [0x51,0xfa,0x03,0xf3]
384// CHECK: it eq                           @ encoding: [0x08,0xbf]
385// CHECK: asreq    r7, r1                 @ encoding: [0x0f,0x41]
386// CHECK: it eq                           @ encoding: [0x08,0xbf]
387// CHECK: asreq.w  r8, r1, r8             @ encoding: [0x41,0xfa,0x08,0xf8]
388// CHECK: it eq                           @ encoding: [0x08,0xbf]
389// CHECK: asreq.w  r8, r8, r1             @ encoding: [0x48,0xfa,0x01,0xf8]
390// CHECK: it eq                           @ encoding: [0x08,0xbf]
391// CHECK: asreq.w  r1, r8, r1             @ encoding: [0x48,0xfa,0x01,0xf1]
392// CHECK: it eq                           @ encoding: [0x08,0xbf]
393// CHECK: asreq.w  r3, r3, r8             @ encoding: [0x43,0xfa,0x08,0xf3]
394
395// ADC (commutative)
396    ADCS     r5, r2, r1          // Must be wide - 3 distinct registers
397    ADCS     r5, r5, r1          // Should choose narrow
398    ADCS     r3, r1, r3          // Should choose narrow - commutative
399    ADCS.W   r2, r2, r1          // Explicitly wide
400    ADCS.W   r3, r1, r3
401    ADC      r0, r1, r0          // Must use wide encoding as not flag-setting
402    ADCS     r7, r7, r1          // Should use narrow
403    ADCS     r7, r1, r7          // Commutative
404    ADCS     r8, r1, r8          // high registers so must use wide encoding
405    ADCS     r8, r8, r1
406    ADCS     r5, r8, r5
407    ADCS     r2, r2, r8
408    ADCS     r3, r3, r1, lsl #1  // Must use wide - shifted register
409    ADCS     r4, r1, r4, lsr #1
410// CHECK: adcs.w  r5, r2, r1              @ encoding: [0x52,0xeb,0x01,0x05]
411// CHECK: adcs    r5, r1                  @ encoding: [0x4d,0x41]
412// CHECK: adcs    r3, r1                  @ encoding: [0x4b,0x41]
413// CHECK: adcs.w  r2, r2, r1              @ encoding: [0x52,0xeb,0x01,0x02]
414// CHECK: adcs.w  r3, r1, r3              @ encoding: [0x51,0xeb,0x03,0x03]
415// CHECK: adc.w   r0, r1, r0              @ encoding: [0x41,0xeb,0x00,0x00]
416// CHECK: adcs    r7, r1                  @ encoding: [0x4f,0x41]
417// CHECK: adcs    r7, r1                  @ encoding: [0x4f,0x41]
418// CHECK: adcs.w  r8, r1, r8              @ encoding: [0x51,0xeb,0x08,0x08]
419// CHECK: adcs.w  r8, r8, r1              @ encoding: [0x58,0xeb,0x01,0x08]
420// CHECK: adcs.w  r5, r8, r5              @ encoding: [0x58,0xeb,0x05,0x05]
421// CHECK: adcs.w  r2, r2, r8              @ encoding: [0x52,0xeb,0x08,0x02]
422// CHECK: adcs.w  r3, r3, r1, lsl #1      @ encoding: [0x53,0xeb,0x41,0x03]
423// CHECK: adcs.w  r4, r1, r4, lsr #1      @ encoding: [0x51,0xeb,0x54,0x04]
424
425    IT EQ
426    ADCEQ    r1, r2, r3          // Must be wide - 3 distinct registers
427    IT EQ
428    ADCEQ    r1, r1, r1          // Should choose narrow
429    IT EQ
430    ADCEQ    r3, r1, r3          // Should choose narrow - commutative
431    IT EQ
432    ADCEQ.W  r3, r3, r1          // Explicitly wide
433    IT EQ
434    ADCEQ.W  r0, r1, r0
435    IT EQ
436    ADCSEQ   r3, r1, r3          // Must use wide encoding as flag-setting
437    IT EQ
438    ADCEQ    r7, r7, r1          // Should use narrow
439    IT EQ
440    ADCEQ    r7, r1, r7          // Commutative
441    IT EQ
442    ADCEQ    r8, r1, r8          // high registers so must use wide encoding
443    IT EQ
444    ADCEQ    r8, r8, r1
445    IT EQ
446    ADCEQ    r3, r8, r3
447    IT EQ
448    ADCEQ    r1, r1, r8
449    IT EQ
450    ADCEQ    r2, r2, r1, lsl #1  // Must use wide - shifted register
451    IT EQ
452    ADCEQ    r1, r1, r1, lsr #1
453// CHECK: it eq                           @ encoding: [0x08,0xbf]
454// CHECK: adceq.w  r1, r2, r3             @ encoding: [0x42,0xeb,0x03,0x01]
455// CHECK: it eq                           @ encoding: [0x08,0xbf]
456// CHECK: adceq    r1, r1                 @ encoding: [0x49,0x41]
457// CHECK: it eq                           @ encoding: [0x08,0xbf]
458// CHECK: adceq    r3, r1                 @ encoding: [0x4b,0x41]
459// CHECK: it eq                           @ encoding: [0x08,0xbf]
460// CHECK: adceq.w  r3, r3, r1             @ encoding: [0x43,0xeb,0x01,0x03]
461// CHECK: it eq                           @ encoding: [0x08,0xbf]
462// CHECK: adceq.w  r0, r1, r0             @ encoding: [0x41,0xeb,0x00,0x00]
463// CHECK: it eq                           @ encoding: [0x08,0xbf]
464// CHECK: adcseq.w r3, r1, r3             @ encoding: [0x51,0xeb,0x03,0x03]
465// CHECK: it eq                           @ encoding: [0x08,0xbf]
466// CHECK: adceq    r7, r1                 @ encoding: [0x4f,0x41]
467// CHECK: it eq                           @ encoding: [0x08,0xbf]
468// CHECK: adceq    r7, r1                 @ encoding: [0x4f,0x41]
469// CHECK: it eq                           @ encoding: [0x08,0xbf]
470// CHECK: adceq.w  r8, r1, r8             @ encoding: [0x41,0xeb,0x08,0x08]
471// CHECK: it eq                           @ encoding: [0x08,0xbf]
472// CHECK: adceq.w  r8, r8, r1             @ encoding: [0x48,0xeb,0x01,0x08]
473// CHECK: it eq                           @ encoding: [0x08,0xbf]
474// CHECK: adceq.w  r3, r8, r3             @ encoding: [0x48,0xeb,0x03,0x03]
475// CHECK: it eq                           @ encoding: [0x08,0xbf]
476// CHECK: adceq.w  r1, r1, r8             @ encoding: [0x41,0xeb,0x08,0x01]
477// CHECK: it eq                           @ encoding: [0x08,0xbf]
478// CHECK: adceq.w  r2, r2, r1, lsl #1     @ encoding: [0x42,0xeb,0x41,0x02]
479// CHECK: it eq                           @ encoding: [0x08,0xbf]
480// CHECK: adceq.w  r1, r1, r1, lsr #1     @ encoding: [0x41,0xeb,0x51,0x01]
481
482// SBC
483    SBCS     r3, r2, r1          // Must be wide - 3 distinct registers
484    SBCS     r4, r4, r1          // Should choose narrow
485    SBCS     r1, r4, r1          // Should choose wide - not commutative
486    SBCS.W   r4, r4, r1          // Explicitly wide
487    SBCS.W   r2, r1, r2
488    SBC      r0, r1, r0          // Must use wide encoding as not flag-setting
489    SBCS     r7, r7, r1          // Should use narrow
490    SBCS     r8, r1, r8          // high registers so must use wide encoding
491    SBCS     r8, r8, r1
492    SBCS     r4, r8, r4
493    SBCS     r3, r3, r8
494    SBCS     r2, r2, r1, lsl #1  // Must use wide - shifted register
495    SBCS     r5, r1, r5, lsr #1
496// CHECK: sbcs.w  r3, r2, r1              @ encoding: [0x72,0xeb,0x01,0x03]
497// CHECK: sbcs    r4, r1                  @ encoding: [0x8c,0x41]
498// CHECK: sbcs.w  r1, r4, r1              @ encoding: [0x74,0xeb,0x01,0x01]
499// CHECK: sbcs.w  r4, r4, r1              @ encoding: [0x74,0xeb,0x01,0x04]
500// CHECK: sbcs.w  r2, r1, r2              @ encoding: [0x71,0xeb,0x02,0x02]
501// CHECK: sbc.w   r0, r1, r0              @ encoding: [0x61,0xeb,0x00,0x00]
502// CHECK: sbcs    r7, r1                  @ encoding: [0x8f,0x41]
503// CHECK: sbcs.w  r8, r1, r8              @ encoding: [0x71,0xeb,0x08,0x08]
504// CHECK: sbcs.w  r8, r8, r1              @ encoding: [0x78,0xeb,0x01,0x08]
505// CHECK: sbcs.w  r4, r8, r4              @ encoding: [0x78,0xeb,0x04,0x04]
506// CHECK: sbcs.w  r3, r3, r8              @ encoding: [0x73,0xeb,0x08,0x03]
507// CHECK: sbcs.w  r2, r2, r1, lsl #1      @ encoding: [0x72,0xeb,0x41,0x02]
508// CHECK: sbcs.w  r5, r1, r5, lsr #1      @ encoding: [0x71,0xeb,0x55,0x05]
509
510    IT EQ
511    SBCEQ    r5, r2, r1          // Must be wide - 3 distinct registers
512    IT EQ
513    SBCEQ    r5, r5, r1          // Should choose narrow
514    IT EQ
515    SBCEQ    r1, r5, r1          // Should choose narrow
516    IT EQ
517    SBCEQ.W  r5, r5, r1          // Explicitly wide
518    IT EQ
519    SBCEQ.W  r0, r1, r0
520    IT EQ
521    SBCSEQ   r2, r1, r2          // Must use wide encoding as flag-setting
522    IT EQ
523    SBCEQ    r7, r7, r1          // Should use narrow
524    IT EQ
525    SBCEQ    r8, r1, r8          // high registers so must use wide encoding
526    IT EQ
527    SBCEQ    r8, r8, r1
528    IT EQ
529    SBCEQ    r7, r8, r7
530    IT EQ
531    SBCEQ    r7, r7, r8
532    IT EQ
533    SBCEQ    r2, r2, r1, lsl #1  // Must use wide - shifted register
534    IT EQ
535    SBCEQ    r5, r1, r5, lsr #1
536// CHECK: it eq                           @ encoding: [0x08,0xbf]
537// CHECK: sbceq.w  r5, r2, r1             @ encoding: [0x62,0xeb,0x01,0x05]
538// CHECK: it eq                           @ encoding: [0x08,0xbf]
539// CHECK: sbceq    r5, r1                 @ encoding: [0x8d,0x41]
540// CHECK: it eq                           @ encoding: [0x08,0xbf]
541// CHECK: sbceq.w  r1, r5, r1             @ encoding: [0x65,0xeb,0x01,0x01]
542// CHECK: it eq                           @ encoding: [0x08,0xbf]
543// CHECK: sbceq.w  r5, r5, r1             @ encoding: [0x65,0xeb,0x01,0x05]
544// CHECK: it eq                           @ encoding: [0x08,0xbf]
545// CHECK: sbceq.w  r0, r1, r0             @ encoding: [0x61,0xeb,0x00,0x00]
546// CHECK: it eq                           @ encoding: [0x08,0xbf]
547// CHECK: sbcseq.w r2, r1, r2             @ encoding: [0x71,0xeb,0x02,0x02]
548// CHECK: it eq                           @ encoding: [0x08,0xbf]
549// CHECK: sbceq    r7, r1                 @ encoding: [0x8f,0x41]
550// CHECK: it eq                           @ encoding: [0x08,0xbf]
551// CHECK: sbceq.w  r8, r1, r8             @ encoding: [0x61,0xeb,0x08,0x08]
552// CHECK: it eq                           @ encoding: [0x08,0xbf]
553// CHECK: sbceq.w  r8, r8, r1             @ encoding: [0x68,0xeb,0x01,0x08]
554// CHECK: it eq                           @ encoding: [0x08,0xbf]
555// CHECK: sbceq.w  r7, r8, r7             @ encoding: [0x68,0xeb,0x07,0x07]
556// CHECK: it eq                           @ encoding: [0x08,0xbf]
557// CHECK: sbceq.w  r7, r7, r8             @ encoding: [0x67,0xeb,0x08,0x07]
558// CHECK: it eq                           @ encoding: [0x08,0xbf]
559// CHECK: sbceq.w  r2, r2, r1, lsl #1     @ encoding: [0x62,0xeb,0x41,0x02]
560// CHECK: it eq                           @ encoding: [0x08,0xbf]
561// CHECK: sbceq.w  r5, r1, r5, lsr #1     @ encoding: [0x61,0xeb,0x55,0x05]
562
563// ROR
564    RORS     r3, r2, r1          // Must be wide - 3 distinct registers
565    RORS     r0, r0, r1          // Should choose narrow
566    RORS     r1, r0, r1          // Should choose wide - not commutative
567    RORS.W   r2, r2, r1          // Explicitly wide
568    RORS.W   r2, r1, r2
569    ROR      r5, r1, r5          // Must use wide encoding as not flag-setting
570    RORS     r7, r7, r1          // Should use narrow
571    RORS     r8, r1, r8          // high registers so must use wide encoding
572    RORS     r8, r8, r1
573    RORS     r6, r8, r6
574    RORS     r6, r6, r8
575// CHECK: rors.w  r3, r2, r1              @ encoding: [0x72,0xfa,0x01,0xf3]
576// CHECK: rors    r0, r1                  @ encoding: [0xc8,0x41]
577// CHECK: rors.w  r1, r0, r1              @ encoding: [0x70,0xfa,0x01,0xf1]
578// CHECK: rors.w  r2, r2, r1              @ encoding: [0x72,0xfa,0x01,0xf2]
579// CHECK: rors.w  r2, r1, r2              @ encoding: [0x71,0xfa,0x02,0xf2]
580// CHECK: ror.w   r5, r1, r5              @ encoding: [0x61,0xfa,0x05,0xf5]
581// CHECK: rors    r7, r1                  @ encoding: [0xcf,0x41]
582// CHECK: rors.w  r8, r1, r8              @ encoding: [0x71,0xfa,0x08,0xf8]
583// CHECK: rors.w  r8, r8, r1              @ encoding: [0x78,0xfa,0x01,0xf8]
584// CHECK: rors.w  r6, r8, r6              @ encoding: [0x78,0xfa,0x06,0xf6]
585// CHECK: rors.w  r6, r6, r8              @ encoding: [0x76,0xfa,0x08,0xf6]
586
587    IT EQ
588    ROREQ    r4, r2, r1          // Must be wide - 3 distinct registers
589    IT EQ
590    ROREQ    r4, r4, r1          // Should choose narrow
591    IT EQ
592    ROREQ    r1, r4, r1          // Should choose wide - not commutative
593    IT EQ
594    ROREQ.W  r4, r4, r1          // Explicitly wide
595    IT EQ
596    ROREQ.W  r0, r1, r0
597    IT EQ
598    RORSEQ   r0, r1, r0          // Must use wide encoding as flag-setting
599    IT EQ
600    ROREQ    r7, r7, r1          // Should use narrow
601    IT EQ
602    ROREQ    r8, r1, r8          // high registers so must use wide encoding
603    IT EQ
604    ROREQ    r8, r8, r1
605    IT EQ
606    ROREQ    r3, r8, r3
607    IT EQ
608    ROREQ    r1, r1, r8
609// CHECK: it eq                           @ encoding: [0x08,0xbf]
610// CHECK: roreq.w  r4, r2, r1             @ encoding: [0x62,0xfa,0x01,0xf4]
611// CHECK: it eq                           @ encoding: [0x08,0xbf]
612// CHECK: roreq    r4, r1                 @ encoding: [0xcc,0x41]
613// CHECK: it eq                           @ encoding: [0x08,0xbf]
614// CHECK: roreq.w  r1, r4, r1             @ encoding: [0x64,0xfa,0x01,0xf1]
615// CHECK: it eq                           @ encoding: [0x08,0xbf]
616// CHECK: roreq.w  r4, r4, r1             @ encoding: [0x64,0xfa,0x01,0xf4]
617// CHECK: it eq                           @ encoding: [0x08,0xbf]
618// CHECK: roreq.w  r0, r1, r0             @ encoding: [0x61,0xfa,0x00,0xf0]
619// CHECK: it eq                           @ encoding: [0x08,0xbf]
620// CHECK: rorseq.w r0, r1, r0             @ encoding: [0x71,0xfa,0x00,0xf0]
621// CHECK: it eq                           @ encoding: [0x08,0xbf]
622// CHECK: roreq    r7, r1                 @ encoding: [0xcf,0x41]
623// CHECK: it eq                           @ encoding: [0x08,0xbf]
624// CHECK: roreq.w  r8, r1, r8             @ encoding: [0x61,0xfa,0x08,0xf8]
625// CHECK: it eq                           @ encoding: [0x08,0xbf]
626// CHECK: roreq.w  r8, r8, r1             @ encoding: [0x68,0xfa,0x01,0xf8]
627// CHECK: it eq                           @ encoding: [0x08,0xbf]
628// CHECK: roreq.w  r3, r8, r3             @ encoding: [0x68,0xfa,0x03,0xf3]
629// CHECK: it eq                           @ encoding: [0x08,0xbf]
630// CHECK: roreq.w  r1, r1, r8             @ encoding: [0x61,0xfa,0x08,0xf1]
631
632// TST - only two register version available
633// RSB - only two register version available
634// CMP - only two register version available
635// CMN - only two register version available
636
637// ORR (commutative)
638    ORRS     r7, r2, r1          // Must be wide - 3 distinct registers
639    ORRS     r2, r2, r1          // Should choose narrow
640    ORRS     r3, r1, r3          // Should choose narrow - commutative
641    ORRS.W   r4, r4, r1          // Explicitly wide
642    ORRS.W   r5, r1, r5
643    ORR      r2, r1, r2          // Must use wide encoding as not flag-setting
644    ORRS     r7, r7, r1          // Should use narrow
645    ORRS     r7, r1, r7          // Commutative
646    ORRS     r8, r1, r8          // high registers so must use wide encoding
647    ORRS     r8, r8, r1
648    ORRS     r1, r8, r1
649    ORRS     r0, r0, r8
650    ORRS     r1, r1, r1, lsl #1  // Must use wide - shifted register
651    ORRS     r0, r1, r0, lsr #1
652// CHECK: orrs.w  r7, r2, r1              @ encoding: [0x52,0xea,0x01,0x07]
653// CHECK: orrs    r2, r1                  @ encoding: [0x0a,0x43]
654// CHECK: orrs    r3, r1                  @ encoding: [0x0b,0x43]
655// CHECK: orrs.w  r4, r4, r1              @ encoding: [0x54,0xea,0x01,0x04]
656// CHECK: orrs.w  r5, r1, r5              @ encoding: [0x51,0xea,0x05,0x05]
657// CHECK: orr.w   r2, r1, r2              @ encoding: [0x41,0xea,0x02,0x02]
658// CHECK: orrs    r7, r1                  @ encoding: [0x0f,0x43]
659// CHECK: orrs    r7, r1                  @ encoding: [0x0f,0x43]
660// CHECK: orrs.w  r8, r1, r8              @ encoding: [0x51,0xea,0x08,0x08]
661// CHECK: orrs.w  r8, r8, r1              @ encoding: [0x58,0xea,0x01,0x08]
662// CHECK: orrs.w  r1, r8, r1              @ encoding: [0x58,0xea,0x01,0x01]
663// CHECK: orrs.w  r0, r0, r8              @ encoding: [0x50,0xea,0x08,0x00]
664// CHECK: orrs.w  r1, r1, r1, lsl #1      @ encoding: [0x51,0xea,0x41,0x01]
665// CHECK: orrs.w  r0, r1, r0, lsr #1      @ encoding: [0x51,0xea,0x50,0x00]
666
667    IT EQ
668    ORREQ    r0, r2, r1          // Must be wide - 3 distinct registers
669    IT EQ
670    ORREQ    r5, r5, r1          // Should choose narrow
671    IT EQ
672    ORREQ    r5, r1, r5          // Should choose narrow - commutative
673    IT EQ
674    ORREQ.W  r2, r2, r1          // Explicitly wide
675    IT EQ
676    ORREQ.W  r3, r1, r3
677    IT EQ
678    ORRSEQ   r4, r1, r4          // Must use wide encoding as flag-setting
679    IT EQ
680    ORREQ    r7, r7, r1          // Should use narrow
681    IT EQ
682    ORREQ    r7, r1, r7          // Commutative
683    IT EQ
684    ORREQ    r8, r1, r8          // high registers so must use wide encoding
685    IT EQ
686    ORREQ    r8, r8, r1
687    IT EQ
688    ORREQ    r0, r8, r0
689    IT EQ
690    ORREQ    r0, r0, r8
691    IT EQ
692    ORREQ    r2, r2, r1, lsl #1  // Must use wide - shifted register
693    IT EQ
694    ORREQ    r2, r1, r2, lsr #1
695// CHECK: it eq                           @ encoding: [0x08,0xbf]
696// CHECK: orreq.w  r0, r2, r1             @ encoding: [0x42,0xea,0x01,0x00]
697// CHECK: it eq                           @ encoding: [0x08,0xbf]
698// CHECK: orreq    r5, r1                 @ encoding: [0x0d,0x43]
699// CHECK: it eq                           @ encoding: [0x08,0xbf]
700// CHECK: orreq    r5, r1                 @ encoding: [0x0d,0x43]
701// CHECK: it eq                           @ encoding: [0x08,0xbf]
702// CHECK: orreq.w  r2, r2, r1             @ encoding: [0x42,0xea,0x01,0x02]
703// CHECK: it eq                           @ encoding: [0x08,0xbf]
704// CHECK: orreq.w  r3, r1, r3             @ encoding: [0x41,0xea,0x03,0x03]
705// CHECK: it eq                           @ encoding: [0x08,0xbf]
706// CHECK: orrseq.w r4, r1, r4             @ encoding: [0x51,0xea,0x04,0x04]
707// CHECK: it eq                           @ encoding: [0x08,0xbf]
708// CHECK: orreq    r7, r1                 @ encoding: [0x0f,0x43]
709// CHECK: it eq                           @ encoding: [0x08,0xbf]
710// CHECK: orreq    r7, r1                 @ encoding: [0x0f,0x43]
711// CHECK: it eq                           @ encoding: [0x08,0xbf]
712// CHECK: orreq.w  r8, r1, r8             @ encoding: [0x41,0xea,0x08,0x08]
713// CHECK: it eq                           @ encoding: [0x08,0xbf]
714// CHECK: orreq.w  r8, r8, r1             @ encoding: [0x48,0xea,0x01,0x08]
715// CHECK: it eq                           @ encoding: [0x08,0xbf]
716// CHECK: orreq.w  r0, r8, r0             @ encoding: [0x48,0xea,0x00,0x00]
717// CHECK: it eq                           @ encoding: [0x08,0xbf]
718// CHECK: orreq.w  r0, r0, r8             @ encoding: [0x40,0xea,0x08,0x00]
719// CHECK: it eq                           @ encoding: [0x08,0xbf]
720// CHECK: orreq.w  r2, r2, r1, lsl #1     @ encoding: [0x42,0xea,0x41,0x02]
721// CHECK: it eq                           @ encoding: [0x08,0xbf]
722// CHECK: orreq.w  r2, r1, r2, lsr #1     @ encoding: [0x41,0xea,0x52,0x02]
723
724// MUL - not affected by this change
725
726// BIC
727    BICS     r3, r2, r1          // Must be wide - 3 distinct registers
728    BICS     r2, r2, r1          // Should choose narrow
729    BICS     r1, r2, r1          // Should choose wide - not commutative
730    BICS.W   r2, r2, r1          // Explicitly wide
731    BICS.W   r0, r1, r0
732    BIC      r0, r1, r0          // Must use wide encoding as not flag-setting
733    BICS     r7, r7, r1          // Should use narrow
734    BICS     r8, r1, r8          // high registers so must use wide encoding
735    BICS     r8, r8, r1
736    BICS     r7, r8, r7
737    BICS     r5, r5, r8
738    BICS     r3, r3, r1, lsl #1  // Must use wide - shifted register
739    BICS     r4, r1, r4, lsr #1
740// CHECK: bics.w  r3, r2, r1              @ encoding: [0x32,0xea,0x01,0x03]
741// CHECK: bics    r2, r1                  @ encoding: [0x8a,0x43]
742// CHECK: bics.w  r1, r2, r1              @ encoding: [0x32,0xea,0x01,0x01]
743// CHECK: bics.w  r2, r2, r1              @ encoding: [0x32,0xea,0x01,0x02]
744// CHECK: bics.w  r0, r1, r0              @ encoding: [0x31,0xea,0x00,0x00]
745// CHECK: bic.w   r0, r1, r0              @ encoding: [0x21,0xea,0x00,0x00]
746// CHECK: bics    r7, r1                  @ encoding: [0x8f,0x43]
747// CHECK: bics.w  r8, r1, r8              @ encoding: [0x31,0xea,0x08,0x08]
748// CHECK: bics.w  r8, r8, r1              @ encoding: [0x38,0xea,0x01,0x08]
749// CHECK: bics.w  r7, r8, r7              @ encoding: [0x38,0xea,0x07,0x07]
750// CHECK: bics.w  r5, r5, r8              @ encoding: [0x35,0xea,0x08,0x05]
751// CHECK: bics.w  r3, r3, r1, lsl #1      @ encoding: [0x33,0xea,0x41,0x03]
752// CHECK: bics.w  r4, r1, r4, lsr #1      @ encoding: [0x31,0xea,0x54,0x04]
753
754    IT EQ
755    BICEQ    r0, r2, r1          // Must be wide - 3 distinct registers
756    IT EQ
757    BICEQ    r5, r5, r1          // Should choose narrow
758    IT EQ
759    BICEQ    r1, r5, r1          // Should choose wide - not commutative
760    IT EQ
761    BICEQ.W  r4, r4, r1          // Explicitly wide
762    IT EQ
763    BICEQ.W  r2, r1, r2
764    IT EQ
765    BICSEQ   r5, r1, r5          // Must use wide encoding as flag-setting
766    IT EQ
767    BICEQ    r7, r7, r1          // Should use narrow
768    IT EQ
769    BICEQ    r8, r1, r8          // high registers so must use wide encoding
770    IT EQ
771    BICEQ    r8, r8, r1
772    IT EQ
773    BICEQ    r0, r8, r0
774    IT EQ
775    BICEQ    r2, r2, r8
776    IT EQ
777    BICEQ    r4, r4, r1, lsl #1  // Must use wide - shifted register
778    IT EQ
779    BICEQ    r5, r1, r5, lsr #1
780// CHECK: it eq                           @ encoding: [0x08,0xbf]
781// CHECK: biceq.w  r0, r2, r1             @ encoding: [0x22,0xea,0x01,0x00]
782// CHECK: it eq                           @ encoding: [0x08,0xbf]
783// CHECK: biceq    r5, r1                 @ encoding: [0x8d,0x43]
784// CHECK: it eq                           @ encoding: [0x08,0xbf]
785// CHECK: biceq.w  r1, r5, r1             @ encoding: [0x25,0xea,0x01,0x01]
786// CHECK: it eq                           @ encoding: [0x08,0xbf]
787// CHECK: biceq.w  r4, r4, r1             @ encoding: [0x24,0xea,0x01,0x04]
788// CHECK: it eq                           @ encoding: [0x08,0xbf]
789// CHECK: biceq.w  r2, r1, r2             @ encoding: [0x21,0xea,0x02,0x02]
790// CHECK: it eq                           @ encoding: [0x08,0xbf]
791// CHECK: bicseq.w r5, r1, r5             @ encoding: [0x31,0xea,0x05,0x05]
792// CHECK: it eq                           @ encoding: [0x08,0xbf]
793// CHECK: biceq    r7, r1                 @ encoding: [0x8f,0x43]
794// CHECK: it eq                           @ encoding: [0x08,0xbf]
795// CHECK: biceq.w  r8, r1, r8             @ encoding: [0x21,0xea,0x08,0x08]
796// CHECK: it eq                           @ encoding: [0x08,0xbf]
797// CHECK: biceq.w  r8, r8, r1             @ encoding: [0x28,0xea,0x01,0x08]
798// CHECK: it eq                           @ encoding: [0x08,0xbf]
799// CHECK: biceq.w  r0, r8, r0             @ encoding: [0x28,0xea,0x00,0x00]
800// CHECK: it eq                           @ encoding: [0x08,0xbf]
801// CHECK: biceq.w  r2, r2, r8             @ encoding: [0x22,0xea,0x08,0x02]
802// CHECK: it eq                           @ encoding: [0x08,0xbf]
803// CHECK: biceq.w  r4, r4, r1, lsl #1     @ encoding: [0x24,0xea,0x41,0x04]
804// CHECK: it eq                           @ encoding: [0x08,0xbf]
805// CHECK: biceq.w  r5, r1, r5, lsr #1     @ encoding: [0x21,0xea,0x55,0x05]
806
807// CMN - only two register version available
808