llvm/llvm/test/MC/ARM/thumb2-narrow-dp.ll

// RUN: llvm-mc -triple thumbv7 -show-encoding < %s | FileCheck %s

// Test each of the Thumb1 data-processing instructions
// The assembly syntax for these instructions allows an optional Rd register
//   OP{S}{<c>}{<q>}  {<Rd>,} <Rn>, <Rm>
// Assemblers should chose the narrow thumb encoding when possible, i.e.
//   - Rd == Rn 
//   - Rd, Rn and Rm are < r8
// In addition, some operations are commutative, allowing the transformation
// when:
//   - Rd == Rn || Rd == Rm
//   - Rd, Rn and Rm are < r8

// ADD immediate (not SP) A8.8.4
    ADDS     r0, r0, #5          // T1
// CHECK: adds  r0, r0, #5          @ encoding: [0x40,0x1d]
    ADDS     r1, r1, #8          // T2
// CHECK: adds  r1, #8              @ encoding: [0x08,0x31]
    ADDS.W   r1, r1, #8          // .w => T3
// CHECK: adds.w r1, r1, #8         @ encoding: [0x11,0xf1,0x08,0x01]
    ADDS     r8, r8, #8          // T3
// CHECK: adds.w r8, r8, #8         @ encoding: [0x18,0xf1,0x08,0x08]

    IT EQ
// CHECK: it eq                     @ encoding: [0x08,0xbf]
    ADDEQ    r0, r0, #5          // T1
// CHECK: addeq r0, r0, #5          @ encoding: [0x40,0x1d]
    IT EQ
// CHECK: it eq                     @ encoding: [0x08,0xbf]
    ADDEQ    r1, r1, #8          // T2
// CHECK: addeq r1, #8              @ encoding: [0x08,0x31]

    IT EQ
// CHECK: it eq                     @ encoding: [0x08,0xbf]
    ADDSEQ   r0, r0, #5          // T3
// CHECK: addseq.w r0, r0, #5       @ encoding: [0x10,0xf1,0x05,0x00]
    IT EQ
// CHECK: it eq                     @ encoding: [0x08,0xbf]
    ADDSEQ   r1, r1, #8          // T3
// CHECK: addseq.w r1, r1, #8       @ encoding: [0x11,0xf1,0x08,0x01]

// ADD register (not SP) A8.8.6 (commutative)
    ADDS     r0, r2, r1          // ADDS has T1 narrow 3 operand
// CHECK: adds  r0, r2, r1          @ encoding: [0x50,0x18]
    ADDS     r2, r2, r1          // ADDS has T1 narrow 3 operand
// CHECK: adds  r2, r2, r1          @ encoding: [0x52,0x18]
    ADD      r3, r1, r3          // T2
// CHECK: add  r3, r1               @ encoding: [0x0b,0x44]

    IT EQ
// CHECK: it eq                     @ encoding: [0x08,0xbf]
    ADDEQ    r0, r2, r1          // (In IT) ADD has T1 narrow 3 operand
// CHECK: addeq r0, r2, r1          @ encoding: [0x50,0x18]
    IT EQ
// CHECK: it eq                     @ encoding: [0x08,0xbf]
    ADDEQ    r2, r2, r1          // (In IT) ADD has T1 narrow 3 operand
// CHECK: addeq r2, r2, r1          @ encoding: [0x52,0x18]

    IT EQ
// CHECK: it eq                     @ encoding: [0x08,0xbf]
    ADDSEQ   r0, r2, r1          // T3
// CHECK: addseq.w r0, r2, r1       @ encoding: [0x12,0xeb,0x01,0x00]
    IT EQ
// CHECK: it eq                     @ encoding: [0x08,0xbf]
    ADDSEQ   r2, r2, r1          // T3
// CHECK: addseq.w r2, r2, r1       @ encoding: [0x12,0xeb,0x01,0x02]

    ADD      r3, r3, r1          // T2
// CHECK: add  r3, r1               @ encoding: [0x0b,0x44]
    ADD      r4, r4, pc          // T2
// CHECK: add  r4, pc               @ encoding: [0x7c,0x44]
    ADD      r4, pc, r4          // T2
// CHECK: add  r4, pc               @ encoding: [0x7c,0x44]
    ADD      pc, pc, r2          // T2
// CHECK: add  pc, r2               @ encoding: [0x97,0x44]
    ADD      pc, r2, pc          // T2
// CHECK: add  pc, r2               @ encoding: [0x97,0x44]
    ADD      pc, pc, sp          // T2
// CHECK: add   pc, sp              @ encoding: [0xef,0x44]
    ADD      pc, sp, pc          // T2
// CHECK: add   pc, sp, pc          @ encoding: [0xef,0x44]

// ADD (SP plus immediate) A8.8.9
    ADD      sp, sp, #20         // T2
// FIXME: ARMARM says 'add   sp, sp, #20'
// CHECK: add   sp, #20             @ encoding: [0x05,0xb0]
    ADD      sp, sp, #508        // T2
// CHECK: add   sp, #508            @ encoding: [0x7f,0xb0]
    ADD      sp, sp, #512        // T3
// CHECK: add.w sp, sp, #512        @ encoding: [0x0d,0xf5,0x00,0x7d]

// ADD (SP plus register) A8.8.10 (commutative)
    ADD      r9, sp, r9          // T1
// CHECK: add   r9, sp, r9          @ encoding: [0xe9,0x44]
    ADD      r9, r9, sp          // T1
// FIXME: ARMARM says 'add   r9, sp, r9'
// CHECK: add   r9, sp              @ encoding: [0xe9,0x44]
    ADD      sp, sp, r10         // T2
// CHECK: add   sp, r10             @ encoding: [0xd5,0x44]
    ADD      sp, r10, sp         // T2
// CHECK: add   sp, r10             @ encoding: [0xd5,0x44]
    ADD      sp, sp, pc          // T2
// CHECK: add   sp, pc              @ encoding: [0xfd,0x44]

