194 lines
8.9 KiB
ArmAsm
194 lines
8.9 KiB
ArmAsm
|
## Test invalid instructions on both loongarch32 and loongarch64 target.
|
||
|
|
||
|
# RUN: not llvm-mc --triple=loongarch32 %s 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK64
|
||
|
# RUN: not llvm-mc --triple=loongarch64 %s 2>&1 --defsym=LA64=1 | FileCheck %s
|
||
|
|
||
|
## Out of range immediates
|
||
|
## uimm2
|
||
|
bytepick.w $a0, $a0, $a0, -1
|
||
|
# CHECK: :[[#@LINE-1]]:27: error: immediate must be an integer in the range [0, 3]
|
||
|
bytepick.w $a0, $a0, $a0, 4
|
||
|
# CHECK: :[[#@LINE-1]]:27: error: immediate must be an integer in the range [0, 3]
|
||
|
|
||
|
## uimm2_plus1
|
||
|
alsl.w $a0, $a0, $a0, 0
|
||
|
# CHECK: :[[#@LINE-1]]:23: error: immediate must be an integer in the range [1, 4]
|
||
|
alsl.w $a0, $a0, $a0, 5
|
||
|
# CHECK: :[[#@LINE-1]]:23: error: immediate must be an integer in the range [1, 4]
|
||
|
|
||
|
## uimm5
|
||
|
slli.w $a0, $a0, -1
|
||
|
# CHECK: :[[#@LINE-1]]:18: error: immediate must be an integer in the range [0, 31]
|
||
|
srli.w $a0, $a0, -1
|
||
|
# CHECK: :[[#@LINE-1]]:18: error: immediate must be an integer in the range [0, 31]
|
||
|
srai.w $a0, $a0, 32
|
||
|
# CHECK: :[[#@LINE-1]]:18: error: immediate must be an integer in the range [0, 31]
|
||
|
rotri.w $a0, $a0, 32
|
||
|
# CHECK: :[[#@LINE-1]]:19: error: immediate must be an integer in the range [0, 31]
|
||
|
bstrins.w $a0, $a0, 31, -1
|
||
|
# CHECK: :[[#@LINE-1]]:25: error: immediate must be an integer in the range [0, 31]
|
||
|
bstrpick.w $a0, $a0, 32, 0
|
||
|
# CHECK: :[[#@LINE-1]]:22: error: immediate must be an integer in the range [0, 31]
|
||
|
preld -1, $a0, 0
|
||
|
# CHECK: :[[#@LINE-1]]:7: error: immediate must be an integer in the range [0, 31]
|
||
|
preld 32, $a0, 0
|
||
|
# CHECK: :[[#@LINE-1]]:7: error: immediate must be an integer in the range [0, 31]
|
||
|
|
||
|
## uimm12
|
||
|
andi $a0, $a0, -1
|
||
|
# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [0, 4095]
|
||
|
xori $a0, $a0, 4096
|
||
|
# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [0, 4095]
|
||
|
|
||
|
## uimm12_ori
|
||
|
ori $a0, $a0, 4096
|
||
|
# CHECK: :[[#@LINE-1]]:15: error: operand must be a symbol with modifier (e.g. %abs_lo12) or an integer in the range [0, 4095]
|
||
|
|
||
|
## simm12
|
||
|
slti $a0, $a0, -2049
|
||
|
# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-2048, 2047]
|
||
|
sltui $a0, $a0, 2048
|
||
|
# CHECK: :[[#@LINE-1]]:17: error: immediate must be an integer in the range [-2048, 2047]
|
||
|
preld 0, $a0, 2048
|
||
|
# CHECK: :[[#@LINE-1]]:15: error: immediate must be an integer in the range [-2048, 2047]
|
||
|
|
||
|
## simm12_addlike
|
||
|
addi.w $a0, $a0, -2049
|
||
|
# CHECK: :[[#@LINE-1]]:18: error: operand must be a symbol with modifier (e.g. %pc_lo12) or an integer in the range [-2048, 2047]
|
||
|
ld.b $a0, $a0, 2048
|
||
|
# CHECK: :[[#@LINE-1]]:16: error: operand must be a symbol with modifier (e.g. %pc_lo12) or an integer in the range [-2048, 2047]
|
||
|
ld.h $a0, $a0, 2048
|
||
|
# CHECK: :[[#@LINE-1]]:16: error: operand must be a symbol with modifier (e.g. %pc_lo12) or an integer in the range [-2048, 2047]
|
||
|
ld.w $a0, $a0, 2048
|
||
|
# CHECK: :[[#@LINE-1]]:16: error: operand must be a symbol with modifier (e.g. %pc_lo12) or an integer in the range [-2048, 2047]
|
||
|
ld.bu $a0, $a0, -2049
|
||
|
# CHECK: :[[#@LINE-1]]:17: error: operand must be a symbol with modifier (e.g. %pc_lo12) or an integer in the range [-2048, 2047]
|
||
|
ld.hu $a0, $a0, -2049
|
||
|
# CHECK: :[[#@LINE-1]]:17: error: operand must be a symbol with modifier (e.g. %pc_lo12) or an integer in the range [-2048, 2047]
|
||
|
st.b $a0, $a0, 2048
|
||
|
# CHECK: :[[#@LINE-1]]:16: error: operand must be a symbol with modifier (e.g. %pc_lo12) or an integer in the range [-2048, 2047]
|
||
|
st.h $a0, $a0, 2048
|
||
|
# CHECK: :[[#@LINE-1]]:16: error: operand must be a symbol with modifier (e.g. %pc_lo12) or an integer in the range [-2048, 2047]
|
||
|
st.w $a0, $a0, -2049
|
||
|
# CHECK: :[[#@LINE-1]]:16: error: operand must be a symbol with modifier (e.g. %pc_lo12) or an integer in the range [-2048, 2047]
|
||
|
|
||
|
## simm14_lsl2
|
||
|
ll.w $a0, $a0, -32772
|
||
|
# CHECK: :[[#@LINE-1]]:16: error: immediate must be a multiple of 4 in the range [-32768, 32764]
|
||
|
ll.w $a0, $a0, -32769
|
||
|
# CHECK: :[[#@LINE-1]]:16: error: immediate must be a multiple of 4 in the range [-32768, 32764]
|
||
|
sc.w $a0, $a0, 32767
|
||
|
# CHECK: :[[#@LINE-1]]:16: error: immediate must be a multiple of 4 in the range [-32768, 32764]
|
||
|
sc.w $a0, $a0, 32768
|
||
|
# CHECK: :[[#@LINE-1]]:16: error: immediate must be a multiple of 4 in the range [-32768, 32764]
|
||
|
|
||
|
## simm16_lsl2
|
||
|
beq $a0, $a0, -0x20004
|
||
|
# CHECK: :[[#@LINE-1]]:15: error: operand must be a symbol with modifier (e.g. %b16) or an integer in the range [-131072, 131068]
|
||
|
bne $a0, $a0, -0x20004
|
||
|
# CHECK: :[[#@LINE-1]]:15: error: operand must be a symbol with modifier (e.g. %b16) or an integer in the range [-131072, 131068]
|
||
|
blt $a0, $a0, -0x1FFFF
|
||
|
# CHECK: :[[#@LINE-1]]:15: error: operand must be a symbol with modifier (e.g. %b16) or an integer in the range [-131072, 131068]
|
||
|
bge $a0, $a0, -0x1FFFF
|
||
|
# CHECK: :[[#@LINE-1]]:15: error: operand must be a symbol with modifier (e.g. %b16) or an integer in the range [-131072, 131068]
|
||
|
bltu $a0, $a0, 0x1FFFF
|
||
|
# CHECK: :[[#@LINE-1]]:16: error: operand must be a symbol with modifier (e.g. %b16) or an integer in the range [-131072, 131068]
|
||
|
bgeu $a0, $a0, 0x1FFFF
|
||
|
# CHECK: :[[#@LINE-1]]:16: error: operand must be a symbol with modifier (e.g. %b16) or an integer in the range [-131072, 131068]
|
||
|
jirl $a0, $a0, 0x20000
|
||
|
# CHECK: :[[#@LINE-1]]:16: error: operand must be a symbol with modifier (e.g. %b16) or an integer in the range [-131072, 131068]
|
||
|
|
||
|
## simm20
|
||
|
pcaddi $a0, -0x80001
|
||
|
# CHECK: :[[#@LINE-1]]:13: error: immediate must be an integer in the range [-524288, 524287]
|
||
|
pcaddu12i $a0, 0x80000
|
||
|
# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-524288, 524287]
|
||
|
|
||
|
## simm20_lu12iw
|
||
|
lu12i.w $a0, -0x80001
|
||
|
# CHECK: :[[#@LINE-1]]:14: error: operand must be a symbol with modifier (e.g. %abs_hi20) or an integer in the range [-524288, 524287]
|
||
|
|
||
|
## simm20_pcalau12i
|
||
|
pcalau12i $a0, 0x80000
|
||
|
# CHECK: :[[#@LINE-1]]:16: error: operand must be a symbol with modifier (e.g. %pc_hi20) or an integer in the range [-524288, 524287]
|
||
|
|
||
|
## simm21_lsl2
|
||
|
beqz $a0, -0x400001
|
||
|
# CHECK: :[[#@LINE-1]]:11: error: operand must be a symbol with modifier (e.g. %b21) or an integer in the range [-4194304, 4194300]
|
||
|
bnez $a0, -0x3FFFFF
|
||
|
# CHECK: :[[#@LINE-1]]:11: error: operand must be a symbol with modifier (e.g. %b21) or an integer in the range [-4194304, 4194300]
|
||
|
beqz $a0, 0x3FFFFF
|
||
|
# CHECK: :[[#@LINE-1]]:11: error: operand must be a symbol with modifier (e.g. %b21) or an integer in the range [-4194304, 4194300]
|
||
|
bnez $a0, 0x400000
|
||
|
# CHECK: :[[#@LINE-1]]:11: error: operand must be a symbol with modifier (e.g. %b21) or an integer in the range [-4194304, 4194300]
|
||
|
|
||
|
## simm26_lsl2
|
||
|
b -0x8000001
|
||
|
# CHECK: :[[#@LINE-1]]:3: error: operand must be a bare symbol name or an immediate must be a multiple of 4 in the range [-134217728, 134217724]
|
||
|
b 0x1
|
||
|
# CHECK: :[[#@LINE-1]]:3: error: operand must be a bare symbol name or an immediate must be a multiple of 4 in the range [-134217728, 134217724]
|
||
|
bl 0x7FFFFFF
|
||
|
# CHECK: :[[#@LINE-1]]:4: error: operand must be a bare symbol name or an immediate must be a multiple of 4 in the range [-134217728, 134217724]
|
||
|
bl 0x8000000
|
||
|
# CHECK: :[[#@LINE-1]]:4: error: operand must be a bare symbol name or an immediate must be a multiple of 4 in the range [-134217728, 134217724]
|
||
|
|
||
|
## Invalid mnemonics
|
||
|
nori $a0, $a0, 0
|
||
|
# CHECK: :[[#@LINE-1]]:1: error: unrecognized instruction mnemonic
|
||
|
andni $a0, $a0, 0
|
||
|
# CHECK: :[[#@LINE-1]]:1: error: unrecognized instruction mnemonic
|
||
|
orni $a0, $a0, 0
|
||
|
# CHECK: :[[#@LINE-1]]:1: error: unrecognized instruction mnemonic
|
||
|
|
||
|
## Invalid register names
|
||
|
add.w $foo, $a0, $a0
|
||
|
# CHECK: :[[#@LINE-1]]:8: error: invalid operand for instruction
|
||
|
sub.w $a8, $a0, $a0
|
||
|
# CHECK: :[[#@LINE-1]]:8: error: invalid operand for instruction
|
||
|
addi.w $x0, $a0, 0
|
||
|
# CHECK: :[[#@LINE-1]]:9: error: invalid operand for instruction
|
||
|
alsl.w $t9, $a0, $a0, 1
|
||
|
# CHECK: :[[#@LINE-1]]:9: error: invalid operand for instruction
|
||
|
lu12i.w $s10, 0
|
||
|
# CHECK: :[[#@LINE-1]]:10: error: invalid operand for instruction
|
||
|
|
||
|
.ifndef LA64
|
||
|
## LoongArch64 mnemonics
|
||
|
add.d $a0, $a0, $a0
|
||
|
# CHECK64: :[[#@LINE-1]]:1: error: instruction requires the following: LA64 Basic Integer and Privilege Instruction Set
|
||
|
addi.d $a0, $a0, 0
|
||
|
# CHECK64: :[[#@LINE-1]]:1: error: instruction requires the following: LA64 Basic Integer and Privilege Instruction Set
|
||
|
.endif
|
||
|
|
||
|
## Invalid operand types
|
||
|
slt $a0, $a0, 0
|
||
|
# CHECK: :[[#@LINE-1]]:15: error: invalid operand for instruction
|
||
|
slti $a0, 0, 0
|
||
|
# CHECK: :[[#@LINE-1]]:11: error: invalid operand for instruction
|
||
|
|
||
|
## Too many operands
|
||
|
andi $a0, $a0, 0, 0
|
||
|
# CHECK: :[[#@LINE-1]]:19: error: invalid operand for instruction
|
||
|
|
||
|
## Too few operands
|
||
|
and $a0, $a0
|
||
|
# CHECK: :[[#@LINE-1]]:1: error: too few operands for instruction
|
||
|
andi $a0, $a0
|
||
|
# CHECK: :[[#@LINE-1]]:1: error: too few operands for instruction
|
||
|
|
||
|
## Instructions outside the base integer ISA
|
||
|
## TODO: Test instructions in LSX/LASX/LBT/LVZ after their introduction.
|
||
|
|
||
|
## Using floating point registers when integer registers are expected
|
||
|
sll.w $a0, $a0, $fa0
|
||
|
# CHECK: :[[#@LINE-1]]:18: error: invalid operand for instruction
|
||
|
|
||
|
## msbw < lsbw
|
||
|
# CHECK: :[[#@LINE+1]]:21: error: msb is less than lsb
|
||
|
bstrins.w $a0, $a0, 1, 2
|
||
|
# CHECK: ^~~~
|
||
|
|
||
|
# CHECK: :[[#@LINE+1]]:22: error: msb is less than lsb
|
||
|
bstrpick.w $a0, $a0, 30, 31
|
||
|
# CHECK: ^~~~~~
|