According to the description of the psABI v2.20: https://github.com/loongson/la-abi-specs/releases/tag/v2.20, adjustments are made to the function call instructions under the medium code model. At the same time, AsmParser has already supported parsing the call36 and tail36 macro instructions.
94 lines
4.0 KiB
ArmAsm
94 lines
4.0 KiB
ArmAsm
## Test invalid instructions on loongarch64 target.
|
|
|
|
# RUN: not llvm-mc --triple=loongarch64 %s 2>&1 | FileCheck %s
|
|
|
|
## Out of range immediates
|
|
## uimm2_plus1
|
|
alsl.wu $a0, $a0, $a0, 0
|
|
# CHECK: :[[#@LINE-1]]:24: error: immediate must be an integer in the range [1, 4]
|
|
alsl.d $a0, $a0, $a0, 5
|
|
# CHECK: :[[#@LINE-1]]:23: error: immediate must be an integer in the range [1, 4]
|
|
|
|
## uimm3
|
|
bytepick.d $a0, $a0, $a0, -1
|
|
# CHECK: :[[#@LINE-1]]:27: error: immediate must be an integer in the range [0, 7]
|
|
bytepick.d $a0, $a0, $a0, 8
|
|
# CHECK: :[[#@LINE-1]]:27: error: immediate must be an integer in the range [0, 7]
|
|
|
|
## uimm6
|
|
slli.d $a0, $a0, -1
|
|
# CHECK: :[[#@LINE-1]]:18: error: immediate must be an integer in the range [0, 63]
|
|
srli.d $a0, $a0, -1
|
|
# CHECK: :[[#@LINE-1]]:18: error: immediate must be an integer in the range [0, 63]
|
|
srai.d $a0, $a0, 64
|
|
# CHECK: :[[#@LINE-1]]:18: error: immediate must be an integer in the range [0, 63]
|
|
rotri.d $a0, $a0, 64
|
|
# CHECK: :[[#@LINE-1]]:19: error: immediate must be an integer in the range [0, 63]
|
|
bstrins.d $a0, $a0, 63, -1
|
|
# CHECK: :[[#@LINE-1]]:25: error: immediate must be an integer in the range [0, 63]
|
|
bstrpick.d $a0, $a0, 64, 0
|
|
# CHECK: :[[#@LINE-1]]:22: error: immediate must be an integer in the range [0, 63]
|
|
|
|
## simm12_addlike
|
|
addi.d $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.wu $a0, $a0, 2048
|
|
# 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.d $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.d $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]
|
|
|
|
## simm12_lu52id
|
|
lu52i.d $a0, $a0, 2048
|
|
# CHECK-LA64: :[[#@LINE-1]]:19: error: operand must be a symbol with modifier (e.g. %pc64_hi12) or an integer in the range [-2048, 2047]
|
|
|
|
## simm14_lsl2
|
|
ldptr.w $a0, $a0, -32772
|
|
# CHECK: :[[#@LINE-1]]:19: error: immediate must be a multiple of 4 in the range [-32768, 32764]
|
|
ldptr.d $a0, $a0, -32772
|
|
# CHECK: :[[#@LINE-1]]:19: error: immediate must be a multiple of 4 in the range [-32768, 32764]
|
|
stptr.w $a0, $a0, -32769
|
|
# CHECK: :[[#@LINE-1]]:19: error: immediate must be a multiple of 4 in the range [-32768, 32764]
|
|
stptr.d $a0, $a0, -32769
|
|
# CHECK: :[[#@LINE-1]]:19: error: immediate must be a multiple of 4 in the range [-32768, 32764]
|
|
ll.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
|
|
addu16i.d $a0, $a0, -32769
|
|
# CHECK: :[[#@LINE-1]]:21: error: immediate must be an integer in the range [-32768, 32767]
|
|
addu16i.d $a0, $a0, 32768
|
|
# CHECK: :[[#@LINE-1]]:21: error: immediate must be an integer in the range [-32768, 32767]
|
|
|
|
## simm20
|
|
pcaddu18i $a0, 0x80000
|
|
# CHECK: :[[#@LINE-1]]:16: error: operand must be a symbol with modifier (e.g. %call36) or an integer in the range [-524288, 524287]
|
|
|
|
## simm20_lu32id
|
|
lu32i.d $a0, 0x80000
|
|
# CHECK-LA64: :[[#@LINE-1]]:14: error: operand must be a symbol with modifier (e.g. %abs64_lo20) or an integer in the range [-524288, 524287]
|
|
|
|
## msbd < lsbd
|
|
# CHECK: :[[#@LINE+1]]:21: error: msb is less than lsb
|
|
bstrins.d $a0, $a0, 1, 2
|
|
# CHECK: ^~~~
|
|
|
|
# CHECK: :[[#@LINE+1]]:22: error: msb is less than lsb
|
|
bstrpick.d $a0, $a0, 32, 63
|
|
# CHECK: ^~~~~~
|
|
|
|
# CHECK: :[[#@LINE+1]]:10: error: $rd must be different from both $rk and $rj
|
|
amadd.d $a0, $a0, $a0
|
|
# CHECK: :[[#@LINE+1]]:10: error: $rd must be different from both $rk and $rj
|
|
ammin.w $a0, $a0, $a1
|
|
# CHECK: :[[#@LINE+1]]:10: error: $rd must be different from both $rk and $rj
|
|
amxor.w $a0, $a1, $a0
|
|
|
|
# CHECK: :[[#@LINE+1]]:24: error: expected optional integer offset
|
|
amadd.d $a0, $a1, $a2, $a3
|
|
# CHECK: :[[#@LINE+1]]:24: error: optional integer offset must be 0
|
|
amadd.d $a0, $a1, $a2, 1
|