// AND (commutative)
    ANDS     r0, r2, r1          // Must be wide - 3 distinct registers
    ANDS     r2, r2, r1          // Should choose narrow
    ANDS     r2, r1, r2          // Should choose narrow - commutative
    ANDS.W   r0, r0, r1          // Explicitly wide
    ANDS.W   r3, r1, r3  
    AND      r0, r1, r0          // Must use wide encoding as not flag-setting
    ANDS     r7, r7, r1          // Should use narrow
    ANDS     r7, r1, r7          // Commutative
    ANDS     r8, r1, r8          // high registers so must use wide encoding
    ANDS     r8, r8, r1
    ANDS     r0, r8, r0
    ANDS     r1, r1, r8
    ANDS     r2, r2, r1, lsl #1  // Must use wide - shifted register
    ANDS     r0, r1, r0, lsr #1
// CHECK: ands.w  r0, r2, r1              @ encoding: [0x12,0xea,0x01,0x00]
// CHECK: ands    r2, r1                  @ encoding: [0x0a,0x40]
// CHECK: ands    r2, r1                  @ encoding: [0x0a,0x40]
// CHECK: ands.w  r0, r0, r1              @ encoding: [0x10,0xea,0x01,0x00]
// CHECK: ands.w  r3, r1, r3              @ encoding: [0x11,0xea,0x03,0x03]
// CHECK: and.w   r0, r1, r0              @ encoding: [0x01,0xea,0x00,0x00]
// CHECK: ands    r7, r1                  @ encoding: [0x0f,0x40]
// CHECK: ands    r7, r1                  @ encoding: [0x0f,0x40]
// CHECK: ands.w  r8, r1, r8              @ encoding: [0x11,0xea,0x08,0x08]
// CHECK: ands.w  r8, r8, r1              @ encoding: [0x18,0xea,0x01,0x08]
// CHECK: ands.w  r0, r8, r0              @ encoding: [0x18,0xea,0x00,0x00]
// CHECK: ands.w  r1, r1, r8              @ encoding: [0x11,0xea,0x08,0x01]
// CHECK: ands.w  r2, r2, r1, lsl #1      @ encoding: [0x12,0xea,0x41,0x02]
// CHECK: ands.w  r0, r1, r0, lsr #1      @ encoding: [0x11,0xea,0x50,0x00]

    IT EQ
    ANDEQ    r0, r2, r1          // Must be wide - 3 distinct registers
    IT EQ
    ANDEQ    r3, r3, r1          // Should choose narrow
    IT EQ
    ANDEQ    r3, r1, r3          // Should choose narrow - commutative
    IT EQ
    ANDEQ.W  r0, r0, r1          // Explicitly wide
    IT EQ
    ANDEQ.W  r2, r1, r2  
    IT EQ
    ANDSEQ   r0, r1, r0          // Must use wide encoding as flag-setting
    IT EQ
    ANDEQ    r7, r7, r1          // Should use narrow
    IT EQ
    ANDEQ    r7, r1, r7          // Commutative
    IT EQ
    ANDEQ    r8, r1, r8          // high registers so must use wide encoding
    IT EQ
    ANDEQ    r8, r8, r1
    IT EQ
    ANDEQ    r4, r8, r4
    IT EQ
    ANDEQ    r4, r4, r8
    IT EQ
    ANDEQ    r0, r0, r1, lsl #1  // Must use wide - shifted register
    IT EQ
    ANDEQ    r5, r1, r5, lsr #1
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: andeq.w  r0, r2, r1             @ encoding: [0x02,0xea,0x01,0x00]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: andeq    r3, r1                 @ encoding: [0x0b,0x40]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: andeq    r3, r1                 @ encoding: [0x0b,0x40]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: andeq.w  r0, r0, r1             @ encoding: [0x00,0xea,0x01,0x00]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: andeq.w  r2, r1, r2             @ encoding: [0x01,0xea,0x02,0x02]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: andseq.w r0, r1, r0             @ encoding: [0x11,0xea,0x00,0x00]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: andeq    r7, r1                 @ encoding: [0x0f,0x40]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: andeq    r7, r1                 @ encoding: [0x0f,0x40]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: andeq.w  r8, r1, r8             @ encoding: [0x01,0xea,0x08,0x08]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: andeq.w  r8, r8, r1             @ encoding: [0x08,0xea,0x01,0x08]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: andeq.w  r4, r8, r4             @ encoding: [0x08,0xea,0x04,0x04]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: andeq.w  r4, r4, r8             @ encoding: [0x04,0xea,0x08,0x04]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: andeq.w  r0, r0, r1, lsl #1     @ encoding: [0x00,0xea,0x41,0x00]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: andeq.w  r5, r1, r5, lsr #1     @ encoding: [0x01,0xea,0x55,0x05]

// EOR (commutative)
    EORS     r0, r2, r1          // Must be wide - 3 distinct registers
    EORS     r5, r5, r1          // Should choose narrow
    EORS     r5, r1, r5          // Should choose narrow - commutative
    EORS.W   r0, r0, r1          // Explicitly wide
    EORS.W   r2, r1, r2  
    EOR      r1, r1, r1          // Must use wide encoding as not flag-setting
    EORS     r7, r7, r1          // Should use narrow
    EORS     r7, r1, r7          // Commutative
    EORS     r8, r1, r8          // high registers so must use wide encoding
    EORS     r8, r8, r1
    EORS     r6, r8, r6
    EORS     r0, r0, r8
    EORS     r2, r2, r1, lsl #1  // Must use wide - shifted register
    EORS     r0, r1, r0, lsr #1
