1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191
|
## Test invalid instructions on both loongarch32 and loongarch64 target.
# RUN: not llvm-mc --triple=loongarch32 --mattr=-f %s 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK64
# RUN: not llvm-mc --triple=loongarch64 --mattr=-f %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]
ori $a0, $a0, 4096
# CHECK: :[[#@LINE-1]]:15: 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]
## simm12
addi.w $a0, $a0, -2049
# CHECK: :[[#@LINE-1]]:18: error: immediate must be an integer in the range [-2048, 2047]
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]
ld.b $a0, $a0, 2048
# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-2048, 2047]
ld.h $a0, $a0, 2048
# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-2048, 2047]
ld.w $a0, $a0, 2048
# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-2048, 2047]
ld.bu $a0, $a0, -2049
# CHECK: :[[#@LINE-1]]:17: error: immediate must be an integer in the range [-2048, 2047]
ld.hu $a0, $a0, -2049
# CHECK: :[[#@LINE-1]]:17: error: immediate must be an integer in the range [-2048, 2047]
st.b $a0, $a0, 2048
# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-2048, 2047]
st.h $a0, $a0, 2048
# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-2048, 2047]
st.w $a0, $a0, -2049
# CHECK: :[[#@LINE-1]]:16: error: immediate must be 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: immediate must be a multiple of 4 in the range [-131072, 131068]
bne $a0, $a0, -0x20004
# CHECK: :[[#@LINE-1]]:15: error: immediate must be a multiple of 4 in the range [-131072, 131068]
blt $a0, $a0, -0x1FFFF
# CHECK: :[[#@LINE-1]]:15: error: immediate must be a multiple of 4 in the range [-131072, 131068]
bge $a0, $a0, -0x1FFFF
# CHECK: :[[#@LINE-1]]:15: error: immediate must be a multiple of 4 in the range [-131072, 131068]
bltu $a0, $a0, 0x1FFFF
# CHECK: :[[#@LINE-1]]:16: error: immediate must be a multiple of 4 in the range [-131072, 131068]
bgeu $a0, $a0, 0x1FFFF
# CHECK: :[[#@LINE-1]]:16: error: immediate must be a multiple of 4 in the range [-131072, 131068]
jirl $a0, $a0, 0x20000
# CHECK: :[[#@LINE-1]]:16: error: immediate must be a multiple of 4 in the range [-131072, 131068]
## simm20
lu12i.w $a0, -0x80001
# CHECK: :[[#@LINE-1]]:14: error: immediate must be an integer in the range [-524288, 524287]
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]
pcalau12i $a0, 0x80000
# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-524288, 524287]
## simm21_lsl2
beqz $a0, -0x400001
# CHECK: :[[#@LINE-1]]:11: error: immediate must be a multiple of 4 in the range [-4194304, 4194300]
bnez $a0, -0x3FFFFF
# CHECK: :[[#@LINE-1]]:11: error: immediate must be a multiple of 4 in the range [-4194304, 4194300]
beqz $a0, 0x3FFFFF
# CHECK: :[[#@LINE-1]]:11: error: immediate must be a multiple of 4 in the range [-4194304, 4194300]
bnez $a0, 0x400000
# CHECK: :[[#@LINE-1]]:11: error: immediate must be a multiple of 4 in the range [-4194304, 4194300]
## simm26_lsl2
b -0x8000001
# CHECK: :[[#@LINE-1]]:3: error: immediate must be a multiple of 4 in the range [-134217728, 134217724]
b 0x1
# CHECK: :[[#@LINE-1]]:3: error: immediate must be a multiple of 4 in the range [-134217728, 134217724]
bl 0x7FFFFFF
# CHECK: :[[#@LINE-1]]:4: error: immediate must be a multiple of 4 in the range [-134217728, 134217724]
bl 0x8000000
# CHECK: :[[#@LINE-1]]:4: error: 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.
## Floating-Point mnemonics
fadd.s $fa0, $fa0, $fa0
# CHECK: :[[#@LINE-1]]:1: error: instruction requires the following: 'F' (Single-Precision Floating-Point)
fadd.d $fa0, $fa0, $fa0
# CHECK: :[[#@LINE-1]]:1: error: instruction requires the following: 'D' (Double-Precision Floating-Point)
## 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: ^~~~~~
|