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