// CHECK: eors.w  r0, r2, r1              @ encoding: [0x92,0xea,0x01,0x00]
// CHECK: eors    r5, r1                  @ encoding: [0x4d,0x40]
// CHECK: eors    r5, r1                  @ encoding: [0x4d,0x40]
// CHECK: eors.w  r0, r0, r1              @ encoding: [0x90,0xea,0x01,0x00]
// CHECK: eors.w  r2, r1, r2              @ encoding: [0x91,0xea,0x02,0x02]
// CHECK: eor.w   r1, r1, r1              @ encoding: [0x81,0xea,0x01,0x01]
// CHECK: eors    r7, r1                  @ encoding: [0x4f,0x40]
// CHECK: eors    r7, r1                  @ encoding: [0x4f,0x40]
// CHECK: eors.w  r8, r1, r8              @ encoding: [0x91,0xea,0x08,0x08]
// CHECK: eors.w  r8, r8, r1              @ encoding: [0x98,0xea,0x01,0x08]
// CHECK: eors.w  r6, r8, r6              @ encoding: [0x98,0xea,0x06,0x06]
// CHECK: eors.w  r0, r0, r8              @ encoding: [0x90,0xea,0x08,0x00]
// CHECK: eors.w  r2, r2, r1, lsl #1      @ encoding: [0x92,0xea,0x41,0x02]
// CHECK: eors.w  r0, r1, r0, lsr #1      @ encoding: [0x91,0xea,0x50,0x00]

    IT EQ
    EOREQ    r3, r2, r1          // Must be wide - 3 distinct registers
    IT EQ
    EOREQ    r0, r0, r1          // Should choose narrow
    IT EQ
    EOREQ    r2, r1, r2          // Should choose narrow - commutative
    IT EQ
    EOREQ.W  r3, r3, r1          // Explicitly wide
    IT EQ
    EOREQ.W  r0, r1, r0  
    IT EQ
    EORSEQ   r1, r1, r1          // Must use wide encoding as flag-setting
    IT EQ
    EOREQ    r7, r7, r1          // Should use narrow
    IT EQ
    EOREQ    r7, r1, r7          // Commutative
    IT EQ
    EOREQ    r8, r1, r8          // high registers so must use wide encoding
    IT EQ
    EOREQ    r8, r8, r1
    IT EQ
    EOREQ    r0, r8, r0
    IT EQ
    EOREQ    r3, r3, r8
    IT EQ
    EOREQ    r4, r4, r1, lsl #1  // Must use wide - shifted register
    IT EQ
    EOREQ    r0, r1, r0, lsr #1
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: eoreq.w  r3, r2, r1             @ encoding: [0x82,0xea,0x01,0x03]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: eoreq    r0, r1                 @ encoding: [0x48,0x40]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: eoreq    r2, r1                 @ encoding: [0x4a,0x40]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: eoreq.w  r3, r3, r1             @ encoding: [0x83,0xea,0x01,0x03]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: eoreq.w  r0, r1, r0             @ encoding: [0x81,0xea,0x00,0x00]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: eorseq.w r1, r1, r1             @ encoding: [0x91,0xea,0x01,0x01]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: eoreq    r7, r1                 @ encoding: [0x4f,0x40]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: eoreq    r7, r1                 @ encoding: [0x4f,0x40]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: eoreq.w  r8, r1, r8             @ encoding: [0x81,0xea,0x08,0x08]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: eoreq.w  r8, r8, r1             @ encoding: [0x88,0xea,0x01,0x08]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: eoreq.w  r0, r8, r0             @ encoding: [0x88,0xea,0x00,0x00]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: eoreq.w  r3, r3, r8             @ encoding: [0x83,0xea,0x08,0x03]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: eoreq.w  r4, r4, r1, lsl #1     @ encoding: [0x84,0xea,0x41,0x04]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: eoreq.w  r0, r1, r0, lsr #1     @ encoding: [0x81,0xea,0x50,0x00]

// LSL 
    LSLS     r0, r2, r1          // Must be wide - 3 distinct registers
    LSLS     r2, r2, r1          // Should choose narrow
    LSLS     r2, r1, r2          // Should choose wide - not commutative
    LSLS.W   r0, r0, r1          // Explicitly wide
    LSLS.W   r4, r1, r4  
    LSL      r4, r1, r4          // Must use wide encoding as not flag-setting
    LSLS     r7, r7, r1          // Should use narrow
    LSLS     r8, r1, r8          // high registers so must use wide encoding
    LSLS     r8, r8, r1
    LSLS     r3, r8, r3
    LSLS     r5, r5, r8
// CHECK: lsls.w  r0, r2, r1              @ encoding: [0x12,0xfa,0x01,0xf0]
// CHECK: lsls    r2, r1                  @ encoding: [0x8a,0x40]
// CHECK: lsls.w  r2, r1, r2              @ encoding: [0x11,0xfa,0x02,0xf2]
// CHECK: lsls.w  r0, r0, r1              @ encoding: [0x10,0xfa,0x01,0xf0]
// CHECK: lsls.w  r4, r1, r4              @ encoding: [0x11,0xfa,0x04,0xf4]
// CHECK: lsl.w   r4, r1, r4              @ encoding: [0x01,0xfa,0x04,0xf4]
// CHECK: lsls    r7, r1                  @ encoding: [0x8f,0x40]
// CHECK: lsls.w  r8, r1, r8              @ encoding: [0x11,0xfa,0x08,0xf8]
// CHECK: lsls.w  r8, r8, r1              @ encoding: [0x18,0xfa,0x01,0xf8]
// CHECK: lsls.w  r3, r8, r3              @ encoding: [0x18,0xfa,0x03,0xf3]
// CHECK: lsls.w  r5, r5, r8              @ encoding: [0x15,0xfa,0x08,0xf5]

    IT EQ
    LSLEQ    r0, r2, r1          // Must be wide - 3 distinct registers
    IT EQ
    LSLEQ    r2, r2, r1          // Should choose narrow
    IT EQ
    LSLEQ    r2, r1, r2          // Should choose wide - not commutative
    IT EQ
    LSLEQ.W  r0, r0, r1          // Explicitly wide
    IT EQ
    LSLEQ.W  r3, r1, r3  
    IT EQ
    LSLSEQ   r4, r1, r4          // Must use wide encoding as flag-setting
    IT EQ
    LSLEQ    r7, r7, r1          // Should use narrow
    IT EQ
    LSLEQ    r8, r1, r8          // high registers so must use wide encoding
    IT EQ
    LSLEQ    r8, r8, r1
    IT EQ
    LSLEQ    r0, r8, r0
    IT EQ
    LSLEQ    r3, r3, r8
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: lsleq.w  r0, r2, r1             @ encoding: [0x02,0xfa,0x01,0xf0]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: lsleq    r2, r1                 @ encoding: [0x8a,0x40]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: lsleq.w  r2, r1, r2             @ encoding: [0x01,0xfa,0x02,0xf2]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: lsleq.w  r0, r0, r1             @ encoding: [0x00,0xfa,0x01,0xf0]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: lsleq.w  r3, r1, r3             @ encoding: [0x01,0xfa,0x03,0xf3]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: lslseq.w r4, r1, r4             @ encoding: [0x11,0xfa,0x04,0xf4]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: lsleq    r7, r1                 @ encoding: [0x8f,0x40]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: lsleq.w  r8, r1, r8             @ encoding: [0x01,0xfa,0x08,0xf8]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: lsleq.w  r8, r8, r1             @ encoding: [0x08,0xfa,0x01,0xf8]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: lsleq.w  r0, r8, r0             @ encoding: [0x08,0xfa,0x00,0xf0]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: lsleq.w  r3, r3, r8             @ encoding: [0x03,0xfa,0x08,0xf3]

