1@ RUN: not llvm-mc -triple=thumbv6-apple-darwin -o /dev/null < %s 2>&1 \ 2@ RUN: | FileCheck --check-prefix=CHECK-ERRORS %s 3@ RUN: not llvm-mc -triple=thumbv5-apple-darwin -o /dev/null < %s 2>&1 \ 4@ RUN: | FileCheck --check-prefix=CHECK-ERRORS-V5 %s 5@ RUN: not llvm-mc -triple=thumbv7m -o /dev/null < %s 2>&1 \ 6@ RUN: | FileCheck --check-prefix=CHECK-ERRORS-V7M %s 7@ RUN: not llvm-mc -triple=thumbv8 -o /dev/null < %s 2>&1 \ 8@ RUN: | FileCheck --check-prefix=CHECK-ERRORS-V8 %s 9 10@ Check for various assembly diagnostic messages on invalid input. 11 12@ ADD instruction w/o 'S' suffix. 13 add r1, r2, r3 14@ CHECK-ERRORS: error: invalid instruction, any one of the following would fix this: 15@ CHECK-ERRORS: add r1, r2, r3 16@ CHECK-ERRORS: ^ 17@ CHECK-ERRORS: note: instruction requires: arm-mode 18@ CHECK-ERRORS: note: instruction requires: thumb2 19@ CHECK-ERRORS: note: invalid operand for instruction 20@ CHECK-ERRORS: note: operand must be an immediate in the range [0,7] 21@ CHECK-ERRORS: note: no flag-preserving variant of this instruction available 22 23@ Instructions which require v6+ for both registers to be low regs. 24 add r2, r3 25 mov r2, r3 26@ CHECK-ERRORS: error: invalid instruction, any one of the following would fix this: 27@ CHECK-ERRORS: add r2, r3 28@ CHECK-ERRORS: ^ 29@ CHECK-ERRORS: note: instruction variant requires Thumb2 30@ CHECK-ERRORS: note: operand must be a register sp 31@ CHECK-ERRORS-V5: error: instruction variant requires ARMv6 or later 32@ CHECK-ERRORS-V5: mov r2, r3 33@ CHECK-ERRORS-V5: ^ 34 35@ Immediates where registers were expected 36 adds #0, r1, r2 37 adds r0, #1, r2 38@ CHECK-ERRORS: error: operand must be a register in range [r0, r7] 39@ CHECK-ERRORS: adds #0, r1, r2 40@ CHECK-ERRORS: error: invalid instruction, any one of the following would fix this: 41@ CHECK-ERRORS: adds r0, #1, r2 42@ CHECK-ERRORS: note: operand must be a register in range [r0, r7] 43@ CHECK-ERRORS: note: too many operands for instruction 44 45@ Out of range immediates for ASR instruction. 46 asrs r2, r3, #33 47@ CHECK-ERRORS: error: invalid instruction, any one of the following would fix this: 48@ CHECK-ERRORS: asrs r2, r3, #33 49@ CHECK-ERRORS: ^ 50@ CHECK-ERRORS: note: operand must be an immediate in the range [1,32] 51@ CHECK-ERRORS: note: too many operands for instruction 52 53@ Out of range immediates for BKPT instruction. 54 bkpt #256 55 bkpt #-1 56@ CHECK-ERRORS: error: invalid instruction, any one of the following would fix this: 57@ CHECK-ERRORS: bkpt #256 58@ CHECK-ERRORS: ^ 59@ CHECK-ERRORS: note: instruction requires: arm-mode 60@ CHECK-ERRORS: note: operand must be an immediate in the range [0,255] 61@ CHECK-ERRORS: note: too many operands for instruction 62 63@ CHECK-ERRORS: error: invalid instruction, any one of the following would fix this: 64@ CHECK-ERRORS: bkpt #-1 65@ CHECK-ERRORS: ^ 66@ CHECK-ERRORS: note: operand must be an immediate in the range [0,255] 67@ CHECK-ERRORS: note: too many operands for instruction 68 69@ Out of range immediates for v8 HLT instruction. 70 hlt #64 71 hlt #-1 72@CHECK-ERRORS: error: invalid instruction 73@CHECK-ERRORS: hlt #64 74@CHECK-ERRORS: ^ 75@CHECK-ERRORS-V8: error: invalid instruction, any one of the following would fix this: 76@CHECK-ERRORS-V8: hlt #64 77@CHECK-ERRORS-V8: ^ 78@CHECK-ERRORS-V8: note: instruction requires: arm-mode 79@CHECK-ERRORS-V8: operand must be an immediate in the range [0,63] 80@CHECK-ERRORS: error: invalid instruction 81@CHECK-ERRORS: hlt #-1 82@CHECK-ERRORS: ^ 83@CHECK-ERRORS-V8: error: operand must be an immediate in the range [0,63] 84@CHECK-ERRORS-V8: hlt #-1 85@CHECK-ERRORS-V8: ^ 86 87@ Invalid writeback and register lists for LDM 88 ldm r2!, {r5, r8} 89 ldm r2, {r5, r7} 90 ldm r2!, {r2, r3, r4} 91 ldm r2!, {r2, r3, r4, r10} 92 ldmdb r2!, {r2, r3, r4} 93 ldm r0, {r2, sp} 94 ldmia r0, {r2-r3, sp} 95 ldmia r0!, {r2-r3, sp} 96 ldmfd r2, {r1, r3-r6, sp} 97 ldmfd r2!, {r1, r3-r6, sp} 98 ldmdb r1, {r2, r3, sp} 99 ldmdb r1!, {r2, r3, sp} 100@ CHECK-ERRORS: error: registers must be in range r0-r7 101@ CHECK-ERRORS: ldm r2!, {r5, r8} 102@ CHECK-ERRORS: ^ 103@ CHECK-ERRORS: error: writeback operator '!' expected 104@ CHECK-ERRORS: ldm r2, {r5, r7} 105@ CHECK-ERRORS: ^ 106@ CHECK-ERRORS: error: writeback operator '!' not allowed when base register in register list 107@ CHECK-ERRORS: ldm r2!, {r2, r3, r4} 108@ CHECK-ERRORS: ^ 109@ CHECK-ERRORS-V8: error: writeback operator '!' not allowed when base register in register list 110@ CHECK-ERRORS-V8: ldm r2!, {r2, r3, r4, r10} 111@ CHECK-ERRORS-V8: ^ 112@ CHECK-ERRORS-V8: error: writeback register not allowed in register list 113@ CHECK-ERRORS-V8: ldmdb r2!, {r2, r3, r4} 114@ CHECK-ERRORS-V8: ^ 115@ CHECK-ERRORS-V7M: error: SP may not be in the register list 116@ CHECK-ERRORS-V7M: ldm r0, {r2, sp} 117@ CHECK-ERRORS-V7M: ^ 118@ CHECK-ERRORS-V7M: error: SP may not be in the register list 119@ CHECK-ERRORS-V7M: ldmia r0, {r2-r3, sp} 120@ CHECK-ERRORS-V7M: ^ 121@ CHECK-ERRORS-V7M: error: SP may not be in the register list 122@ CHECK-ERRORS-V7M: ldmia r0!, {r2-r3, sp} 123@ CHECK-ERRORS-V7M: ^ 124@ CHECK-ERRORS-V7M: error: SP may not be in the register list 125@ CHECK-ERRORS-V7M: ldmfd r2, {r1, r3-r6, sp} 126@ CHECK-ERRORS-V7M: ^ 127@ CHECK-ERRORS-V7M: error: SP may not be in the register list 128@ CHECK-ERRORS-V7M: ldmfd r2!, {r1, r3-r6, sp} 129@ CHECK-ERRORS-V7M: ^ 130@ CHECK-ERRORS-V7M: error: SP may not be in the register list 131@ CHECK-ERRORS-V7M: ldmdb r1, {r2, r3, sp} 132@ CHECK-ERRORS-V7M: ^ 133@ CHECK-ERRORS-V7M: error: SP may not be in the register list 134@ CHECK-ERRORS-V7M: ldmdb r1!, {r2, r3, sp} 135@ CHECK-ERRORS-V7M: ^ 136 137@ Invalid writeback and register lists for PUSH/POP 138 pop {r1, r2, r10} 139 push {r8, r9} 140@ CHECK-ERRORS: error: registers must be in range r0-r7 or pc 141@ CHECK-ERRORS: pop {r1, r2, r10} 142@ CHECK-ERRORS: ^ 143@ CHECK-ERRORS: error: registers must be in range r0-r7 or lr 144@ CHECK-ERRORS: push {r8, r9} 145@ CHECK-ERRORS: ^ 146 147 148@ Invalid writeback and register lists for STM 149 stm r1, {r2, r6} 150 stm r1!, {r2, r9} 151 stm r2!, {r2, r9} 152 stmdb r2!, {r0, r2} 153 stm r1!, {r2, sp} 154 stmia r4!, {r0-r3, sp} 155 stmdb r1, {r2, r3, sp} 156 stmdb r1!, {r2, r3, sp} 157@ CHECK-ERRORS: error: invalid instruction, any one of the following would fix this: 158@ CHECK-ERRORS: stm r1, {r2, r6} 159@ CHECK-ERRORS: ^ 160@ CHECK-ERRORS: note: instruction requires: thumb2 161@ CHECK-ERRORS: note: instruction requires: arm-mode 162@ CHECK-ERRORS: error: registers must be in range r0-r7 163@ CHECK-ERRORS: stm r1!, {r2, r9} 164@ CHECK-ERRORS: ^ 165@ CHECK-ERRORS-V8: error: writeback operator '!' not allowed when base register in register list 166@ CHECK-ERRORS-V8: stm r2!, {r2, r9} 167@ CHECK-ERRORS-V8: ^ 168@ CHECK-ERRORS-V8: error: writeback register not allowed in register list 169@ CHECK-ERRORS-V8: stmdb r2!, {r0, r2} 170@ CHECK-ERRORS-V8: ^ 171@ CHECK-ERRORS-V7M: error: SP may not be in the register list 172@ CHECK-ERRORS-V7M: stm r1!, {r2, sp} 173@ CHECK-ERRORS-V7M: ^ 174@ CHECK-ERRORS-V7M: error: SP may not be in the register list 175@ CHECK-ERRORS-V7M: stmia r4!, {r0-r3, sp} 176@ CHECK-ERRORS-V7M: ^ 177@ CHECK-ERRORS-V7M: error: SP may not be in the register list 178@ CHECK-ERRORS-V7M: stmdb r1, {r2, r3, sp} 179@ CHECK-ERRORS-V7M: ^ 180@ CHECK-ERRORS-V7M: error: SP may not be in the register list 181@ CHECK-ERRORS-V7M: stmdb r1!, {r2, r3, sp} 182@ CHECK-ERRORS-V7M: ^ 183 184@ Out of range immediates for LSL instruction. 185 lsls r4, r5, #-1 186 lsls r4, r5, #32 187@ CHECK-ERRORS: error: invalid instruction, any one of the following would fix this: 188@ CHECK-ERRORS: lsls r4, r5, #-1 189@ CHECK-ERRORS: ^ 190@ CHECK-ERRORS: note: operand must be an immediate in the range [0,31] 191@ CHECK-ERRORS: note: too many operands for instruction 192@ CHECK-ERRORS: error: invalid instruction, any one of the following would fix this: 193@ CHECK-ERRORS: lsls r4, r5, #32 194@ CHECK-ERRORS: ^ 195@ CHECK-ERRORS: note: operand must be an immediate in the range [0,31] 196@ CHECK-ERRORS: note: too many operands for instruction 197 198@ Mismatched source/destination operands for MUL instruction. 199 muls r1, r2, r3 200@ CHECK-ERRORS: error: destination register must match source register 201@ CHECK-ERRORS: muls r1, r2, r3 202@ CHECK-ERRORS: ^ 203 204 205@ Out of range immediates for STR instruction. 206 str r2, [r7, #-1] 207 str r5, [r1, #3] 208 str r3, [r7, #128] 209@ CHECK-ERRORS: error: invalid instruction, any one of the following would fix this: 210@ CHECK-ERRORS: str r2, [r7, #-1] 211@ CHECK-ERRORS: ^ 212@ CHECK-ERRORS: note: instruction requires: thumb2 213@ CHECK-ERRORS: note: instruction requires: arm-mode 214@ CHECK-ERRORS: note: invalid operand for instruction 215@ CHECK-ERRORS: error: invalid instruction, any one of the following would fix this: 216@ CHECK-ERRORS: str r5, [r1, #3] 217@ CHECK-ERRORS: ^ 218@ CHECK-ERRORS: note: instruction requires: thumb2 219@ CHECK-ERRORS: note: instruction requires: arm-mode 220@ CHECK-ERRORS: note: invalid operand for instruction 221@ CHECK-ERRORS: error: invalid instruction, any one of the following would fix this: 222@ CHECK-ERRORS: str r3, [r7, #128] 223@ CHECK-ERRORS: ^ 224@ CHECK-ERRORS: note: instruction requires: thumb2 225@ CHECK-ERRORS: note: instruction requires: arm-mode 226@ CHECK-ERRORS: note: invalid operand for instruction 227 228@ Out of range immediate for SVC instruction. 229 svc #-1 230 svc #256 231@ CHECK-ERRORS: error: operand must be an immediate in the range [0,255] 232@ CHECK-ERRORS: svc #-1 233@ CHECK-ERRORS: ^ 234@ CHECK-ERRORS: error: invalid instruction, any one of the following would fix this: 235@ CHECK-ERRORS: svc #256 236@ CHECK-ERRORS: ^ 237@ CHECK-ERRORS: note: instruction requires: arm-mode 238@ CHECK-ERRORS: note: operand must be an immediate in the range [0,255] 239 240 241@ Out of range immediate for ADD SP instructions 242 add sp, #-1 243 add sp, #3 244 add sp, sp, #512 245 add r2, sp, #1024 246@ CHECK-ERRORS: error: invalid instruction, any one of the following would fix this: 247@ CHECK-ERRORS: add sp, #-1 248@ CHECK-ERRORS: ^ 249@ CHECK-ERRORS: note: operand must be a register in range [r0, r15] 250@ CHECK-ERRORS: note: instruction requires: thumb2 251@ CHECK-ERRORS: error: invalid instruction, any one of the following would fix this: 252@ CHECK-ERRORS: add sp, #3 253@ CHECK-ERRORS: ^ 254@ CHECK-ERRORS: note: operand must be a register in range [r0, r15] 255@ CHECK-ERRORS: note: instruction requires: thumb2 256@ CHECK-ERRORS: error: invalid instruction, any one of the following would fix this: 257@ CHECK-ERRORS: add sp, sp, #512 258@ CHECK-ERRORS: ^ 259@ CHECK-ERRORS: note: operand must be a register in range [r0, r15] 260@ CHECK-ERRORS: note: instruction requires: thumb2 261@ CHECK-ERRORS: error: instruction requires: thumb2 262@ CHECK-ERRORS: add r2, sp, #1024 263@ CHECK-ERRORS: ^ 264 265 add r2, sp, ip 266@ CHECK-ERRORS: error: source register must be the same as destination 267@ CHECK-ERRORS: add r2, sp, ip 268@ CHECK-ERRORS: ^ 269 270 271@------------------------------------------------------------------------------ 272@ B/Bcc - out of range immediates for Thumb1 branches 273@------------------------------------------------------------------------------ 274 275 beq #-258 276 bne #256 277 bgt #13 278 b #-1048578 279 b #1048576 280 b #10323 281 282@ CHECK-ERRORS: error: branch target out of range 283@ CHECK-ERRORS: error: branch target out of range 284@ CHECK-ERRORS: error: branch target out of range 285@ CHECK-ERRORS: error: branch target out of range 286@ CHECK-ERRORS: error: branch target out of range 287@ CHECK-ERRORS: error: branch target out of range 288 289@------------------------------------------------------------------------------ 290@ CBZ/CBNZ - out of range immediates for branches 291@------------------------------------------------------------------------------ 292 293 cbz r0, #-2 294 cbz r0, #0 295 cbz r0, #17 296 cbnz r0, #126 297 cbnz r0, #128 298 299@ CHECK-ERRORS-V7M: error: branch target out of range 300@ CHECK-ERRORS-V7M: error: invalid operand for instruction 301@ CHECK-ERRORS-V7M: error: branch target out of range 302@ CHECK-ERRORS-V8: error: branch target out of range 303@ CHECK-ERRORS-V8: error: invalid operand for instruction 304@ CHECK-ERRORS-V8: error: branch target out of range 305 306@------------------------------------------------------------------------------ 307@ SEV/WFE/WFI/YIELD - are not supported pre v6M or v6T2 308@------------------------------------------------------------------------------ 309 sev 310 wfe 311 wfi 312 yield 313 314@ CHECK-ERRORS: error: instruction requires: armv6m or armv6t2 315@ CHECK-ERRORS: sev 316@ CHECK-ERRORS: ^ 317@ CHECK-ERRORS: error: instruction requires: armv6m or armv6t2 318@ CHECK-ERRORS: wfe 319@ CHECK-ERRORS: ^ 320@ CHECK-ERRORS: error: instruction requires: armv6m or armv6t2 321@ CHECK-ERRORS: wfi 322@ CHECK-ERRORS: ^ 323@ CHECK-ERRORS: error: instruction requires: armv6m or armv6t2 324@ CHECK-ERRORS: yield 325@ CHECK-ERRORS: ^ 326 327@------------------------------------------------------------------------------ 328@ PLDW required mp-extensions 329@------------------------------------------------------------------------------ 330 pldw [r0, #4] 331@ CHECK-ERRORS: error: instruction requires: mp-extensions 332 333@------------------------------------------------------------------------------ 334@ LDR(lit) - invalid offsets 335@------------------------------------------------------------------------------ 336 337 ldr r4, [pc, #-12] 338@ CHECK-ERRORS: error: invalid instruction, any one of the following would fix this: 339@ CHECK-ERRORS: note: instruction requires: thumb2 340@ CHECK-ERRORS: note: instruction requires: arm-mode 341@ CHECK-ERRORS: note: invalid operand for instruction 342 343@------------------------------------------------------------------------------ 344@ STC2{L}/LDC2{L} - requires thumb2 345@------------------------------------------------------------------------------ 346 stc2 p0, c8, [r1, #4] 347 stc2l p6, c2, [r7, #4] 348 ldc2 p0, c8, [r1, #4] 349 ldc2l p6, c2, [r7, #4] 350@ CHECK-ERRORS: error: invalid instruction 351@ CHECK-ERRORS: error: invalid instruction 352@ CHECK-ERRORS: error: invalid instruction 353@ CHECK-ERRORS: error: invalid instruction 354 355@------------------------------------------------------------------------------ 356@ Generic error for too few operands 357@------------------------------------------------------------------------------ 358 359 adds 360 adds r0 361@ CHECK-ERRORS: error: too few operands for instruction 362@ CHECK-ERRORS: error: too few operands for instruction 363 364@------------------------------------------------------------------------------ 365@ Out of range width for SBFX/UBFX 366@------------------------------------------------------------------------------ 367 368 sbfx r4, r5, #31, #2 369 ubfx r4, r5, #16, #17 370 371@ CHECK-ERRORS-V8: error: bitfield width must be in range [1,32-lsb] 372@ CHECK-ERRORS-V8: sbfx r4, r5, #31, #2 373@ CHECK-ERRORS-V8: ^ 374@ CHECK-ERRORS-V8: error: bitfield width must be in range [1,32-lsb] 375@ CHECK-ERRORS-V8: ubfx r4, r5, #16, #17 376@ CHECK-ERRORS-V8: ^ 377 378@------------------------------------------------------------------------------ 379@ Writeback store writing to same register as value 380@------------------------------------------------------------------------------ 381 382 str r0, [r0, #4]! 383 str r0, [r0], #4 384 strh r0, [r0, #2]! 385 strh r0, [r0], #2 386 strb r0, [r0, #1]! 387 strb r0, [r0], #1 388 strd r0, r1, [r0], #1 389 strd r1, r0, [r0], #1 390@ CHECK-ERRORS-V8: error: source register and base register can't be identical 391@ CHECK-ERRORS-V8: str r0, [r0, #4]! 392@ CHECK-ERRORS-V8: ^ 393@ CHECK-ERRORS-V8: error: source register and base register can't be identical 394@ CHECK-ERRORS-V8: str r0, [r0], #4 395@ CHECK-ERRORS-V8: ^ 396@ CHECK-ERRORS-V8: error: source register and base register can't be identical 397@ CHECK-ERRORS-V8: strh r0, [r0, #2]! 398@ CHECK-ERRORS-V8: ^ 399@ CHECK-ERRORS-V8: error: source register and base register can't be identical 400@ CHECK-ERRORS-V8: strh r0, [r0], #2 401@ CHECK-ERRORS-V8: ^ 402@ CHECK-ERRORS-V8: error: source register and base register can't be identical 403@ CHECK-ERRORS-V8: strb r0, [r0, #1]! 404@ CHECK-ERRORS-V8: ^ 405@ CHECK-ERRORS-V8: error: source register and base register can't be identical 406@ CHECK-ERRORS-V8: strb r0, [r0], #1 407@ CHECK-ERRORS-V8: ^ 408@ CHECK-ERRORS-V8: error: source register and base register can't be identical 409@ CHECK-ERRORS-V8: strd r0, r1, [r0], #1 410@ CHECK-ERRORS-V8: ^ 411@ CHECK-ERRORS-V8: error: source register and base register can't be identical 412@ CHECK-ERRORS-V8: strd r1, r0, [r0], #1 413@ CHECK-ERRORS-V8: ^ 414