1## Test invalid instructions on both loongarch32 and loongarch64 target. 2 3# RUN: not llvm-mc --triple=loongarch32 --mattr=-f %s 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK64 4# RUN: not llvm-mc --triple=loongarch64 --mattr=-f %s 2>&1 --defsym=LA64=1 | FileCheck %s 5 6## Out of range immediates 7## uimm2 8bytepick.w $a0, $a0, $a0, -1 9# CHECK: :[[#@LINE-1]]:27: error: immediate must be an integer in the range [0, 3] 10bytepick.w $a0, $a0, $a0, 4 11# CHECK: :[[#@LINE-1]]:27: error: immediate must be an integer in the range [0, 3] 12 13## uimm2_plus1 14alsl.w $a0, $a0, $a0, 0 15# CHECK: :[[#@LINE-1]]:23: error: immediate must be an integer in the range [1, 4] 16alsl.w $a0, $a0, $a0, 5 17# CHECK: :[[#@LINE-1]]:23: error: immediate must be an integer in the range [1, 4] 18 19## uimm5 20slli.w $a0, $a0, -1 21# CHECK: :[[#@LINE-1]]:18: error: immediate must be an integer in the range [0, 31] 22srli.w $a0, $a0, -1 23# CHECK: :[[#@LINE-1]]:18: error: immediate must be an integer in the range [0, 31] 24srai.w $a0, $a0, 32 25# CHECK: :[[#@LINE-1]]:18: error: immediate must be an integer in the range [0, 31] 26rotri.w $a0, $a0, 32 27# CHECK: :[[#@LINE-1]]:19: error: immediate must be an integer in the range [0, 31] 28bstrins.w $a0, $a0, 31, -1 29# CHECK: :[[#@LINE-1]]:25: error: immediate must be an integer in the range [0, 31] 30bstrpick.w $a0, $a0, 32, 0 31# CHECK: :[[#@LINE-1]]:22: error: immediate must be an integer in the range [0, 31] 32preld -1, $a0, 0 33# CHECK: :[[#@LINE-1]]:7: error: immediate must be an integer in the range [0, 31] 34preld 32, $a0, 0 35# CHECK: :[[#@LINE-1]]:7: error: immediate must be an integer in the range [0, 31] 36 37## uimm12 38andi $a0, $a0, -1 39# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [0, 4095] 40ori $a0, $a0, 4096 41# CHECK: :[[#@LINE-1]]:15: error: immediate must be an integer in the range [0, 4095] 42xori $a0, $a0, 4096 43# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [0, 4095] 44 45## simm12 46addi.w $a0, $a0, -2049 47# CHECK: :[[#@LINE-1]]:18: error: immediate must be an integer in the range [-2048, 2047] 48slti $a0, $a0, -2049 49# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-2048, 2047] 50sltui $a0, $a0, 2048 51# CHECK: :[[#@LINE-1]]:17: error: immediate must be an integer in the range [-2048, 2047] 52preld 0, $a0, 2048 53# CHECK: :[[#@LINE-1]]:15: error: immediate must be an integer in the range [-2048, 2047] 54ld.b $a0, $a0, 2048 55# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-2048, 2047] 56ld.h $a0, $a0, 2048 57# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-2048, 2047] 58ld.w $a0, $a0, 2048 59# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-2048, 2047] 60ld.bu $a0, $a0, -2049 61# CHECK: :[[#@LINE-1]]:17: error: immediate must be an integer in the range [-2048, 2047] 62ld.hu $a0, $a0, -2049 63# CHECK: :[[#@LINE-1]]:17: error: immediate must be an integer in the range [-2048, 2047] 64st.b $a0, $a0, 2048 65# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-2048, 2047] 66st.h $a0, $a0, 2048 67# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-2048, 2047] 68st.w $a0, $a0, -2049 69# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-2048, 2047] 70 71## simm14_lsl2 72ll.w $a0, $a0, -32772 73# CHECK: :[[#@LINE-1]]:16: error: immediate must be a multiple of 4 in the range [-32768, 32764] 74ll.w $a0, $a0, -32769 75# CHECK: :[[#@LINE-1]]:16: error: immediate must be a multiple of 4 in the range [-32768, 32764] 76sc.w $a0, $a0, 32767 77# CHECK: :[[#@LINE-1]]:16: error: immediate must be a multiple of 4 in the range [-32768, 32764] 78sc.w $a0, $a0, 32768 79# CHECK: :[[#@LINE-1]]:16: error: immediate must be a multiple of 4 in the range [-32768, 32764] 80 81## simm16_lsl2 82beq $a0, $a0, -0x20004 83# CHECK: :[[#@LINE-1]]:15: error: immediate must be a multiple of 4 in the range [-131072, 131068] 84bne $a0, $a0, -0x20004 85# CHECK: :[[#@LINE-1]]:15: error: immediate must be a multiple of 4 in the range [-131072, 131068] 86blt $a0, $a0, -0x1FFFF 87# CHECK: :[[#@LINE-1]]:15: error: immediate must be a multiple of 4 in the range [-131072, 131068] 88bge $a0, $a0, -0x1FFFF 89# CHECK: :[[#@LINE-1]]:15: error: immediate must be a multiple of 4 in the range [-131072, 131068] 90bltu $a0, $a0, 0x1FFFF 91# CHECK: :[[#@LINE-1]]:16: error: immediate must be a multiple of 4 in the range [-131072, 131068] 92bgeu $a0, $a0, 0x1FFFF 93# CHECK: :[[#@LINE-1]]:16: error: immediate must be a multiple of 4 in the range [-131072, 131068] 94jirl $a0, $a0, 0x20000 95# CHECK: :[[#@LINE-1]]:16: error: immediate must be a multiple of 4 in the range [-131072, 131068] 96 97## simm20 98lu12i.w $a0, -0x80001 99# CHECK: :[[#@LINE-1]]:14: error: immediate must be an integer in the range [-524288, 524287] 100pcaddi $a0, -0x80001 101# CHECK: :[[#@LINE-1]]:13: error: immediate must be an integer in the range [-524288, 524287] 102pcaddu12i $a0, 0x80000 103# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-524288, 524287] 104pcalau12i $a0, 0x80000 105# CHECK: :[[#@LINE-1]]:16: error: immediate must be an integer in the range [-524288, 524287] 106 107## simm21_lsl2 108beqz $a0, -0x400001 109# CHECK: :[[#@LINE-1]]:11: error: immediate must be a multiple of 4 in the range [-4194304, 4194300] 110bnez $a0, -0x3FFFFF 111# CHECK: :[[#@LINE-1]]:11: error: immediate must be a multiple of 4 in the range [-4194304, 4194300] 112beqz $a0, 0x3FFFFF 113# CHECK: :[[#@LINE-1]]:11: error: immediate must be a multiple of 4 in the range [-4194304, 4194300] 114bnez $a0, 0x400000 115# CHECK: :[[#@LINE-1]]:11: error: immediate must be a multiple of 4 in the range [-4194304, 4194300] 116 117## simm26_lsl2 118b -0x8000001 119# CHECK: :[[#@LINE-1]]:3: error: immediate must be a multiple of 4 in the range [-134217728, 134217724] 120b 0x1 121# CHECK: :[[#@LINE-1]]:3: error: immediate must be a multiple of 4 in the range [-134217728, 134217724] 122bl 0x7FFFFFF 123# CHECK: :[[#@LINE-1]]:4: error: immediate must be a multiple of 4 in the range [-134217728, 134217724] 124bl 0x8000000 125# CHECK: :[[#@LINE-1]]:4: error: immediate must be a multiple of 4 in the range [-134217728, 134217724] 126 127## Invalid mnemonics 128nori $a0, $a0, 0 129# CHECK: :[[#@LINE-1]]:1: error: unrecognized instruction mnemonic 130andni $a0, $a0, 0 131# CHECK: :[[#@LINE-1]]:1: error: unrecognized instruction mnemonic 132orni $a0, $a0, 0 133# CHECK: :[[#@LINE-1]]:1: error: unrecognized instruction mnemonic 134 135## Invalid register names 136add.w $foo, $a0, $a0 137# CHECK: :[[#@LINE-1]]:8: error: invalid operand for instruction 138sub.w $a8, $a0, $a0 139# CHECK: :[[#@LINE-1]]:8: error: invalid operand for instruction 140addi.w $x0, $a0, 0 141# CHECK: :[[#@LINE-1]]:9: error: invalid operand for instruction 142alsl.w $t9, $a0, $a0, 1 143# CHECK: :[[#@LINE-1]]:9: error: invalid operand for instruction 144lu12i.w $s10, 0 145# CHECK: :[[#@LINE-1]]:10: error: invalid operand for instruction 146 147.ifndef LA64 148## LoongArch64 mnemonics 149add.d $a0, $a0, $a0 150# CHECK64: :[[#@LINE-1]]:1: error: instruction requires the following: LA64 Basic Integer and Privilege Instruction Set 151addi.d $a0, $a0, 0 152# CHECK64: :[[#@LINE-1]]:1: error: instruction requires the following: LA64 Basic Integer and Privilege Instruction Set 153.endif 154 155## Invalid operand types 156slt $a0, $a0, 0 157# CHECK: :[[#@LINE-1]]:15: error: invalid operand for instruction 158slti $a0, 0, 0 159# CHECK: :[[#@LINE-1]]:11: error: invalid operand for instruction 160 161## Too many operands 162andi $a0, $a0, 0, 0 163# CHECK: :[[#@LINE-1]]:19: error: invalid operand for instruction 164 165## Too few operands 166and $a0, $a0 167# CHECK: :[[#@LINE-1]]:1: error: too few operands for instruction 168andi $a0, $a0 169# CHECK: :[[#@LINE-1]]:1: error: too few operands for instruction 170 171## Instructions outside the base integer ISA 172## TODO: Test instructions in LSX/LASX/LBT/LVZ after their introduction. 173 174## Floating-Point mnemonics 175fadd.s $fa0, $fa0, $fa0 176# CHECK: :[[#@LINE-1]]:1: error: instruction requires the following: 'F' (Single-Precision Floating-Point) 177fadd.d $fa0, $fa0, $fa0 178# CHECK: :[[#@LINE-1]]:1: error: instruction requires the following: 'D' (Double-Precision Floating-Point) 179 180## Using floating point registers when integer registers are expected 181sll.w $a0, $a0, $fa0 182# CHECK: :[[#@LINE-1]]:18: error: invalid operand for instruction 183 184## msbw < lsbw 185# CHECK: :[[#@LINE+1]]:21: error: msb is less than lsb 186bstrins.w $a0, $a0, 1, 2 187# CHECK: ^~~~ 188 189# CHECK: :[[#@LINE+1]]:22: error: msb is less than lsb 190bstrpick.w $a0, $a0, 30, 31 191# CHECK: ^~~~~~ 192