// LSR 
    LSRS     r6, r2, r1          // Must be wide - 3 distinct registers
    LSRS     r2, r2, r1          // Should choose narrow
    LSRS     r2, r1, r2          // Should choose wide - not commutative
    LSRS.W   r2, r2, r1          // Explicitly wide
    LSRS.W   r3, r1, r3  
    LSR      r4, r1, r4          // Must use wide encoding as not flag-setting
    LSRS     r7, r7, r1          // Should use narrow
    LSRS     r8, r1, r8          // high registers so must use wide encoding
    LSRS     r8, r8, r1
    LSRS     r2, r8, r2
    LSRS     r5, r5, r8
// CHECK: lsrs.w  r6, r2, r1              @ encoding: [0x32,0xfa,0x01,0xf6]
// CHECK: lsrs    r2, r1                  @ encoding: [0xca,0x40]
// CHECK: lsrs.w  r2, r1, r2              @ encoding: [0x31,0xfa,0x02,0xf2]
// CHECK: lsrs.w  r2, r2, r1              @ encoding: [0x32,0xfa,0x01,0xf2]
// CHECK: lsrs.w  r3, r1, r3              @ encoding: [0x31,0xfa,0x03,0xf3]
// CHECK: lsr.w   r4, r1, r4              @ encoding: [0x21,0xfa,0x04,0xf4]
// CHECK: lsrs    r7, r1                  @ encoding: [0xcf,0x40]
// CHECK: lsrs.w  r8, r1, r8              @ encoding: [0x31,0xfa,0x08,0xf8]
// CHECK: lsrs.w  r8, r8, r1              @ encoding: [0x38,0xfa,0x01,0xf8]
// CHECK: lsrs.w  r2, r8, r2              @ encoding: [0x38,0xfa,0x02,0xf2]
// CHECK: lsrs.w  r5, r5, r8              @ encoding: [0x35,0xfa,0x08,0xf5]

    IT EQ
    LSREQ    r6, r2, r1          // Must be wide - 3 distinct registers
    IT EQ
    LSREQ    r7, r7, r1          // Should choose narrow
    IT EQ
    LSREQ    r7, r1, r7          // Should choose wide - not commutative
    IT EQ
    LSREQ.W  r7, r7, r1          // Explicitly wide
    IT EQ
    LSREQ.W  r2, r1, r2  
    IT EQ
    LSRSEQ   r0, r1, r0          // Must use wide encoding as flag-setting
    IT EQ
    LSREQ    r7, r7, r1          // Should use narrow
    IT EQ
    LSREQ    r8, r1, r8          // high registers so must use wide encoding
    IT EQ
    LSREQ    r8, r8, r1
    IT EQ
    LSREQ    r1, r8, r1
    IT EQ
    LSREQ    r4, r4, r8
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: lsreq.w  r6, r2, r1             @ encoding: [0x22,0xfa,0x01,0xf6]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: lsreq    r7, r1                 @ encoding: [0xcf,0x40]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: lsreq.w  r7, r1, r7             @ encoding: [0x21,0xfa,0x07,0xf7]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: lsreq.w  r7, r7, r1             @ encoding: [0x27,0xfa,0x01,0xf7]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: lsreq.w  r2, r1, r2             @ encoding: [0x21,0xfa,0x02,0xf2]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: lsrseq.w r0, r1, r0             @ encoding: [0x31,0xfa,0x00,0xf0]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: lsreq    r7, r1                 @ encoding: [0xcf,0x40]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: lsreq.w  r8, r1, r8             @ encoding: [0x21,0xfa,0x08,0xf8]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: lsreq.w  r8, r8, r1             @ encoding: [0x28,0xfa,0x01,0xf8]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: lsreq.w  r1, r8, r1             @ encoding: [0x28,0xfa,0x01,0xf1]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: lsreq.w  r4, r4, r8             @ encoding: [0x24,0xfa,0x08,0xf4]

// ASR 
    ASRS     r7, r6, r5          // Must be wide - 3 distinct registers
    ASRS     r0, r0, r1          // Should choose narrow
    ASRS     r0, r1, r0          // Should choose wide - not commutative
    ASRS.W   r3, r3, r1          // Explicitly wide
    ASRS.W   r1, r1, r1  
    ASR      r0, r1, r0          // Must use wide encoding as not flag-setting
    ASRS     r7, r7, r1          // Should use narrow
    ASRS     r8, r1, r8          // high registers so must use wide encoding
    ASRS     r8, r8, r1
    ASRS     r5, r8, r5
    ASRS     r5, r5, r8
