Compiler projects using llvm
# RUN: llvm-mc -triple=thumbv6-apple-darwin -disassemble -show-encoding < %s | FileCheck %s

#------------------------------------------------------------------------------
# ADC (register)
#------------------------------------------------------------------------------
# CHECK: adcs r4, r6

0x74 0x41


#------------------------------------------------------------------------------
# ADD (immediate)
#------------------------------------------------------------------------------
# CHECK: adds r1, r2, #3
# CHECK: adds r2, r2, #3
# CHECK: adds r2, #8

0xd1 0x1c
0xd2 0x1c
0x08 0x32

#------------------------------------------------------------------------------
# ADD (register)
#------------------------------------------------------------------------------
# CHECK: adds r1, r2, r3
# CHECK: add r2, r8

0xd1 0x18
0x42 0x44

#------------------------------------------------------------------------------
# ADD (SP plus immediate)
#------------------------------------------------------------------------------
# CHECK: add sp, #508
# CHECK: add sp, #4
# CHECK: add r2, sp, #8
# CHECK: add r2, sp, #1020

0x7f 0xb0
0x01 0xb0
0x02 0xaa
0xff 0xaa


#------------------------------------------------------------------------------
# ADD (SP plus register)
#------------------------------------------------------------------------------
# CHECK: add sp, r3
# CHECK: add r2, sp, r2

0x9d 0x44
0x6a 0x44

#------------------------------------------------------------------------------
# ADR
#------------------------------------------------------------------------------
# CHECK: adr    r5, #0
# CHECK: adr    r2, #12
# CHECK: adr    r3, #1020
0x00 0xa5
0x03 0xa2
0xff 0xa3

#------------------------------------------------------------------------------
# ASR (immediate)
#------------------------------------------------------------------------------
# CHECK: asrs r2, r3, #32
# CHECK: asrs r2, r3, #5
# CHECK: asrs r2, r3, #1

0x1a 0x10
0x5a 0x11
0x5a 0x10

#------------------------------------------------------------------------------
# ASR (register)
#------------------------------------------------------------------------------
# CHECK: asrs r5, r2

0x15 0x41

#------------------------------------------------------------------------------
# BICS
#------------------------------------------------------------------------------
# CHECK: bics r1, r6

0xb1 0x43

#------------------------------------------------------------------------------
# B
#------------------------------------------------------------------------------
# CHECK: bls     #128                    @ encoding: [0x40,0xd9]
# CHECK: beq     #-256                   @ encoding: [0x80,0xd0]

0x40 0xd9
0x80 0xd0

#------------------------------------------------------------------------------
# BKPT
#------------------------------------------------------------------------------
# CHECK: bkpt #0
# CHECK: bkpt #255

0x00 0xbe
0xff 0xbe

#------------------------------------------------------------------------------
# BLX (register)
#------------------------------------------------------------------------------
# CHECK: blx r4

0xa0 0x47

#------------------------------------------------------------------------------
# BX
#------------------------------------------------------------------------------
# CHECK: bx r2

0x10 0x47

#------------------------------------------------------------------------------
# CMN
#------------------------------------------------------------------------------
# CHECK: cmn r5, r1

0xcd 0x42

#------------------------------------------------------------------------------
# CMP
#------------------------------------------------------------------------------
# CHECK: cmp r6, #32
# CHECK: cmp r3, r4
# CHECK: cmp r8, r1

0x20 0x2e
0xa3 0x42
0x88 0x45

#------------------------------------------------------------------------------
# EOR
#------------------------------------------------------------------------------
# CHECK: eors r4, r5

0x6c 0x40

#------------------------------------------------------------------------------
# LDM
#------------------------------------------------------------------------------
# CHECK: ldm r3, {r0, r1, r2, r3, r4, r5, r6, r7}
# CHECK: ldm r2!, {r1, r3, r4, r5, r7}
# CHECK: ldm r1, {r1}

0xff 0xcb
0xba 0xca
0x02 0xc9


#------------------------------------------------------------------------------
# LDR (immediate)
#------------------------------------------------------------------------------
# CHECK: ldr r1, [r5]
# CHECK: ldr r2, [r6, #32]
# CHECK: ldr r3, [r7, #124]
# CHECK: ldr r1, [sp]
# CHECK: ldr r2, [sp, #24]
# CHECK: ldr r3, [sp, #1020]
# CHECK: ldr r1, [pc, #12]


