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