// CHECK: asrs.w  r7, r6, r5              @ encoding: [0x56,0xfa,0x05,0xf7]
// CHECK: asrs    r0, r1                  @ encoding: [0x08,0x41]
// CHECK: asrs.w  r0, r1, r0              @ encoding: [0x51,0xfa,0x00,0xf0]
// CHECK: asrs.w  r3, r3, r1              @ encoding: [0x53,0xfa,0x01,0xf3]
// CHECK: asrs.w  r1, r1, r1              @ encoding: [0x51,0xfa,0x01,0xf1]
// CHECK: asr.w   r0, r1, r0              @ encoding: [0x41,0xfa,0x00,0xf0]
// CHECK: asrs    r7, r1                  @ encoding: [0x0f,0x41]
// CHECK: asrs.w  r8, r1, r8              @ encoding: [0x51,0xfa,0x08,0xf8]
// CHECK: asrs.w  r8, r8, r1              @ encoding: [0x58,0xfa,0x01,0xf8]
// CHECK: asrs.w  r5, r8, r5              @ encoding: [0x58,0xfa,0x05,0xf5]
// CHECK: asrs.w  r5, r5, r8              @ encoding: [0x55,0xfa,0x08,0xf5]

    IT EQ
    ASREQ    r0, r2, r1          // Must be wide - 3 distinct registers
    IT EQ
    ASREQ    r2, r2, r1          // Should choose narrow
    IT EQ
    ASREQ    r1, r2, r1          // Should choose wide - not commutative
    IT EQ
    ASREQ.W  r4, r4, r1          // Explicitly wide
    IT EQ
    ASREQ.W  r6, r1, r6  
    IT EQ
    ASRSEQ   r3, r1, r3          // Must use wide encoding as flag-setting
    IT EQ
    ASREQ    r7, r7, r1          // Should use narrow
    IT EQ
    ASREQ    r8, r1, r8          // high registers so must use wide encoding
    IT EQ
    ASREQ    r8, r8, r1
    IT EQ
    ASREQ    r1, r8, r1
    IT EQ
    ASREQ    r3, r3, r8
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: asreq.w  r0, r2, r1             @ encoding: [0x42,0xfa,0x01,0xf0]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: asreq    r2, r1                 @ encoding: [0x0a,0x41]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: asreq.w  r1, r2, r1             @ encoding: [0x42,0xfa,0x01,0xf1]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: asreq.w  r4, r4, r1             @ encoding: [0x44,0xfa,0x01,0xf4]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: asreq.w  r6, r1, r6             @ encoding: [0x41,0xfa,0x06,0xf6]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: asrseq.w r3, r1, r3             @ encoding: [0x51,0xfa,0x03,0xf3]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: asreq    r7, r1                 @ encoding: [0x0f,0x41]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: asreq.w  r8, r1, r8             @ encoding: [0x41,0xfa,0x08,0xf8]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: asreq.w  r8, r8, r1             @ encoding: [0x48,0xfa,0x01,0xf8]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: asreq.w  r1, r8, r1             @ encoding: [0x48,0xfa,0x01,0xf1]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: asreq.w  r3, r3, r8             @ encoding: [0x43,0xfa,0x08,0xf3]

// ADC (commutative)
    ADCS     r5, r2, r1          // Must be wide - 3 distinct registers
    ADCS     r5, r5, r1          // Should choose narrow  
    ADCS     r3, r1, r3          // Should choose narrow - commutative
    ADCS.W   r2, r2, r1          // Explicitly wide
    ADCS.W   r3, r1, r3  
    ADC      r0, r1, r0          // Must use wide encoding as not flag-setting
    ADCS     r7, r7, r1          // Should use narrow
    ADCS     r7, r1, r7          // Commutative
    ADCS     r8, r1, r8          // high registers so must use wide encoding
    ADCS     r8, r8, r1
    ADCS     r5, r8, r5
    ADCS     r2, r2, r8
    ADCS     r3, r3, r1, lsl #1  // Must use wide - shifted register
    ADCS     r4, r1, r4, lsr #1
// CHECK: adcs.w  r5, r2, r1              @ encoding: [0x52,0xeb,0x01,0x05]
// CHECK: adcs    r5, r1                  @ encoding: [0x4d,0x41]
// CHECK: adcs    r3, r1                  @ encoding: [0x4b,0x41]
// CHECK: adcs.w  r2, r2, r1              @ encoding: [0x52,0xeb,0x01,0x02]
// CHECK: adcs.w  r3, r1, r3              @ encoding: [0x51,0xeb,0x03,0x03]
// CHECK: adc.w   r0, r1, r0              @ encoding: [0x41,0xeb,0x00,0x00]
// CHECK: adcs    r7, r1                  @ encoding: [0x4f,0x41]
// CHECK: adcs    r7, r1                  @ encoding: [0x4f,0x41]
// CHECK: adcs.w  r8, r1, r8              @ encoding: [0x51,0xeb,0x08,0x08]
// CHECK: adcs.w  r8, r8, r1              @ encoding: [0x58,0xeb,0x01,0x08]
// CHECK: adcs.w  r5, r8, r5              @ encoding: [0x58,0xeb,0x05,0x05]
// CHECK: adcs.w  r2, r2, r8              @ encoding: [0x52,0xeb,0x08,0x02]
// CHECK: adcs.w  r3, r3, r1, lsl #1      @ encoding: [0x53,0xeb,0x41,0x03]
// CHECK: adcs.w  r4, r1, r4, lsr #1      @ encoding: [0x51,0xeb,0x54,0x04]

    IT EQ
    ADCEQ    r1, r2, r3          // Must be wide - 3 distinct registers
    IT EQ
    ADCEQ    r1, r1, r1          // Should choose narrow
    IT EQ
    ADCEQ    r3, r1, r3          // Should choose narrow - commutative
    IT EQ
    ADCEQ.W  r3, r3, r1          // Explicitly wide
    IT EQ
    ADCEQ.W  r0, r1, r0  
    IT EQ
    ADCSEQ   r3, r1, r3          // Must use wide encoding as flag-setting
    IT EQ
    ADCEQ    r7, r7, r1          // Should use narrow 
    IT EQ
    ADCEQ    r7, r1, r7          // Commutative
    IT EQ
    ADCEQ    r8, r1, r8          // high registers so must use wide encoding
    IT EQ
    ADCEQ    r8, r8, r1
    IT EQ
    ADCEQ    r3, r8, r3
    IT EQ
    ADCEQ    r1, r1, r8
    IT EQ
    ADCEQ    r2, r2, r1, lsl #1  // Must use wide - shifted register
    IT EQ
    ADCEQ    r1, r1, r1, lsr #1
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: adceq.w  r1, r2, r3             @ encoding: [0x42,0xeb,0x03,0x01]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: adceq    r1, r1                 @ encoding: [0x49,0x41]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: adceq    r3, r1                 @ encoding: [0x4b,0x41]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: adceq.w  r3, r3, r1             @ encoding: [0x43,0xeb,0x01,0x03]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: adceq.w  r0, r1, r0             @ encoding: [0x41,0xeb,0x00,0x00]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: adcseq.w r3, r1, r3             @ encoding: [0x51,0xeb,0x03,0x03]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: adceq    r7, r1                 @ encoding: [0x4f,0x41]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: adceq    r7, r1                 @ encoding: [0x4f,0x41]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: adceq.w  r8, r1, r8             @ encoding: [0x41,0xeb,0x08,0x08]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: adceq.w  r8, r8, r1             @ encoding: [0x48,0xeb,0x01,0x08]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: adceq.w  r3, r8, r3             @ encoding: [0x48,0xeb,0x03,0x03]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: adceq.w  r1, r1, r8             @ encoding: [0x41,0xeb,0x08,0x01]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: adceq.w  r2, r2, r1, lsl #1     @ encoding: [0x42,0xeb,0x41,0x02]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: adceq.w  r1, r1, r1, lsr #1     @ encoding: [0x41,0xeb,0x51,0x01]