0x29 0x68
0x32 0x6a
0xfb 0x6f
0x00 0x99
0x06 0x9a
0xff 0x9b
0x03 0x49

#------------------------------------------------------------------------------
# LDR (register)
#------------------------------------------------------------------------------
# CHECK: ldr r1, [r2, r3]

0xd1 0x58


#------------------------------------------------------------------------------
# LDRB (immediate)
#------------------------------------------------------------------------------
# CHECK: ldrb r4, [r3]
# CHECK: ldrb r5, [r6]
# CHECK: ldrb r6, [r7, #31]

0x1c 0x78
0x35 0x78
0xfe 0x7f


#------------------------------------------------------------------------------
# LDRB (register)
#------------------------------------------------------------------------------
# CHECK: ldrb r6, [r4, r5]

0x66 0x5d


#------------------------------------------------------------------------------
# LDRH (immediate)
#------------------------------------------------------------------------------
# CHECK: ldrh r3, [r3]
# CHECK: ldrh r4, [r6, #2]
# CHECK: ldrh r5, [r7, #62]

0x1b 0x88
0x74 0x88
0xfd 0x8f

#------------------------------------------------------------------------------
# LDRH (register)
#------------------------------------------------------------------------------
# CHECK: ldrh r6, [r2, r6]

0x96 0x5b


#------------------------------------------------------------------------------
# LDRSB/LDRSH
#------------------------------------------------------------------------------
# CHECK: ldrsb r6, [r2, r6]
# CHECK: ldrsh r3, [r7, r1]

0x96 0x57
0x7b 0x5e

#------------------------------------------------------------------------------
# LSL (immediate)
#------------------------------------------------------------------------------
# CHECK: movs r4, r5
# CHECK: lsls r4, r5, #4

0x2c 0x00
0x2c 0x01


#------------------------------------------------------------------------------
# LSL (register)
#------------------------------------------------------------------------------
# CHECK: lsls r2, r6

0xb2 0x40


#------------------------------------------------------------------------------
# LSR (immediate)
#------------------------------------------------------------------------------
# CHECK: lsrs r1, r3, #1
# CHECK: lsrs r1, r3, #32

0x59 0x08
0x19 0x08


#------------------------------------------------------------------------------
# LSR (register)
#------------------------------------------------------------------------------
# CHECK: lsrs r2, r6

0xf2 0x40

#------------------------------------------------------------------------------
# MOV (immediate)
#------------------------------------------------------------------------------
# CHECK: movs r2, #0
# CHECK: movs r2, #255
# CHECK: movs r2, #23

0x00 0x22
0xff 0x22
0x17 0x22


#------------------------------------------------------------------------------
# MOV (register)
#------------------------------------------------------------------------------
# CHECK: mov r3, r4
# CHECK: movs r1, r3
# CHECK: mov r8, r8

0x23 0x46
0x19 0x00
0xc0 0x46


#------------------------------------------------------------------------------
# MUL
#------------------------------------------------------------------------------
# CHECK: muls r1, r2, r1
# CHECK: muls r3, r4

0x51 0x43
0x63 0x43


#------------------------------------------------------------------------------
# MVN
#------------------------------------------------------------------------------
# CHECK: mvns r6, r3

0xde 0x43

#------------------------------------------------------------------------------
# NEG
#------------------------------------------------------------------------------
# CHECK: rsbs r3, r4, #0

0x63 0x42


#------------------------------------------------------------------------------
# ORR
#------------------------------------------------------------------------------
# CHECK: orrs  r3, r4

0x23 0x43

#------------------------------------------------------------------------------
# POP
#------------------------------------------------------------------------------
# CHECK: pop {r2, r3, r6}

0x4c 0xbc


#------------------------------------------------------------------------------
# PUSH
#------------------------------------------------------------------------------
# CHECK: push {r1, r2, r7}

0x86 0xb4


#------------------------------------------------------------------------------
# REV/REV16/REVSH
#------------------------------------------------------------------------------
# CHECK: rev r6, r3
# CHECK: rev16 r7, r2
# CHECK: revsh r5, r1

