diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td @@ -450,20 +450,35 @@ let isTerminator = 1; } -let hasSideEffects = 0, mayLoad = 1, mayStore = 0 in +let hasSideEffects = 0, mayLoad = 1, mayStore = 0 in { class Load_ri funct3, string opcodestr> : RVInstI; +class HLoad_r funct7, bits<5> funct5, string opcodestr> + : RVInstR { + let rs2 = funct5; +} +} + // Operands for stores are in the order srcreg, base, offset rather than // reflecting the order these fields are specified in the instruction // encoding. -let hasSideEffects = 0, mayLoad = 0, mayStore = 1 in +let hasSideEffects = 0, mayLoad = 0, mayStore = 1 in { class Store_rri funct3, string opcodestr> : RVInstS; +class HStore_rr funct7, string opcodestr> + : RVInstR { + let rd = 0; +} +} + let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in class ALU_ri funct3, string opcodestr> : RVInstI, Sched<[]>; def HINVAL_GVMA : Priv_rr<"hinval.gvma", 0b0110011>, Sched<[]>; +def HLV_B : HLoad_r<0b0110000, 0b00000, "hlv.b">, Sched<[]>; +def HLV_BU : HLoad_r<0b0110000, 0b00001, "hlv.bu">, Sched<[]>; +def HLV_H : HLoad_r<0b0110010, 0b00000, "hlv.h">, Sched<[]>; +def HLV_HU : HLoad_r<0b0110010, 0b00001, "hlv.hu">, Sched<[]>; +def HLVX_HU : HLoad_r<0b0110010, 0b00011, "hlvx.hu">, Sched<[]>; +def HLV_W : HLoad_r<0b0110100, 0b00000, "hlv.w">, Sched<[]>; +def HLVX_WU : HLoad_r<0b0110100, 0b00011, "hlvx.wu">, Sched<[]>; +def HSV_B : HStore_rr<0b0110001, "hsv.b">, Sched<[]>; +def HSV_H : HStore_rr<0b0110011, "hsv.h">, Sched<[]>; +def HSV_W : HStore_rr<0b0110101, "hsv.w">, Sched<[]>; + +let Predicates = [IsRV64] in { +def HLV_WU : HLoad_r<0b0110100, 0b00001, "hlv.wu">, Sched<[]>; +def HLV_D : HLoad_r<0b0110110, 0b00000, "hlv.d">, Sched<[]>; +def HSV_D : HStore_rr<0b0110111, "hsv.d">, Sched<[]>; +} + //===----------------------------------------------------------------------===// // Debug instructions //===----------------------------------------------------------------------===// diff --git a/llvm/test/MC/RISCV/priv-aliases-valid.s b/llvm/test/MC/RISCV/priv-aliases-valid.s new file mode 100644 --- /dev/null +++ b/llvm/test/MC/RISCV/priv-aliases-valid.s @@ -0,0 +1,50 @@ +# RUN: llvm-mc %s -triple=riscv32 -riscv-no-aliases -show-encoding \ +# RUN: | FileCheck -check-prefixes=CHECK,CHECK-INST %s +# RUN: llvm-mc %s -triple=riscv64 -riscv-no-aliases -show-encoding \ +# RUN: | FileCheck -check-prefixes=CHECK,CHECK-INST %s +# RUN: llvm-mc -filetype=obj -triple riscv32 < %s \ +# RUN: | llvm-objdump -M no-aliases -d - \ +# RUN: | FileCheck -check-prefix=CHECK-INST %s +# RUN: llvm-mc -filetype=obj -triple riscv64 < %s \ +# RUN: | llvm-objdump -M no-aliases -d - \ +# RUN: | FileCheck -check-prefix=CHECK-INST %s + +# CHECK-INST: hlv.b a0, (a1) +# CHECK: encoding: [0x73,0xc5,0x05,0x60] +hlv.b a0, 0(a1) + +# CHECK-INST: hlv.bu a0, (a1) +# CHECK: encoding: [0x73,0xc5,0x15,0x60] +hlv.bu a0, 0(a1) + +# CHECK-INST: hlv.h a1, (a2) +# CHECK: encoding: [0xf3,0x45,0x06,0x64] +hlv.h a1, 0(a2) + +# CHECK-INST: hlv.hu a1, (a1) +# CHECK: encoding: [0xf3,0xc5,0x15,0x64] +hlv.hu a1, 0(a1) + +# CHECK-INST: hlvx.hu a1, (a2) +# CHECK: encoding: [0xf3,0x45,0x36,0x64] +hlvx.hu a1, 0(a2) + +# CHECK-INST: hlv.w a2, (a2) +# CHECK: encoding: [0x73,0x46,0x06,0x68] +hlv.w a2, 0(a2) + +# CHECK-INST: hlvx.wu a2, (a3) +# CHECK: encoding: [0x73,0xc6,0x36,0x68] +hlvx.wu a2, 0(a3) + +# CHECK-INST: hsv.b a0, (a1) +# CHECK: encoding: [0x73,0xc0,0xa5,0x62] +hsv.b a0, 0(a1) + +# CHECK-INST: hsv.h a0, (a1) +# CHECK: encoding: [0x73,0xc0,0xa5,0x66] +hsv.h a0, 0(a1) + +# CHECK-INST: hsv.w a0, (a1) +# CHECK: encoding: [0x73,0xc0,0xa5,0x6a] +hsv.w a0, 0(a1) diff --git a/llvm/test/MC/RISCV/priv-invalid.s b/llvm/test/MC/RISCV/priv-invalid.s --- a/llvm/test/MC/RISCV/priv-invalid.s +++ b/llvm/test/MC/RISCV/priv-invalid.s @@ -29,3 +29,63 @@ hinval.gvma zero, a1, a2 # CHECK: :[[@LINE]]:23: error: invalid operand for instruction hinval.gvma a0, 0x10 # CHECK: :[[@LINE]]:17: error: invalid operand for instruction + +hlv.b a0, 0x10 # CHECK: :[[@LINE]]:16: error: expected '(' after optional integer offset + +hlv.b a0, a1 # CHECK: :[[@LINE]]:11: error: expected '(' or optional integer offset + +hlv.b a0, 1(a1) # CHECK: :[[@LINE]]:11: error: optional integer offset must be 0 + +hlv.bu a0, 0x10 # CHECK: :[[@LINE]]:17: error: expected '(' after optional integer offset + +hlv.bu a0, a1 # CHECK: :[[@LINE]]:12: error: expected '(' or optional integer offset + +hlv.bu a0, 1(a1) # CHECK: :[[@LINE]]:12: error: optional integer offset must be 0 + +hlv.h a0, 0x10 # CHECK: :[[@LINE]]:16: error: expected '(' after optional integer offset + +hlv.h a0, a1 # CHECK: :[[@LINE]]:11: error: expected '(' or optional integer offset + +hlv.h a0, 1(a1) # CHECK: :[[@LINE]]:11: error: optional integer offset must be 0 + +hlv.hu a0, 0x10 # CHECK: :[[@LINE]]:17: error: expected '(' after optional integer offset + +hlv.hu a0, a1 # CHECK: :[[@LINE]]:12: error: expected '(' or optional integer offset + +hlv.hu a0, 1(a1) # CHECK: :[[@LINE]]:12: error: optional integer offset must be 0 + +hlvx.hu a0, 0x10 # CHECK: :[[@LINE]]:18: error: expected '(' after optional integer offset + +hlvx.hu a0, a1 # CHECK: :[[@LINE]]:13: error: expected '(' or optional integer offset + +hlvx.hu a0, 1(a1) # CHECK: :[[@LINE]]:13: error: optional integer offset must be 0 + +hlv.w a0, 0x10 # CHECK: :[[@LINE]]:16: error: expected '(' after optional integer offset + +hlv.w a0, a1 # CHECK: :[[@LINE]]:11: error: expected '(' or optional integer offset + +hlv.w a0, 1(a1) # CHECK: :[[@LINE]]:11: error: optional integer offset must be 0 + +hlvx.wu a0, 0x10 # CHECK: :[[@LINE]]:18: error: expected '(' after optional integer offset + +hlvx.wu a0, a1 # CHECK: :[[@LINE]]:13: error: expected '(' or optional integer offset + +hlvx.wu a0, 1(a1) # CHECK: :[[@LINE]]:13: error: optional integer offset must be 0 + +hsv.b a0, 0x10 # CHECK: :[[@LINE]]:16: error: expected '(' after optional integer offset + +hsv.b a0, a1 # CHECK: :[[@LINE]]:11: error: expected '(' or optional integer offset + +hsv.b a0, 1(a1) # CHECK: :[[@LINE]]:11: error: optional integer offset must be 0 + +hsv.h a0, 0x10 # CHECK: :[[@LINE]]:16: error: expected '(' after optional integer offset + +hsv.h a0, a1 # CHECK: :[[@LINE]]:11: error: expected '(' or optional integer offset + +hsv.h a0, 1(a1) # CHECK: :[[@LINE]]:11: error: optional integer offset must be 0 + +hsv.w a0, 0x10 # CHECK: :[[@LINE]]:16: error: expected '(' after optional integer offset + +hsv.w a0, a1 # CHECK: :[[@LINE]]:11: error: expected '(' or optional integer offset + +hsv.w a0, 1(a1) # CHECK: :[[@LINE]]:11: error: optional integer offset must be 0 diff --git a/llvm/test/MC/RISCV/priv-rv64-invalid.s b/llvm/test/MC/RISCV/priv-rv64-invalid.s new file mode 100644 --- /dev/null +++ b/llvm/test/MC/RISCV/priv-rv64-invalid.s @@ -0,0 +1,19 @@ +# RUN: not llvm-mc -triple riscv64 < %s 2>&1 | FileCheck %s + +hlv.wu a0, 0x10 # CHECK: :[[@LINE]]:17: error: expected '(' after optional integer offset + +hlv.wu a0, a1 # CHECK: :[[@LINE]]:12: error: expected '(' or optional integer offset + +hlv.wu a0, 1(a1) # CHECK: :[[@LINE]]:12: error: optional integer offset must be 0 + +hlv.d a0, 0x10 # CHECK: :[[@LINE]]:16: error: expected '(' after optional integer offset + +hlv.d a0, a1 # CHECK: :[[@LINE]]:11: error: expected '(' or optional integer offset + +hlv.d a0, 1(a1) # CHECK: :[[@LINE]]:11: error: optional integer offset must be 0 + +hsv.d a0, 0x10 # CHECK: :[[@LINE]]:16: error: expected '(' after optional integer offset + +hsv.d a0, a1 # CHECK: :[[@LINE]]:11: error: expected '(' or optional integer offset + +hsv.d a0, 1(a1) # CHECK: :[[@LINE]]:11: error: optional integer offset must be 0 diff --git a/llvm/test/MC/RISCV/priv-rv64-valid.s b/llvm/test/MC/RISCV/priv-rv64-valid.s new file mode 100644 --- /dev/null +++ b/llvm/test/MC/RISCV/priv-rv64-valid.s @@ -0,0 +1,38 @@ +# RUN: llvm-mc %s -triple=riscv64 -riscv-no-aliases -show-encoding \ +# RUN: | FileCheck -check-prefixes=CHECK,CHECK-INST %s +# RUN: llvm-mc -filetype=obj -triple riscv64 < %s \ +# RUN: | llvm-objdump -M no-aliases -d - \ +# RUN: | FileCheck -check-prefix=CHECK-INST %s + +# RUN: not llvm-mc -triple riscv32 < %s 2>&1 \ +# RUN: | FileCheck -check-prefix=CHECK-RV32 %s + +# CHECK-INST: hlv.wu a0, (a1) +# CHECK: encoding: [0x73,0xc5,0x15,0x68] +# CHECK-RV32: :[[@LINE+1]]:1: error: instruction requires the following: RV64I Base Instruction Set +hlv.wu a0, (a1) + +# CHECK-INST: hlv.wu a0, (a1) +# CHECK: encoding: [0x73,0xc5,0x15,0x68] +# CHECK-RV32: :[[@LINE+1]]:1: error: instruction requires the following: RV64I Base Instruction Set +hlv.wu a0, 0(a1) + +# CHECK-INST: hlv.d a0, (a1) +# CHECK: encoding: [0x73,0xc5,0x05,0x6c] +# CHECK-RV32: :[[@LINE+1]]:1: error: instruction requires the following: RV64I Base Instruction Set +hlv.d a0, (a1) + +# CHECK-INST: hlv.d a0, (a1) +# CHECK: encoding: [0x73,0xc5,0x05,0x6c] +# CHECK-RV32: :[[@LINE+1]]:1: error: instruction requires the following: RV64I Base Instruction Set +hlv.d a0, 0(a1) + +# CHECK-INST: hsv.d a0, (a1) +# CHECK: encoding: [0x73,0xc0,0xa5,0x6e] +# CHECK-RV32: :[[@LINE+1]]:1: error: instruction requires the following: RV64I Base Instruction Set +hsv.d a0, (a1) + +# CHECK-INST: hsv.d a0, (a1) +# CHECK: encoding: [0x73,0xc0,0xa5,0x6e] +# CHECK-RV32: :[[@LINE+1]]:1: error: instruction requires the following: RV64I Base Instruction Set +hsv.d a0, 0(a1) diff --git a/llvm/test/MC/RISCV/priv-valid.s b/llvm/test/MC/RISCV/priv-valid.s --- a/llvm/test/MC/RISCV/priv-valid.s +++ b/llvm/test/MC/RISCV/priv-valid.s @@ -80,3 +80,43 @@ # CHECK-INST: hinval.gvma a0, a1 # CHECK: encoding: [0x73,0x00,0xb5,0x66] hinval.gvma a0, a1 + +# CHECK-INST: hlv.b a0, (a1) +# CHECK: encoding: [0x73,0xc5,0x05,0x60] +hlv.b a0, (a1) + +# CHECK-INST: hlv.bu a0, (a1) +# CHECK: encoding: [0x73,0xc5,0x15,0x60] +hlv.bu a0, (a1) + +# CHECK-INST: hlv.h a1, (a2) +# CHECK: encoding: [0xf3,0x45,0x06,0x64] +hlv.h a1, (a2) + +# CHECK-INST: hlv.hu a1, (a1) +# CHECK: encoding: [0xf3,0xc5,0x15,0x64] +hlv.hu a1, (a1) + +# CHECK-INST: hlvx.hu a1, (a2) +# CHECK: encoding: [0xf3,0x45,0x36,0x64] +hlvx.hu a1, (a2) + +# CHECK-INST: hlv.w a2, (a2) +# CHECK: encoding: [0x73,0x46,0x06,0x68] +hlv.w a2, (a2) + +# CHECK-INST: hlvx.wu a2, (a3) +# CHECK: encoding: [0x73,0xc6,0x36,0x68] +hlvx.wu a2, (a3) + +# CHECK-INST: hsv.b a0, (a1) +# CHECK: encoding: [0x73,0xc0,0xa5,0x62] +hsv.b a0, (a1) + +# CHECK-INST: hsv.h a0, (a1) +# CHECK: encoding: [0x73,0xc0,0xa5,0x66] +hsv.h a0, (a1) + +# CHECK-INST: hsv.w a0, (a1) +# CHECK: encoding: [0x73,0xc0,0xa5,0x6a] +hsv.w a0, (a1)