// SBC 
    SBCS     r3, r2, r1          // Must be wide - 3 distinct registers
    SBCS     r4, r4, r1          // Should choose narrow  
    SBCS     r1, r4, r1          // Should choose wide - not commutative  
    SBCS.W   r4, r4, r1          // Explicitly wide
    SBCS.W   r2, r1, r2  
    SBC      r0, r1, r0          // Must use wide encoding as not flag-setting
    SBCS     r7, r7, r1          // Should use narrow
    SBCS     r8, r1, r8          // high registers so must use wide encoding
    SBCS     r8, r8, r1
    SBCS     r4, r8, r4
    SBCS     r3, r3, r8
    SBCS     r2, r2, r1, lsl #1  // Must use wide - shifted register
    SBCS     r5, r1, r5, lsr #1
// CHECK: sbcs.w  r3, r2, r1              @ encoding: [0x72,0xeb,0x01,0x03]
// CHECK: sbcs    r4, r1                  @ encoding: [0x8c,0x41]
// CHECK: sbcs.w  r1, r4, r1              @ encoding: [0x74,0xeb,0x01,0x01]
// CHECK: sbcs.w  r4, r4, r1              @ encoding: [0x74,0xeb,0x01,0x04]
// CHECK: sbcs.w  r2, r1, r2              @ encoding: [0x71,0xeb,0x02,0x02]
// CHECK: sbc.w   r0, r1, r0              @ encoding: [0x61,0xeb,0x00,0x00]
// CHECK: sbcs    r7, r1                  @ encoding: [0x8f,0x41]
// CHECK: sbcs.w  r8, r1, r8              @ encoding: [0x71,0xeb,0x08,0x08]
// CHECK: sbcs.w  r8, r8, r1              @ encoding: [0x78,0xeb,0x01,0x08]
// CHECK: sbcs.w  r4, r8, r4              @ encoding: [0x78,0xeb,0x04,0x04]
// CHECK: sbcs.w  r3, r3, r8              @ encoding: [0x73,0xeb,0x08,0x03]
// CHECK: sbcs.w  r2, r2, r1, lsl #1      @ encoding: [0x72,0xeb,0x41,0x02]
// CHECK: sbcs.w  r5, r1, r5, lsr #1      @ encoding: [0x71,0xeb,0x55,0x05]

    IT EQ
    SBCEQ    r5, r2, r1          // Must be wide - 3 distinct registers
    IT EQ
    SBCEQ    r5, r5, r1          // Should choose narrow
    IT EQ
    SBCEQ    r1, r5, r1          // Should choose narrow
    IT EQ
    SBCEQ.W  r5, r5, r1          // Explicitly wide
    IT EQ
    SBCEQ.W  r0, r1, r0  
    IT EQ
    SBCSEQ   r2, r1, r2          // Must use wide encoding as flag-setting
    IT EQ
    SBCEQ    r7, r7, r1          // Should use narrow 
    IT EQ
    SBCEQ    r8, r1, r8          // high registers so must use wide encoding
    IT EQ
    SBCEQ    r8, r8, r1
    IT EQ
    SBCEQ    r7, r8, r7
    IT EQ
    SBCEQ    r7, r7, r8
    IT EQ
    SBCEQ    r2, r2, r1, lsl #1  // Must use wide - shifted register
    IT EQ
    SBCEQ    r5, r1, r5, lsr #1
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: sbceq.w  r5, r2, r1             @ encoding: [0x62,0xeb,0x01,0x05]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: sbceq    r5, r1                 @ encoding: [0x8d,0x41]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: sbceq.w  r1, r5, r1             @ encoding: [0x65,0xeb,0x01,0x01]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: sbceq.w  r5, r5, r1             @ encoding: [0x65,0xeb,0x01,0x05]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: sbceq.w  r0, r1, r0             @ encoding: [0x61,0xeb,0x00,0x00]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: sbcseq.w r2, r1, r2             @ encoding: [0x71,0xeb,0x02,0x02]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: sbceq    r7, r1                 @ encoding: [0x8f,0x41]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: sbceq.w  r8, r1, r8             @ encoding: [0x61,0xeb,0x08,0x08]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: sbceq.w  r8, r8, r1             @ encoding: [0x68,0xeb,0x01,0x08]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: sbceq.w  r7, r8, r7             @ encoding: [0x68,0xeb,0x07,0x07]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: sbceq.w  r7, r7, r8             @ encoding: [0x67,0xeb,0x08,0x07]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: sbceq.w  r2, r2, r1, lsl #1     @ encoding: [0x62,0xeb,0x41,0x02]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: sbceq.w  r5, r1, r5, lsr #1     @ encoding: [0x61,0xeb,0x55,0x05]

// ROR 
    RORS     r3, r2, r1          // Must be wide - 3 distinct registers
    RORS     r0, r0, r1          // Should choose narrow
    RORS     r1, r0, r1          // Should choose wide - not commutative
    RORS.W   r2, r2, r1          // Explicitly wide
    RORS.W   r2, r1, r2  
    ROR      r5, r1, r5          // Must use wide encoding as not flag-setting
    RORS     r7, r7, r1          // Should use narrow
    RORS     r8, r1, r8          // high registers so must use wide encoding
    RORS     r8, r8, r1
    RORS     r6, r8, r6
    RORS     r6, r6, r8
