1 @--- 2 @ Run these test in both Thumb1 and Thumb2 modes, as all of the encodings 3 @ should be valid, and parse the same, in both. 4 @--- 5 @ RUN: llvm-mc -triple=thumbv6-apple-darwin -show-encoding < %s | FileCheck %s 6 @ RUN: llvm-mc -triple=thumbv7-apple-darwin -show-encoding < %s | FileCheck %s 7 .syntax unified 8 .globl _func 9 10 @ Check that the assembler can handle the documented syntax from the ARM ARM. 11 @ For complex constructs like shifter operands, check more thoroughly for them 12 @ once then spot check that following instructions accept the form generally. 13 @ This gives us good coverage while keeping the overall size of the test 14 @ more reasonable. 15 16 17 @ FIXME: Some 3-operand instructions have a 2-operand assembly syntax. 18 19 _func: 20 @ CHECK: _func 21 22 @------------------------------------------------------------------------------ 23 @ ADC (register) 24 @------------------------------------------------------------------------------ 25 adcs r4, r6 26 27 @ CHECK: adcs r4, r6 @ encoding: [0x74,0x41] 28 29 30 @------------------------------------------------------------------------------ 31 @ ADD (immediate) 32 @------------------------------------------------------------------------------ 33 adds r1, r2, #3 34 @ When Rd is not explicitly specified, encoding T2 is preferred even though 35 @ the literal is in the range [0,7] which would allow encoding T1. 36 adds r2, #3 37 adds r2, #8 38 39 @ CHECK: adds r1, r2, #3 @ encoding: [0xd1,0x1c] 40 @ CHECK: adds r2, #3 @ encoding: [0x03,0x32] 41 @ CHECK: adds r2, #8 @ encoding: [0x08,0x32] 42 43 44 @------------------------------------------------------------------------------ 45 @ ADD (register) 46 @------------------------------------------------------------------------------ 47 adds r1, r2, r3 48 add r2, r8 49 50 @ CHECK: adds r1, r2, r3 @ encoding: [0xd1,0x18] 51 @ CHECK: add r2, r8 @ encoding: [0x42,0x44] 52 53 54 @------------------------------------------------------------------------------ 55 @ ADD (SP plus immediate) 56 @------------------------------------------------------------------------------ 57 add sp, #4 58 add sp, #508 59 add sp, sp, #4 60 add r2, sp, #8 61 add r2, sp, #1020 62 add sp, sp, #-8 63 add sp, #-8 64 65 @ CHECK: add sp, #4 @ encoding: [0x01,0xb0] 66 @ CHECK: add sp, #508 @ encoding: [0x7f,0xb0] 67 @ CHECK: add sp, #4 @ encoding: [0x01,0xb0] 68 @ CHECK: add r2, sp, #8 @ encoding: [0x02,0xaa] 69 @ CHECK: add r2, sp, #1020 @ encoding: [0xff,0xaa] 70 @ CHECK: sub sp, #8 @ encoding: [0x82,0xb0] 71 @ CHECK: sub sp, #8 @ encoding: [0x82,0xb0] 72 73 74 @------------------------------------------------------------------------------ 75 @ ADD (SP plus register) 76 @------------------------------------------------------------------------------ 77 add sp, r3 78 add r2, sp, r2 79 80 @ CHECK: add sp, r3 @ encoding: [0x9d,0x44] 81 @ CHECK: add r2, sp, r2 @ encoding: [0x6a,0x44] 82 83 84 @------------------------------------------------------------------------------ 85 @ ADR 86 @------------------------------------------------------------------------------ 87 adr r2, _baz 88 adr r5, #0 89 adr r2, #4 90 adr r3, #1020 91 92 @ CHECK: adr r2, _baz @ encoding: [A,0xa2] 93 @ fixup A - offset: 0, value: _baz, kind: fixup_thumb_adr_pcrel_10 94 @ CHECK: adr r5, #0 @ encoding: [0x00,0xa5] 95 @ CHECK: adr r2, #4 @ encoding: [0x01,0xa2] 96 @ CHECK: adr r3, #1020 @ encoding: [0xff,0xa3] 97 98 @------------------------------------------------------------------------------ 99 @ ASR (immediate) 100 @------------------------------------------------------------------------------ 101 asrs r2, r3, #32 102 asrs r2, r3, #5 103 asrs r2, r3, #1 104 asrs r5, #21 105 asrs r5, r5, #21 106 asrs r3, r5, #21 107 108 @ CHECK: asrs r2, r3, #32 @ encoding: [0x1a,0x10] 109 @ CHECK: asrs r2, r3, #5 @ encoding: [0x5a,0x11] 110 @ CHECK: asrs r2, r3, #1 @ encoding: [0x5a,0x10] 111 @ CHECK: asrs r5, r5, #21 @ encoding: [0x6d,0x15] 112 @ CHECK: asrs r5, r5, #21 @ encoding: [0x6d,0x15] 113 @ CHECK: asrs r3, r5, #21 @ encoding: [0x6b,0x15] 114 115 116 @------------------------------------------------------------------------------ 117 @ ASR (register) 118 @------------------------------------------------------------------------------ 119 asrs r5, r2 120 121 @ CHECK: asrs r5, r2 @ encoding: [0x15,0x41] 122 123 124 @------------------------------------------------------------------------------ 125 @ B 126 @------------------------------------------------------------------------------ 127 b _baz 128 beq _bar 129 b #1838 130 b #-420 131 beq #336 132 beq #160 133 134 @ CHECK: b _baz @ encoding: [A,0xe0'A'] 135 @ fixup A - offset: 0, value: _baz, kind: fixup_arm_thumb_br 136 @ CHECK: beq _bar @ encoding: [A,0xd0] 137 @ fixup A - offset: 0, value: _bar, kind: fixup_arm_thumb_bcc 138 @ CHECK: b #1838 @ encoding: [0x97,0xe3] 139 @ CHECK: b #-420 @ encoding: [0x2e,0xe7] 140 @ CHECK: beq #336 @ encoding: [0xa8,0xd0] 141 @ CHECK: beq #160 @ encoding: [0x50,0xd0] 142 143 @------------------------------------------------------------------------------ 144 @ BL/BLX 145 @------------------------------------------------------------------------------ 146 blx #884800 147 blx #1769600 148 149 @ CHECK: blx #884800 @ encoding: [0xd8,0xf0,0x20,0xe8] 150 @ CHECK: blx #1769600 @ encoding: [0xb0,0xf1,0x40,0xe8] 151 152 @------------------------------------------------------------------------------ 153 @ BICS 154 @------------------------------------------------------------------------------ 155 bics r1, r6 156 157 @ CHECK: bics r1, r6 @ encoding: [0xb1,0x43] 158 159 160 @------------------------------------------------------------------------------ 161 @ BKPT 162 @------------------------------------------------------------------------------ 163 bkpt #0 164 bkpt #255 165 166 @ CHECK: bkpt #0 @ encoding: [0x00,0xbe] 167 @ CHECK: bkpt #255 @ encoding: [0xff,0xbe] 168 169 170 @------------------------------------------------------------------------------ 171 @ BL/BLX (immediate) 172 @------------------------------------------------------------------------------ 173 bl _bar 174 blx _baz 175 176 @ CHECK: bl _bar @ encoding: [A,0xf0'A',A,0xd0'A'] 177 @ fixup A - offset: 0, value: _bar, kind: fixup_arm_thumb_bl 178 @ CHECK: blx _baz @ encoding: [A,0xf0'A',A,0xc0'A'] 179 @ fixup A - offset: 0, value: _baz, kind: fixup_arm_thumb_blx 180 181 182 @------------------------------------------------------------------------------ 183 @ BLX (register) 184 @------------------------------------------------------------------------------ 185 blx r4 186 187 @ CHECK: blx r4 @ encoding: [0xa0,0x47] 188 189 190 @------------------------------------------------------------------------------ 191 @ BX 192 @------------------------------------------------------------------------------ 193 bx r2 194 195 @ CHECK: bx r2 @ encoding: [0x10,0x47] 196 197 198 @------------------------------------------------------------------------------ 199 @ CMN 200 @------------------------------------------------------------------------------ 201 202 cmn r5, r1 203 204 @ CHECK: cmn r5, r1 @ encoding: [0xcd,0x42] 205 206 207 @------------------------------------------------------------------------------ 208 @ CMP 209 @------------------------------------------------------------------------------ 210 cmp r6, #32 211 cmp r3, r4 212 cmp r8, r1 213 214 @ CHECK: cmp r6, #32 @ encoding: [0x20,0x2e] 215 @ CHECK: cmp r3, r4 @ encoding: [0xa3,0x42] 216 @ CHECK: cmp r8, r1 @ encoding: [0x88,0x45] 217 218 @------------------------------------------------------------------------------ 219 @ EOR 220 @------------------------------------------------------------------------------ 221 eors r4, r5 222 223 @ CHECK: eors r4, r5 @ encoding: [0x6c,0x40] 224 225 226 @------------------------------------------------------------------------------ 227 @ LDM 228 @------------------------------------------------------------------------------ 229 ldm r3, {r0, r1, r2, r3, r4, r5, r6, r7} 230 ldm r2!, {r1, r3, r4, r5, r7} 231 ldm r1, {r1} 232 233 @ CHECK: ldm r3, {r0, r1, r2, r3, r4, r5, r6, r7} @ encoding: [0xff,0xcb] 234 @ CHECK: ldm r2!, {r1, r3, r4, r5, r7} @ encoding: [0xba,0xca] 235 @ CHECK: ldm r1, {r1} @ encoding: [0x02,0xc9] 236 237 238 @------------------------------------------------------------------------------ 239 @ LDR (immediate) 240 @------------------------------------------------------------------------------ 241 ldr r1, [r5] 242 ldr r2, [r6, #32] 243 ldr r3, [r7, #124] 244 ldr r1, [sp] 245 ldr r2, [sp, #24] 246 ldr r3, [sp, #1020] 247 248 249 @ CHECK: ldr r1, [r5] @ encoding: [0x29,0x68] 250 @ CHECK: ldr r2, [r6, #32] @ encoding: [0x32,0x6a] 251 @ CHECK: ldr r3, [r7, #124] @ encoding: [0xfb,0x6f] 252 @ CHECK: ldr r1, [sp] @ encoding: [0x00,0x99] 253 @ CHECK: ldr r2, [sp, #24] @ encoding: [0x06,0x9a] 254 @ CHECK: ldr r3, [sp, #1020] @ encoding: [0xff,0x9b] 255 256 257 @------------------------------------------------------------------------------ 258 @ LDR (literal) 259 @------------------------------------------------------------------------------ 260 ldr r1, _foo 261 ldr r3, #604 262 ldr r3, #368 263 264 @ CHECK: ldr r1, _foo @ encoding: [A,0x49] 265 @ fixup A - offset: 0, value: _foo, kind: fixup_arm_thumb_cp 266 @ CHECK: ldr r3, [pc, #604] @ encoding: [0x97,0x4b] 267 @ CHECK: ldr r3, [pc, #368] @ encoding: [0x5c,0x4b] 268 269 @------------------------------------------------------------------------------ 270 @ LDR (register) 271 @------------------------------------------------------------------------------ 272 ldr r1, [r2, r3] 273 274 @ CHECK: ldr r1, [r2, r3] @ encoding: [0xd1,0x58] 275 276 277 @------------------------------------------------------------------------------ 278 @ LDRB (immediate) 279 @------------------------------------------------------------------------------ 280 ldrb r4, [r3] 281 ldrb r5, [r6, #0] 282 ldrb r6, [r7, #31] 283 284 @ CHECK: ldrb r4, [r3] @ encoding: [0x1c,0x78] 285 @ CHECK: ldrb r5, [r6] @ encoding: [0x35,0x78] 286 @ CHECK: ldrb r6, [r7, #31] @ encoding: [0xfe,0x7f] 287 288 289 @------------------------------------------------------------------------------ 290 @ LDRB (register) 291 @------------------------------------------------------------------------------ 292 ldrb r6, [r4, r5] 293 294 @ CHECK: ldrb r6, [r4, r5] @ encoding: [0x66,0x5d] 295 296 297 @------------------------------------------------------------------------------ 298 @ LDRH (immediate) 299 @------------------------------------------------------------------------------ 300 ldrh r3, [r3] 301 ldrh r4, [r6, #2] 302 ldrh r5, [r7, #62] 303 304 @ CHECK: ldrh r3, [r3] @ encoding: [0x1b,0x88] 305 @ CHECK: ldrh r4, [r6, #2] @ encoding: [0x74,0x88] 306 @ CHECK: ldrh r5, [r7, #62] @ encoding: [0xfd,0x8f] 307 308 309 @------------------------------------------------------------------------------ 310 @ LDRH (register) 311 @------------------------------------------------------------------------------ 312 ldrh r6, [r2, r6] 313 314 @ CHECK: ldrh r6, [r2, r6] @ encoding: [0x96,0x5b] 315 316 317 @------------------------------------------------------------------------------ 318 @ LDRSB/LDRSH 319 @------------------------------------------------------------------------------ 320 ldrsb r6, [r2, r6] 321 ldrsh r3, [r7, r1] 322 323 @ CHECK: ldrsb r6, [r2, r6] @ encoding: [0x96,0x57] 324 @ CHECK: ldrsh r3, [r7, r1] @ encoding: [0x7b,0x5e] 325 326 327 @------------------------------------------------------------------------------ 328 @ LSL (immediate) 329 @------------------------------------------------------------------------------ 330 lsls r4, r5, #0 331 lsls r4, r5, #4 332 lsls r3, #12 333 lsls r3, r3, #12 334 lsls r1, r3, #12 335 336 @ CHECK: lsls r4, r5, #0 @ encoding: [0x2c,0x00] 337 @ CHECK: lsls r4, r5, #4 @ encoding: [0x2c,0x01] 338 @ CHECK: lsls r3, r3, #12 @ encoding: [0x1b,0x03] 339 @ CHECK: lsls r3, r3, #12 @ encoding: [0x1b,0x03] 340 @ CHECK: lsls r1, r3, #12 @ encoding: [0x19,0x03] 341 342 343 @------------------------------------------------------------------------------ 344 @ LSL (register) 345 @------------------------------------------------------------------------------ 346 lsls r2, r6 347 348 @ CHECK: lsls r2, r6 @ encoding: [0xb2,0x40] 349 350 351 @------------------------------------------------------------------------------ 352 @ LSR (immediate) 353 @------------------------------------------------------------------------------ 354 lsrs r1, r3, #1 355 lsrs r1, r3, #32 356 lsrs r4, #20 357 lsrs r4, r4, #20 358 lsrs r2, r4, #20 359 360 @ CHECK: lsrs r1, r3, #1 @ encoding: [0x59,0x08] 361 @ CHECK: lsrs r1, r3, #32 @ encoding: [0x19,0x08] 362 @ CHECK: lsrs r4, r4, #20 @ encoding: [0x24,0x0d] 363 @ CHECK: lsrs r4, r4, #20 @ encoding: [0x24,0x0d] 364 @ CHECK: lsrs r2, r4, #20 @ encoding: [0x22,0x0d] 365 366 367 @------------------------------------------------------------------------------ 368 @ LSR (register) 369 @------------------------------------------------------------------------------ 370 lsrs r2, r6 371 372 @ CHECK: lsrs r2, r6 @ encoding: [0xf2,0x40] 373 374 375 @------------------------------------------------------------------------------ 376 @ MOV (immediate) 377 @------------------------------------------------------------------------------ 378 movs r2, #0 379 movs r2, #255 380 movs r2, #23 381 382 @ CHECK: movs r2, #0 @ encoding: [0x00,0x22] 383 @ CHECK: movs r2, #255 @ encoding: [0xff,0x22] 384 @ CHECK: movs r2, #23 @ encoding: [0x17,0x22] 385 386 387 @------------------------------------------------------------------------------ 388 @ MOV (register) 389 @------------------------------------------------------------------------------ 390 mov r3, r4 391 movs r1, r3 392 393 @ CHECK: mov r3, r4 @ encoding: [0x23,0x46] 394 @ CHECK: movs r1, r3 @ encoding: [0x19,0x00] 395 396 397 @------------------------------------------------------------------------------ 398 @ MUL 399 @------------------------------------------------------------------------------ 400 muls r1, r2, r1 401 muls r2, r2, r3 402 muls r3, r4 403 404 @ CHECK: muls r1, r2, r1 @ encoding: [0x51,0x43] 405 @ CHECK: muls r2, r3, r2 @ encoding: [0x5a,0x43] 406 @ CHECK: muls r3, r4, r3 @ encoding: [0x63,0x43] 407 408 409 @------------------------------------------------------------------------------ 410 @ MVN 411 @------------------------------------------------------------------------------ 412 mvns r6, r3 413 414 @ CHECK: mvns r6, r3 @ encoding: [0xde,0x43] 415 416 417 @------------------------------------------------------------------------------ 418 @ NEG 419 @------------------------------------------------------------------------------ 420 negs r3, r4 421 422 @ CHECK: rsbs r3, r4, #0 @ encoding: [0x63,0x42] 423 424 @------------------------------------------------------------------------------ 425 @ ORR 426 @------------------------------------------------------------------------------ 427 orrs r3, r4 428 429 @ CHECK-ERRORS: orrs r3, r4 @ encoding: [0x23,0x43] 430 431 432 @------------------------------------------------------------------------------ 433 @ POP 434 @------------------------------------------------------------------------------ 435 pop {r2, r3, r6} 436 437 @ CHECK: pop {r2, r3, r6} @ encoding: [0x4c,0xbc] 438 439 440 @------------------------------------------------------------------------------ 441 @ PUSH 442 @------------------------------------------------------------------------------ 443 push {r1, r2, r7} 444 445 @ CHECK: push {r1, r2, r7} @ encoding: [0x86,0xb4] 446 447 448 @------------------------------------------------------------------------------ 449 @ REV/REV16/REVSH 450 @------------------------------------------------------------------------------ 451 rev r6, r3 452 rev16 r7, r2 453 revsh r5, r1 454 455 @ CHECK: rev r6, r3 @ encoding: [0x1e,0xba] 456 @ CHECK: rev16 r7, r2 @ encoding: [0x57,0xba] 457 @ CHECK: revsh r5, r1 @ encoding: [0xcd,0xba] 458 459 460 @------------------------------------------------------------------------------ 461 @ ROR 462 @------------------------------------------------------------------------------ 463 rors r2, r7 464 465 @ CHECK: rors r2, r7 @ encoding: [0xfa,0x41] 466 467 468 @------------------------------------------------------------------------------ 469 @ RSB 470 @------------------------------------------------------------------------------ 471 rsbs r1, r3, #0 472 473 @ CHECK: rsbs r1, r3, #0 @ encoding: [0x59,0x42] 474 475 476 @------------------------------------------------------------------------------ 477 @ SBC 478 @------------------------------------------------------------------------------ 479 sbcs r4, r3 480 481 @ CHECK: sbcs r4, r3 @ encoding: [0x9c,0x41] 482 483 484 @------------------------------------------------------------------------------ 485 @ SETEND 486 @------------------------------------------------------------------------------ 487 setend be 488 setend le 489 490 @ CHECK: setend be @ encoding: [0x58,0xb6] 491 @ CHECK: setend le @ encoding: [0x50,0xb6] 492 493 494 @------------------------------------------------------------------------------ 495 @ STM 496 @------------------------------------------------------------------------------ 497 stm r1!, {r2, r6} 498 stm r1!, {r1, r2, r3, r7} 499 500 @ CHECK: stm r1!, {r2, r6} @ encoding: [0x44,0xc1] 501 @ CHECK: stm r1!, {r1, r2, r3, r7} @ encoding: [0x8e,0xc1] 502 503 504 @------------------------------------------------------------------------------ 505 @ STR (immediate) 506 @------------------------------------------------------------------------------ 507 str r2, [r7] 508 str r2, [r7, #0] 509 str r5, [r1, #4] 510 str r3, [r7, #124] 511 str r2, [sp] 512 str r3, [sp, #0] 513 str r4, [sp, #20] 514 str r5, [sp, #1020] 515 516 @ CHECK: str r2, [r7] @ encoding: [0x3a,0x60] 517 @ CHECK: str r2, [r7] @ encoding: [0x3a,0x60] 518 @ CHECK: str r5, [r1, #4] @ encoding: [0x4d,0x60] 519 @ CHECK: str r3, [r7, #124] @ encoding: [0xfb,0x67] 520 @ CHECK: str r2, [sp] @ encoding: [0x00,0x92] 521 @ CHECK: str r3, [sp] @ encoding: [0x00,0x93] 522 @ CHECK: str r4, [sp, #20] @ encoding: [0x05,0x94] 523 @ CHECK: str r5, [sp, #1020] @ encoding: [0xff,0x95] 524 525 526 @------------------------------------------------------------------------------ 527 @ STR (register) 528 @------------------------------------------------------------------------------ 529 str r2, [r7, r3] 530 531 @ CHECK: str r2, [r7, r3] @ encoding: [0xfa,0x50] 532 533 534 @------------------------------------------------------------------------------ 535 @ STRB (immediate) 536 @------------------------------------------------------------------------------ 537 strb r4, [r3] 538 strb r5, [r6, #0] 539 strb r6, [r7, #31] 540 541 @ CHECK: strb r4, [r3] @ encoding: [0x1c,0x70] 542 @ CHECK: strb r5, [r6] @ encoding: [0x35,0x70] 543 @ CHECK: strb r6, [r7, #31] @ encoding: [0xfe,0x77] 544 545 546 @------------------------------------------------------------------------------ 547 @ STRB (register) 548 @------------------------------------------------------------------------------ 549 strb r6, [r4, r5] 550 551 @ CHECK: strb r6, [r4, r5] @ encoding: [0x66,0x55] 552 553 554 @------------------------------------------------------------------------------ 555 @ STRH (immediate) 556 @------------------------------------------------------------------------------ 557 strh r3, [r3] 558 strh r4, [r6, #2] 559 strh r5, [r7, #62] 560 561 @ CHECK: strh r3, [r3] @ encoding: [0x1b,0x80] 562 @ CHECK: strh r4, [r6, #2] @ encoding: [0x74,0x80] 563 @ CHECK: strh r5, [r7, #62] @ encoding: [0xfd,0x87] 564 565 566 @------------------------------------------------------------------------------ 567 @ STRH (register) 568 @------------------------------------------------------------------------------ 569 strh r6, [r2, r6] 570 571 @ CHECK: strh r6, [r2, r6] @ encoding: [0x96,0x53] 572 573 574 @------------------------------------------------------------------------------ 575 @ SUB (immediate) 576 @------------------------------------------------------------------------------ 577 subs r1, r2, #3 578 subs r2, #3 579 subs r2, #8 580 581 @ CHECK: subs r1, r2, #3 @ encoding: [0xd1,0x1e] 582 @ CHECK: subs r2, #3 @ encoding: [0x03,0x3a] 583 @ CHECK: subs r2, #8 @ encoding: [0x08,0x3a] 584 585 586 @------------------------------------------------------------------------------ 587 @ SUB (SP minus immediate) 588 @------------------------------------------------------------------------------ 589 sub sp, #12 590 sub sp, sp, #508 591 592 @ CHECK: sub sp, #12 @ encoding: [0x83,0xb0] 593 @ CHECK: sub sp, #508 @ encoding: [0xff,0xb0] 594 595 596 @------------------------------------------------------------------------------ 597 @ SUB (register) 598 @------------------------------------------------------------------------------ 599 subs r1, r2, r3 600 601 @ CHECK: subs r1, r2, r3 @ encoding: [0xd1,0x1a] 602 603 604 @------------------------------------------------------------------------------ 605 @ SVC 606 @------------------------------------------------------------------------------ 607 svc #0 608 svc #255 609 610 @ CHECK: svc #0 @ encoding: [0x00,0xdf] 611 @ CHECK: svc #255 @ encoding: [0xff,0xdf] 612 613 614 @------------------------------------------------------------------------------ 615 @ SXTB/SXTH 616 @------------------------------------------------------------------------------ 617 sxtb r3, r5 618 sxth r3, r5 619 620 @ CHECK: sxtb r3, r5 @ encoding: [0x6b,0xb2] 621 @ CHECK: sxth r3, r5 @ encoding: [0x2b,0xb2] 622 623 624 @------------------------------------------------------------------------------ 625 @ TST 626 @------------------------------------------------------------------------------ 627 tst r6, r1 628 629 @ CHECK: tst r6, r1 @ encoding: [0x0e,0x42] 630 631 632 @------------------------------------------------------------------------------ 633 @ UXTB/UXTH 634 @------------------------------------------------------------------------------ 635 uxtb r7, r2 636 uxth r1, r4 637 638 @ CHECK: uxtb r7, r2 @ encoding: [0xd7,0xb2] 639 @ CHECK: uxth r1, r4 @ encoding: [0xa1,0xb2] 640 641 642