0x1e 0xba
0x57 0xba
0xcd 0xba


#------------------------------------------------------------------------------
# ROR
#------------------------------------------------------------------------------
# CHECK: rors r2, r7

0xfa 0x41

#------------------------------------------------------------------------------
# RSB
#------------------------------------------------------------------------------
# CHECK: rsbs r1, r3, #0

0x59 0x42


#------------------------------------------------------------------------------
# SBC
#------------------------------------------------------------------------------
# CHECK: sbcs r4, r3

0x9c 0x41


#------------------------------------------------------------------------------
# SETEND
#------------------------------------------------------------------------------
# CHECK: setend be
# CHECK: setend le

0x58 0xb6
0x50 0xb6

#------------------------------------------------------------------------------
# STM
#------------------------------------------------------------------------------
# CHECK: stm r1!, {r2, r6}
# CHECK: stm r1!, {r1, r2, r3, r7}

0x44 0xc1
0x8e 0xc1


#------------------------------------------------------------------------------
# STR (immediate)
#------------------------------------------------------------------------------
# CHECK: str r2, [r7]
# CHECK: str r2, [r7]
# CHECK: str r5, [r1, #4]
# CHECK: str r3, [r7, #124]
# CHECK: str r2, [sp]
# CHECK: str r3, [sp]
# CHECK: str r4, [sp, #20]
# CHECK: str r5, [sp, #1020]

0x3a 0x60
0x3a 0x60
0x4d 0x60
0xfb 0x67
0x00 0x92
0x00 0x93
0x05 0x94
0xff 0x95


#------------------------------------------------------------------------------
# STR (register)
#------------------------------------------------------------------------------
# CHECK: str r2, [r7, r3]

0xfa 0x50


#------------------------------------------------------------------------------
# STRB (immediate)
#------------------------------------------------------------------------------
# CHECK: strb r4, [r3]
# CHECK: strb r5, [r6]
# CHECK: strb r6, [r7, #31]

0x1c 0x70
0x35 0x70
0xfe 0x77


#------------------------------------------------------------------------------
# STRB (register)
#------------------------------------------------------------------------------
# CHECK: strb r6, [r4, r5]

0x66 0x55


#------------------------------------------------------------------------------
# STRH (immediate)
#------------------------------------------------------------------------------
# CHECK: strh r3, [r3]
# CHECK: strh r4, [r6, #2]
# CHECK: strh r5, [r7, #62]

0x1b 0x80
0x74 0x80
0xfd 0x87


#------------------------------------------------------------------------------
# STRH (register)
#------------------------------------------------------------------------------
# CHECK: strh r6, [r2, r6]

0x96 0x53


#------------------------------------------------------------------------------
# SUB (immediate)
#------------------------------------------------------------------------------
# CHECK: subs r1, r2, #3
# CHECK: subs r2, #3
# CHECK: subs r2, #8

0xd1 0x1e
0x03 0x3a
0x08 0x3a

#------------------------------------------------------------------------------
# SUB (register)
#------------------------------------------------------------------------------
# CHECK: subs r1, r2, r3

0xd1 0x1a

#------------------------------------------------------------------------------
# SUB (SP minus immediate)
#------------------------------------------------------------------------------
# CHECK: sub sp, #12
# CHECK: sub sp, #508

0x83 0xb0
0xff 0xb0

#------------------------------------------------------------------------------
# SVC
#------------------------------------------------------------------------------
# CHECK: svc #0
# CHECK: svc #255

0x00 0xdf
0xff 0xdf


#------------------------------------------------------------------------------
# SXTB/SXTH
#------------------------------------------------------------------------------
# CHECK: sxtb r3, r5
# CHECK: sxth r3, r5

0x6b 0xb2
0x2b 0xb2


#------------------------------------------------------------------------------
# TST
#------------------------------------------------------------------------------
# CHECK: tst r6, r1

0x0e 0x42


#------------------------------------------------------------------------------
# UXTB/UXTH
#------------------------------------------------------------------------------
# CHECK: uxtb  r7, r2
# CHECK: uxth  r1, r4

0xd7 0xb2
0xa1 0xb2