// CHECK: rors.w  r3, r2, r1              @ encoding: [0x72,0xfa,0x01,0xf3]
// CHECK: rors    r0, r1                  @ encoding: [0xc8,0x41]
// CHECK: rors.w  r1, r0, r1              @ encoding: [0x70,0xfa,0x01,0xf1]
// CHECK: rors.w  r2, r2, r1              @ encoding: [0x72,0xfa,0x01,0xf2]
// CHECK: rors.w  r2, r1, r2              @ encoding: [0x71,0xfa,0x02,0xf2]
// CHECK: ror.w   r5, r1, r5              @ encoding: [0x61,0xfa,0x05,0xf5]
// CHECK: rors    r7, r1                  @ encoding: [0xcf,0x41]
// CHECK: rors.w  r8, r1, r8              @ encoding: [0x71,0xfa,0x08,0xf8]
// CHECK: rors.w  r8, r8, r1              @ encoding: [0x78,0xfa,0x01,0xf8]
// CHECK: rors.w  r6, r8, r6              @ encoding: [0x78,0xfa,0x06,0xf6]
// CHECK: rors.w  r6, r6, r8              @ encoding: [0x76,0xfa,0x08,0xf6]

    IT EQ
    ROREQ    r4, r2, r1          // Must be wide - 3 distinct registers
    IT EQ
    ROREQ    r4, r4, r1          // Should choose narrow
    IT EQ
    ROREQ    r1, r4, r1          // Should choose wide - not commutative
    IT EQ
    ROREQ.W  r4, r4, r1          // Explicitly wide
    IT EQ
    ROREQ.W  r0, r1, r0  
    IT EQ
    RORSEQ   r0, r1, r0          // Must use wide encoding as flag-setting
    IT EQ
    ROREQ    r7, r7, r1          // Should use narrow
    IT EQ
    ROREQ    r8, r1, r8          // high registers so must use wide encoding
    IT EQ
    ROREQ    r8, r8, r1
    IT EQ
    ROREQ    r3, r8, r3
    IT EQ
    ROREQ    r1, r1, r8
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: roreq.w  r4, r2, r1             @ encoding: [0x62,0xfa,0x01,0xf4]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: roreq    r4, r1                 @ encoding: [0xcc,0x41]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: roreq.w  r1, r4, r1             @ encoding: [0x64,0xfa,0x01,0xf1]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: roreq.w  r4, r4, r1             @ encoding: [0x64,0xfa,0x01,0xf4]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: roreq.w  r0, r1, r0             @ encoding: [0x61,0xfa,0x00,0xf0]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: rorseq.w r0, r1, r0             @ encoding: [0x71,0xfa,0x00,0xf0]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: roreq    r7, r1                 @ encoding: [0xcf,0x41]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: roreq.w  r8, r1, r8             @ encoding: [0x61,0xfa,0x08,0xf8]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: roreq.w  r8, r8, r1             @ encoding: [0x68,0xfa,0x01,0xf8]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: roreq.w  r3, r8, r3             @ encoding: [0x68,0xfa,0x03,0xf3]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: roreq.w  r1, r1, r8             @ encoding: [0x61,0xfa,0x08,0xf1]

// TST - only two register version available
// RSB - only two register version available
// CMP - only two register version available
// CMN - only two register version available

// ORR (commutative)
    ORRS     r7, r2, r1          // Must be wide - 3 distinct registers
    ORRS     r2, r2, r1          // Should choose narrow
    ORRS     r3, r1, r3          // Should choose narrow - commutative
    ORRS.W   r4, r4, r1          // Explicitly wide
    ORRS.W   r5, r1, r5  
    ORR      r2, r1, r2          // Must use wide encoding as not flag-setting
    ORRS     r7, r7, r1          // Should use narrow
    ORRS     r7, r1, r7          // Commutative
    ORRS     r8, r1, r8          // high registers so must use wide encoding
    ORRS     r8, r8, r1
    ORRS     r1, r8, r1
    ORRS     r0, r0, r8
    ORRS     r1, r1, r1, lsl #1  // Must use wide - shifted register
    ORRS     r0, r1, r0, lsr #1
// CHECK: orrs.w  r7, r2, r1              @ encoding: [0x52,0xea,0x01,0x07]
// CHECK: orrs    r2, r1                  @ encoding: [0x0a,0x43]
// CHECK: orrs    r3, r1                  @ encoding: [0x0b,0x43]
// CHECK: orrs.w  r4, r4, r1              @ encoding: [0x54,0xea,0x01,0x04]
// CHECK: orrs.w  r5, r1, r5              @ encoding: [0x51,0xea,0x05,0x05]
// CHECK: orr.w   r2, r1, r2              @ encoding: [0x41,0xea,0x02,0x02]
// CHECK: orrs    r7, r1                  @ encoding: [0x0f,0x43]
// CHECK: orrs    r7, r1                  @ encoding: [0x0f,0x43]
// CHECK: orrs.w  r8, r1, r8              @ encoding: [0x51,0xea,0x08,0x08]
// CHECK: orrs.w  r8, r8, r1              @ encoding: [0x58,0xea,0x01,0x08]
// CHECK: orrs.w  r1, r8, r1              @ encoding: [0x58,0xea,0x01,0x01]
// CHECK: orrs.w  r0, r0, r8              @ encoding: [0x50,0xea,0x08,0x00]
// CHECK: orrs.w  r1, r1, r1, lsl #1      @ encoding: [0x51,0xea,0x41,0x01]
// CHECK: orrs.w  r0, r1, r0, lsr #1      @ encoding: [0x51,0xea,0x50,0x00]

    IT EQ
    ORREQ    r0, r2, r1          // Must be wide - 3 distinct registers
    IT EQ
    ORREQ    r5, r5, r1          // Should choose narrow
    IT EQ
    ORREQ    r5, r1, r5          // Should choose narrow - commutative
    IT EQ
    ORREQ.W  r2, r2, r1          // Explicitly wide
    IT EQ
    ORREQ.W  r3, r1, r3  
    IT EQ
    ORRSEQ   r4, r1, r4          // Must use wide encoding as flag-setting
    IT EQ
    ORREQ    r7, r7, r1          // Should use narrow
    IT EQ
    ORREQ    r7, r1, r7          // Commutative
    IT EQ
    ORREQ    r8, r1, r8          // high registers so must use wide encoding
    IT EQ
    ORREQ    r8, r8, r1
    IT EQ
    ORREQ    r0, r8, r0
    IT EQ
    ORREQ    r0, r0, r8
    IT EQ
    ORREQ    r2, r2, r1, lsl #1  // Must use wide - shifted register
    IT EQ
    ORREQ    r2, r1, r2, lsr #1
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: orreq.w  r0, r2, r1             @ encoding: [0x42,0xea,0x01,0x00]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: orreq    r5, r1                 @ encoding: [0x0d,0x43]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: orreq    r5, r1                 @ encoding: [0x0d,0x43]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: orreq.w  r2, r2, r1             @ encoding: [0x42,0xea,0x01,0x02]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: orreq.w  r3, r1, r3             @ encoding: [0x41,0xea,0x03,0x03]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: orrseq.w r4, r1, r4             @ encoding: [0x51,0xea,0x04,0x04]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: orreq    r7, r1                 @ encoding: [0x0f,0x43]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: orreq    r7, r1                 @ encoding: [0x0f,0x43]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: orreq.w  r8, r1, r8             @ encoding: [0x41,0xea,0x08,0x08]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: orreq.w  r8, r8, r1             @ encoding: [0x48,0xea,0x01,0x08]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: orreq.w  r0, r8, r0             @ encoding: [0x48,0xea,0x00,0x00]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: orreq.w  r0, r0, r8             @ encoding: [0x40,0xea,0x08,0x00]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: orreq.w  r2, r2, r1, lsl #1     @ encoding: [0x42,0xea,0x41,0x02]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: orreq.w  r2, r1, r2, lsr #1     @ encoding: [0x41,0xea,0x52,0x02]

