mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
2bb5aba324
expressions for mov instructions instead of silently truncating by default. For the ARM assembler, we want to avoid misleadingly allowing something like "mov r0, <symbol>" especially when we turn it into a movw and the expression <symbol> does not have a :lower16: or :upper16" as part of the expression. We don't want the behavior of silently truncating, which can be unexpected and lead to bugs that are difficult to find since this is an easy mistake to make. This does change the previous behavior of llvm but actually matches an older gnu assembler that would not allow this but print less useful errors of like “invalid constant (0x927c0) after fixup” and “unsupported relocation on symbol foo”. The error for llvm is "immediate expression for mov requires :lower16: or :upper16" with correct location information on the operand as shown in the added test cases. rdar://12342160 llvm-svn: 206669
84 lines
2.8 KiB
ArmAsm
84 lines
2.8 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
|
|
|
|
foo2:
|
|
mov r0, foo2
|
|
movw r0, foo2
|
|
movt r0, foo2
|
|
@ CHECK-ERRORS: error: immediate expression for mov requires :lower16: or :upper16
|
|
@ CHECK-ERRORS: ^
|
|
@ CHECK-ERRORS: error: immediate expression for mov requires :lower16: or :upper16
|
|
@ CHECK-ERRORS: ^
|
|
@ CHECK-ERRORS: error: immediate expression for mov requires :lower16: or :upper16
|
|
@ CHECK-ERRORS: ^
|