mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-29 10:32:47 +00:00
e921f32353
The long encoding for Thumb2 unconditional branches is broken. Additionally, there is no range checking for target operands; as such for instructions originating in assembly code, only short Thumb encodings are generated, regardless of the bitsize needed for the offset. Adding range checking is non trivial due to the representation of Thumb branch instructions. There is no true difference between conditional and unconditional branches in terms of operands and syntax - even unconditional branches have a predicate which is expected to match that of the IT block they are in. Yet, the encodings and the permitted size of the offset differ. Due to this, for any mnemonic there are really 4 encodings to choose for. The problem cannot be handled in the parser alone or by manipulating td files. Because the parser builds first a set of match candidates and then checks them one by one, whatever tablegen-only solution might be found will ultimately be dependent of the parser's evaluation order. What's worse is that due to the fact that all branches have the same syntax and the same kinds of operands, that order is governed by the lexicographical ordering of the names of operand classes... To circumvent all this, any necessary disambiguation is added to the instruction validation pass. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@188067 91177308-0d34-0410-b5e6-96231b3b80d8
73 lines
2.4 KiB
ArmAsm
73 lines
2.4 KiB
ArmAsm
@ RUN: not llvm-mc -triple=thumbv7-apple-darwin < %s 2> %t
|
|
@ RUN: FileCheck --check-prefix=CHECK-ERRORS < %t %s
|
|
|
|
@ Ill-formed IT block instructions.
|
|
itet eq
|
|
addle r0, r1, r2
|
|
nop
|
|
it le
|
|
iteeee gt
|
|
ittfe le
|
|
nopeq
|
|
|
|
@ CHECK-ERRORS: error: incorrect condition in IT block; got 'le', but expected 'eq'
|
|
@ CHECK-ERRORS: addle r0, r1, r2
|
|
@ CHECK-ERRORS: ^
|
|
@ CHECK-ERRORS: error: incorrect condition in IT block; got 'al', but expected 'ne'
|
|
@ CHECK-ERRORS: nop
|
|
@ CHECK-ERRORS: ^
|
|
@ CHECK-ERRORS: error: instructions in IT block must be predicable
|
|
@ CHECK-ERRORS: it le
|
|
@ CHECK-ERRORS: ^
|
|
@ CHECK-ERRORS: error: too many conditions on IT instruction
|
|
@ CHECK-ERRORS: iteeee gt
|
|
@ CHECK-ERRORS: ^
|
|
@ CHECK-ERRORS: error: illegal IT block condition mask 'tfe'
|
|
@ CHECK-ERRORS: ittfe le
|
|
@ CHECK-ERRORS: ^
|
|
@ CHECK-ERRORS: error: predicated instructions must be in IT block
|
|
@ CHECK-ERRORS: nopeq
|
|
@ CHECK-ERRORS: ^
|
|
|
|
@ Out of range immediates for MRC/MRC2/MRRC/MRRC2
|
|
mrc p14, #8, r1, c1, c2, #4
|
|
mrc p14, #1, r1, c1, c2, #8
|
|
mrc2 p14, #8, r1, c1, c2, #4
|
|
mrc2 p14, #0, r1, c1, c2, #9
|
|
mrrc p7, #16, r5, r4, c1
|
|
mrrc2 p7, #17, r5, r4, c1
|
|
@ CHECK-ERRORS: error: invalid operand for instruction
|
|
@ CHECK-ERRORS: error: invalid operand for instruction
|
|
@ CHECK-ERRORS: error: invalid operand for instruction
|
|
@ CHECK-ERRORS: error: invalid operand for instruction
|
|
@ CHECK-ERRORS: error: immediate operand must be in the range [0,15]
|
|
@ CHECK-ERRORS: error: immediate operand must be in the range [0,15]
|
|
|
|
isb #-1
|
|
isb #16
|
|
@ CHECK-ERRORS: error: immediate value out of range
|
|
@ CHECK-ERRORS: error: immediate value out of range
|
|
|
|
itt eq
|
|
bkpteq #1
|
|
@ CHECK-ERRORS: error: instruction 'bkpt' is not predicable, but condition code specified
|
|
|
|
nopeq
|
|
nopeq
|
|
|
|
@ out of range operands for Thumb2 targets
|
|
|
|
beq.w #-1048578
|
|
bne.w #1048576
|
|
blt.w #1013411
|
|
b.w #-16777218
|
|
b.w #16777216
|
|
b.w #1592313
|
|
|
|
@ CHECK-ERRORS: error: Branch target out of range
|
|
@ CHECK-ERRORS: error: Branch target out of range
|
|
@ CHECK-ERRORS: error: Branch target out of range
|
|
@ CHECK-ERRORS: error: Branch target out of range
|
|
@ CHECK-ERRORS: error: Branch target out of range
|
|
@ CHECK-ERRORS: error: Branch target out of range
|