// MUL - not affected by this change

// BIC 
    BICS     r3, r2, r1          // Must be wide - 3 distinct registers
    BICS     r2, r2, r1          // Should choose narrow  
    BICS     r1, r2, r1          // Should choose wide - not commutative  
    BICS.W   r2, r2, r1          // Explicitly wide
    BICS.W   r0, r1, r0  
    BIC      r0, r1, r0          // Must use wide encoding as not flag-setting
    BICS     r7, r7, r1          // Should use narrow
    BICS     r8, r1, r8          // high registers so must use wide encoding
    BICS     r8, r8, r1
    BICS     r7, r8, r7
    BICS     r5, r5, r8
    BICS     r3, r3, r1, lsl #1  // Must use wide - shifted register
    BICS     r4, r1, r4, lsr #1
// CHECK: bics.w  r3, r2, r1              @ encoding: [0x32,0xea,0x01,0x03]
// CHECK: bics    r2, r1                  @ encoding: [0x8a,0x43]
// CHECK: bics.w  r1, r2, r1              @ encoding: [0x32,0xea,0x01,0x01]
// CHECK: bics.w  r2, r2, r1              @ encoding: [0x32,0xea,0x01,0x02]
// CHECK: bics.w  r0, r1, r0              @ encoding: [0x31,0xea,0x00,0x00]
// CHECK: bic.w   r0, r1, r0              @ encoding: [0x21,0xea,0x00,0x00]
// CHECK: bics    r7, r1                  @ encoding: [0x8f,0x43]
// CHECK: bics.w  r8, r1, r8              @ encoding: [0x31,0xea,0x08,0x08]
// CHECK: bics.w  r8, r8, r1              @ encoding: [0x38,0xea,0x01,0x08]
// CHECK: bics.w  r7, r8, r7              @ encoding: [0x38,0xea,0x07,0x07]
// CHECK: bics.w  r5, r5, r8              @ encoding: [0x35,0xea,0x08,0x05]
// CHECK: bics.w  r3, r3, r1, lsl #1      @ encoding: [0x33,0xea,0x41,0x03]
// CHECK: bics.w  r4, r1, r4, lsr #1      @ encoding: [0x31,0xea,0x54,0x04]

    IT EQ
    BICEQ    r0, r2, r1          // Must be wide - 3 distinct registers
    IT EQ
    BICEQ    r5, r5, r1          // Should choose narrow
    IT EQ
    BICEQ    r1, r5, r1          // Should choose wide - not commutative
    IT EQ
    BICEQ.W  r4, r4, r1          // Explicitly wide
    IT EQ
    BICEQ.W  r2, r1, r2  
    IT EQ
    BICSEQ   r5, r1, r5          // Must use wide encoding as flag-setting
    IT EQ
    BICEQ    r7, r7, r1          // Should use narrow 
    IT EQ
    BICEQ    r8, r1, r8          // high registers so must use wide encoding
    IT EQ
    BICEQ    r8, r8, r1
    IT EQ
    BICEQ    r0, r8, r0
    IT EQ
    BICEQ    r2, r2, r8
    IT EQ
    BICEQ    r4, r4, r1, lsl #1  // Must use wide - shifted register
    IT EQ
    BICEQ    r5, r1, r5, lsr #1
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: biceq.w  r0, r2, r1             @ encoding: [0x22,0xea,0x01,0x00]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: biceq    r5, r1                 @ encoding: [0x8d,0x43]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: biceq.w  r1, r5, r1             @ encoding: [0x25,0xea,0x01,0x01]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: biceq.w  r4, r4, r1             @ encoding: [0x24,0xea,0x01,0x04]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: biceq.w  r2, r1, r2             @ encoding: [0x21,0xea,0x02,0x02]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: bicseq.w r5, r1, r5             @ encoding: [0x31,0xea,0x05,0x05]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: biceq    r7, r1                 @ encoding: [0x8f,0x43]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: biceq.w  r8, r1, r8             @ encoding: [0x21,0xea,0x08,0x08]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: biceq.w  r8, r8, r1             @ encoding: [0x28,0xea,0x01,0x08]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: biceq.w  r0, r8, r0             @ encoding: [0x28,0xea,0x00,0x00]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: biceq.w  r2, r2, r8             @ encoding: [0x22,0xea,0x08,0x02]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: biceq.w  r4, r4, r1, lsl #1     @ encoding: [0x24,0xea,0x41,0x04]
// CHECK: it eq                           @ encoding: [0x08,0xbf]
// CHECK: biceq.w  r5, r1, r5, lsr #1     @ encoding: [0x21,0xea,0x55,0x05]

// CMN - only two register version available