Home | History | Annotate | Download | only in ARM
      1 // RUN: not llvm-mc -triple=thumbv8m.base -show-encoding < %s 2>%t \
      2 // RUN:   | FileCheck --check-prefix=CHECK-BASELINE --check-prefix=CHECK %s
      3 // RUN:     FileCheck --check-prefix=UNDEF-BASELINE --check-prefix=UNDEF < %t %s
      4 // RUN: not llvm-mc -triple=thumbv8m.main -show-encoding < %s 2>%t \
      5 // RUN:   | FileCheck --check-prefix=CHECK-MAINLINE --check-prefix=CHECK %s
      6 // RUN:     FileCheck --check-prefix=UNDEF-MAINLINE --check-prefix=UNDEF < %t %s
      7 // RUN: not llvm-mc -triple=thumbv8m.main -mattr=+dsp,+t2xtpk -show-encoding < %s 2>%t \
      8 // RUN:   | FileCheck --check-prefix=CHECK-MAINLINE_DSP --check-prefix=CHECK %s
      9 // RUN:     FileCheck --check-prefix=UNDEF-MAINLINE_DSP --check-prefix=UNDEF < %t %s
     10 
     11 // Simple check that baseline is v6M and mainline is v7M
     12 // UNDEF-BASELINE: error: instruction requires: thumb2
     13 // UNDEF-MAINLINE-NOT: error: instruction requires:
     14 // UNDEF-MAINLINE_DSP-NOT: error: instruction requires:
     15 mov.w r0, r0
     16 
     17 // Check that .arm is invalid
     18 // UNDEF: target does not support ARM mode
     19 .arm
     20 
     21 // And only +dsp,+t2xtpk has DSP and t2xtpk instructions
     22 // UNDEF-BASELINE: error: instruction requires: arm-mode
     23 // UNDEF-MAINLINE: error: instruction requires: arm-mode
     24 // UNDEF-MAINLINE_DSP-NOT: error: instruction requires:
     25 qadd16 r0, r0, r0
     26 // UNDEF-BASELINE: error: instruction requires: arm-mode
     27 // UNDEF-MAINLINE: error: instruction requires: arm-mode
     28 // UNDEF-MAINLINE_DSP-NOT: error: instruction requires:
     29 uxtab16 r0, r1, r2
     30 
     31 // Instruction availibility checks
     32 
     33 // 'Barrier instructions'
     34 
     35 // CHECK: isb	sy              @ encoding: [0xbf,0xf3,0x6f,0x8f]
     36 isb sy
     37 
     38 // 'Code optimization'
     39 
     40 // CHECK: cbz r3, .Ltmp0      @ encoding: [0x03'A',0xb1'A']
     41 // CHECK-NEXT:                @   fixup A - offset: 0, value: .Ltmp0, kind: fixup_arm_thumb_cb
     42 cbz r3, 1f
     43 
     44 // CHECK: cbnz r3, .Ltmp0     @ encoding: [0x03'A',0xb9'A']
     45 // CHECK-NEXT:                @   fixup A - offset: 0, value: .Ltmp0, kind: fixup_arm_thumb_cb
     46 cbnz r3, 1f
     47 
     48 // CHECK: b.w .Ltmp0          @ encoding: [A,0xf0'A',A,0x90'A']
     49 // CHECK-NEXT:                @   fixup A - offset: 0, value: .Ltmp0, kind: fixup_t2_uncondbranch
     50 b.w 1f
     51 
     52 // CHECK: sdiv r1, r2, r3     @ encoding: [0x92,0xfb,0xf3,0xf1]
     53 sdiv r1, r2, r3
     54 
     55 // CHECK: udiv r1, r2, r3     @ encoding: [0xb2,0xfb,0xf3,0xf1]
     56 udiv r1, r2, r3
     57 
     58 // 'Exclusives from ARMv7-M'
     59 
     60 // CHECK: clrex               @ encoding: [0xbf,0xf3,0x2f,0x8f]
     61 clrex
     62 
     63 // CHECK: ldrex  r1, [r2, #4]        @ encoding: [0x52,0xe8,0x01,0x1f]
     64 ldrex r1, [r2, #4]
     65 
     66 // CHECK: ldrexb r1, [r2]            @ encoding: [0xd2,0xe8,0x4f,0x1f]
     67 ldrexb r1, [r2]
     68 
     69 // CHECK: ldrexh r1, [r2]            @ encoding: [0xd2,0xe8,0x5f,0x1f]
     70 ldrexh r1, [r2]
     71 
     72 // UNDEF-BASELINE: error: instruction requires: !armv*m thumb2
     73 // UNDEF-MAINLINE: error: instruction requires: !armv*m
     74 ldrexd r0, r1, [r2]
     75 
     76 // CHECK: strex  r1, r2, [r3, #4]    @ encoding: [0x43,0xe8,0x01,0x21]
     77 strex r1, r2, [r3, #4]
     78 
     79 // CHECK: strexb r1, r2, [r3]        @ encoding: [0xc3,0xe8,0x41,0x2f]
     80 strexb r1, r2, [r3]
     81 
     82 // CHECK: strexh r1, r2, [r3]        @ encoding: [0xc3,0xe8,0x51,0x2f]
     83 strexh r1, r2, [r3]
     84 
     85 // UNDEF-BASELINE: error: instruction requires: !armv*m thumb2
     86 // UNDEF-MAINLINE: error: instruction requires: !armv*m
     87 strexd r0, r1, r2, [r3]
     88 
     89 // 'XO generation'
     90 
     91 // CHECK: movw r1, #65535            @ encoding: [0x4f,0xf6,0xff,0x71]
     92 movw r1, #0xffff
     93 
     94 // CHECK: movt r1, #65535            @ encoding: [0xcf,0xf6,0xff,0x71]
     95 movt r1, #0xffff
     96 
     97 // 'Acquire/Release from ARMv8-A'
     98 
     99 // CHECK: lda r1, [r2]                @ encoding: [0xd2,0xe8,0xaf,0x1f]
    100 lda r1, [r2]
    101 
    102 // CHECK: ldab  r1, [r2]                @ encoding: [0xd2,0xe8,0x8f,0x1f]
    103 ldab r1, [r2]
    104 
    105 // CHECK: ldah  r1, [r2]                @ encoding: [0xd2,0xe8,0x9f,0x1f]
    106 ldah r1, [r2]
    107 
    108 // CHECK: stl r1, [r3]                @ encoding: [0xc3,0xe8,0xaf,0x1f]
    109 stl r1, [r3]
    110 
    111 // CHECK: stlb  r1, [r3]                @ encoding: [0xc3,0xe8,0x8f,0x1f]
    112 stlb r1, [r3]
    113 
    114 // CHECK: stlh  r1, [r3]                @ encoding: [0xc3,0xe8,0x9f,0x1f]
    115 stlh r1, [r3]
    116 
    117 // CHECK: ldaex r1, [r2]                @ encoding: [0xd2,0xe8,0xef,0x1f]
    118 ldaex r1, [r2]
    119 
    120 // CHECK: ldaexb  r1, [r2]                @ encoding: [0xd2,0xe8,0xcf,0x1f]
    121 ldaexb r1, [r2]
    122 
    123 // CHECK: ldaexh  r1, [r2]                @ encoding: [0xd2,0xe8,0xdf,0x1f]
    124 ldaexh r1, [r2]
    125 
    126 // UNDEF: error: instruction requires: !armv*m
    127 ldaexd r0, r1, [r2]
    128 
    129 // CHECK: stlex r1, r2, [r3]            @ encoding: [0xc3,0xe8,0xe1,0x2f]
    130 stlex r1, r2, [r3]
    131 
    132 // CHECK: stlexb  r1, r2, [r3]            @ encoding: [0xc3,0xe8,0xc1,0x2f]
    133 stlexb r1, r2, [r3]
    134 
    135 // CHECK: stlexh  r1, r2, [r3]            @ encoding: [0xc3,0xe8,0xd1,0x2f]
    136 stlexh r1, r2, [r3]
    137 
    138 // UNDEF: error: instruction requires: !armv*m
    139 stlexd r0, r1, r2, [r2]
    140 
    141 // ARMv8-M Security Extensions
    142 
    143 // CHECK: sg                         @ encoding: [0x7f,0xe9,0x7f,0xe9]
    144 sg
    145 
    146 // CHECK: bxns r0                    @ encoding: [0x04,0x47]
    147 bxns r0
    148 
    149 // UNDEF-BASELINE: error: invalid operand for instruction
    150 // UNDEF-BASELINE: error: conditional execution not supported in Thumb1
    151 // CHECK-MAINLINE: it eq                      @ encoding: [0x08,0xbf]
    152 // CHECK-MAINLINE: bxnseq r1                  @ encoding: [0x0c,0x47]
    153 it eq
    154 bxnseq r1
    155 
    156 // CHECK: bxns lr                    @ encoding: [0x74,0x47]
    157 bxns lr
    158 
    159 // CHECK: blxns r0                   @ encoding: [0x84,0x47]
    160 blxns r0
    161 
    162 // UNDEF-BASELINE: error: invalid operand for instruction
    163 // UNDEF-BASELINE: error: conditional execution not supported in Thumb1
    164 // CHECK-MAINLINE: it eq                      @ encoding: [0x08,0xbf]
    165 // CHECK-MAINLINE: blxnseq r1                 @ encoding: [0x8c,0x47]
    166 it eq
    167 blxnseq r1
    168 
    169 // CHECK: tt r0, r1                  @ encoding: [0x41,0xe8,0x00,0xf0]
    170 tt r0, r1
    171 
    172 // CHECK: tt r0, sp                  @ encoding: [0x4d,0xe8,0x00,0xf0]
    173 tt r0, sp
    174 
    175 // CHECK: tta r0, r1                 @ encoding: [0x41,0xe8,0x80,0xf0]
    176 tta r0, r1
    177 
    178 // CHECK: ttt r0, r1                 @ encoding: [0x41,0xe8,0x40,0xf0]
    179 ttt r0, r1
    180 
    181 // CHECK: ttat r0, r1                @ encoding: [0x41,0xe8,0xc0,0xf0]
    182 ttat r0, r1
    183 
    184 // 'Lazy Load/Store Multiple'
    185 
    186 // UNDEF-BASELINE: error: instruction requires: armv8m.main
    187 // CHECK-MAINLINE: vlldm r5          @ encoding: [0x35,0xec,0x00,0x0a]
    188 // CHECK-MAINLINE_DSP: vlldm r5      @ encoding: [0x35,0xec,0x00,0x0a]
    189 vlldm r5
    190 
    191 // UNDEF-BASELINE: error: instruction requires: armv8m.main
    192 // CHECK-MAINLINE: vlstm r10         @ encoding: [0x2a,0xec,0x00,0x0a]
    193 // CHECK-MAINLINE_DSP: vlstm r10     @ encoding: [0x2a,0xec,0x00,0x0a]
    194 vlstm r10
    195 
    196 // New SYSm's
    197 
    198 MRS r1, MSP_NS
    199 // CHECK: mrs r1, msp_ns             @ encoding: [0xef,0xf3,0x88,0x81]
    200 MSR PSP_NS, r2
    201 // CHECK: msr psp_ns, r2             @ encoding: [0x82,0xf3,0x89,0x88]
    202 MRS r3, PRIMASK_NS
    203 // CHECK: mrs r3, primask_ns         @ encoding: [0xef,0xf3,0x90,0x83]
    204 MSR CONTROL_NS, r4
    205 // CHECK: msr control_ns, r4         @ encoding: [0x84,0xf3,0x94,0x88]
    206 MRS r5, SP_NS
    207 // CHECK: mrs r5, sp_ns              @ encoding: [0xef,0xf3,0x98,0x85]
    208 MRS r6,MSPLIM
    209 // CHECK: mrs r6, msplim             @ encoding: [0xef,0xf3,0x0a,0x86]
    210 MRS r7,PSPLIM
    211 // CHECK: mrs r7, psplim             @ encoding: [0xef,0xf3,0x0b,0x87]
    212 MSR MSPLIM,r8
    213 // CHECK: msr msplim, r8             @ encoding: [0x88,0xf3,0x0a,0x88]
    214 MSR PSPLIM,r9
    215 // CHECK: msr psplim, r9             @ encoding: [0x89,0xf3,0x0b,0x88]
    216 
    217 MRS r10, MSPLIM_NS
    218 // CHECK-MAINLINE: mrs r10, msplim_ns    @ encoding: [0xef,0xf3,0x8a,0x8a]
    219 // UNDEF-BASELINE: error: invalid operand for instruction
    220 MSR PSPLIM_NS, r11
    221 // CHECK-MAINLINE: msr psplim_ns, r11    @ encoding: [0x8b,0xf3,0x8b,0x88]
    222 // UNDEF-BASELINE: error: invalid operand for instruction
    223 MRS r12, BASEPRI_NS
    224 // CHECK-MAINLINE: mrs r12, basepri_ns   @ encoding: [0xef,0xf3,0x91,0x8c]
    225 // UNDEF-BASELINE: error: invalid operand for instruction
    226 MRS r12, BASEPRI_MAX_NS
    227 // CHECK-MAINLINE: mrs r12, basepri_max_ns @ encoding: [0xef,0xf3,0x92,0x8c]
    228 // UNDEF-BASELINE: error: invalid operand for instruction
    229 MSR FAULTMASK_NS, r14
    230 // CHECK-MAINLINE: msr faultmask_ns, lr  @ encoding: [0x8e,0xf3,0x93,0x88]
    231 // UNDEF-BASELINE: error: invalid operand for instruction
    232 
    233 // Invalid operand tests
    234 // UNDEF: error: invalid operand for instruction
    235 // UNDEF:     sg #0
    236 sg #0
    237 // UNDEF: error: invalid operand for instruction
    238 // UNDEF:     sg r0
    239 sg r0
    240 // UNDEF: error: invalid operand for instruction
    241 // UNDEF:     bxns r0, r1
    242 bxns r0, r1
    243 // UNDEF: error: invalid operand for instruction
    244 // UNDEF:     blxns r0, #0
    245 blxns r0, #0
    246 // UNDEF: error: invalid operand for instruction
    247 // UNDEF:     blxns label
    248 blxns label
    249 // UNDEF: error: invalid operand for instruction
    250 // UNDEF:     tt r0, r1, r2
    251 tt r0, r1, r2
    252 // UNDEF: error: invalid operand for instruction
    253 // UNDEF:     tt r0, [r1]
    254 tt r0, [r1]
    255 // UNDEF: error: invalid operand for instruction
    256 // UNDEF:     tt r0, r1, #4
    257 tt r0, r1, #4
    258 // UNDEF: error: invalid operand for instruction
    259 // UNDEF:     tt r0, #4
    260 tt r0, #4
    261 
    262 // Unpredictable operands
    263 // UNDEF: error: invalid operand for instruction
    264 // UNDEF:     blxns pc
    265 blxns pc
    266 // UNDEF: error: invalid operand for instruction
    267 // UNDEF:     tt sp, r0
    268 tt sp, r0
    269 // UNDEF: error: invalid operand for instruction
    270 // UNDEF:     tt pc, r0
    271 tt pc, r0
    272 // UNDEF: error: invalid operand for instruction
    273 // UNDEF:     tt r0, pc
    274 tt r0, pc
    275 
    276 // UNDEF: error: invalid operand for instruction
    277 // UNDEF:     vlldm pc
    278 vlldm pc
    279 
    280 // UNDEF: error: invalid operand for instruction
    281 // UNDEF:     vlstm pc
    282 vlstm pc
    283