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 @@ -151,6 +151,11 @@ let OperandNamespace = "RISCVOp"; } +def immzero : Operand, + ImmLeaf { + let ParserMatchClass = ImmZeroAsmOperand; +} + def uimm2 : Operand { let ParserMatchClass = UImmAsmOperand<2>; let DecoderMethod = "decodeUImmOperand<2>"; @@ -435,20 +440,39 @@ 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_ri funct7, bits<3> funct3, string opcodestr> + : RVInstI<0b100, OPC_SYSTEM, (outs GPR:$rd), (ins GPR:$rs1, immzero:$imm2), + opcodestr, "$rd, ${imm2}(${rs1})"> { + bits<2> imm2; + let Inst{31-25} = funct7; + let Inst{24-23} = imm2; + let Inst{22-20} = funct3; +} +} + // 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_ri funct7, string opcodestr> + : RVInstR, Sched<[]> { + bits<5> imm5; + let Inst{11-7} = imm5; +} +} + let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in class ALU_ri funct3, string opcodestr> : RVInstI, Sched<[]>; } +def HLV_B : HLoad_ri<0b0110000, 0b000, "hlv.b">; +def HLV_BU : HLoad_ri<0b0110000, 0b001, "hlv.bu">; +def HLV_H : HLoad_ri<0b0110010, 0b000, "hlv.h">; +def HLV_HU : HLoad_ri<0b0110010, 0b001, "hlv.hu">; +def HLVX_HU : HLoad_ri<0b0110010, 0b011, "hlvx.hu">; +def HLV_W : HLoad_ri<0b0110100, 0b000, "hlv.w">; +def HLVX_WU : HLoad_ri<0b0110100, 0b011, "hlvx.wu">; +let Predicates = [IsRV64] in { +def HLV_WU : HLoad_ri<0b0110100, 0b001, "hlv.wu">; +def HLV_D : HLoad_ri<0b0110110, 0b000, "hlv.d">; +} + +def HSV_B : HStore_ri<0b0110001, "hsv.b">; +def HSV_H : HStore_ri<0b0110011, "hsv.h">; +def HSV_W : HStore_ri<0b0110101, "hsv.w">; +let Predicates = [IsRV64] in +def HSV_D : HStore_ri<0b0110111, "hsv.d">; + +let EmitPriority = 0 in { +def : InstAlias<"hlv.b $rd, (${rs1})", (HLV_B GPR:$rd, GPR:$rs1, 0)>; +def : InstAlias<"hlv.bu $rd, (${rs1})", (HLV_BU GPR:$rd, GPR:$rs1, 0)>; +def : InstAlias<"hlv.h $rd, (${rs1})", (HLV_H GPR:$rd, GPR:$rs1, 0)>; +def : InstAlias<"hlv.hu $rd, (${rs1})", (HLV_HU GPR:$rd, GPR:$rs1, 0)>; +def : InstAlias<"hlvx.hu $rd, (${rs1})", (HLVX_HU GPR:$rd, GPR:$rs1, 0)>; +def : InstAlias<"hlv.w $rd, (${rs1})", (HLV_W GPR:$rd, GPR:$rs1, 0)>; +def : InstAlias<"hlv.wu $rd, (${rs1})", (HLV_WU GPR:$rd, GPR:$rs1, 0)>; +def : InstAlias<"hlvx.wu $rd, (${rs1})", (HLVX_WU GPR:$rd, GPR:$rs1, 0)>; +def : InstAlias<"hlv.d $rd, (${rs1})", (HLV_D GPR:$rd, GPR:$rs1, 0)>; +def : InstAlias<"hsv.b $rs2, (${rs1})", (HSV_B GPR:$rs2, GPR:$rs1, 0)>; +def : InstAlias<"hsv.h $rs2, (${rs1})", (HSV_H GPR:$rs2, GPR:$rs1, 0)>; +def : InstAlias<"hsv.w $rs2, (${rs1})", (HSV_W GPR:$rs2, GPR:$rs1, 0)>; +def : InstAlias<"hsv.d $rs2, (${rs1})", (HSV_D GPR:$rs2, GPR:$rs1, 0)>; +} + //===----------------------------------------------------------------------===// // Debug instructions //===----------------------------------------------------------------------===// diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoC.td b/llvm/lib/Target/RISCV/RISCVInstrInfoC.td --- a/llvm/lib/Target/RISCV/RISCVInstrInfoC.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoC.td @@ -61,11 +61,6 @@ }]; } -def immzero : Operand, - ImmLeaf { - let ParserMatchClass = ImmZeroAsmOperand; -} - def CLUIImmAsmOperand : AsmOperandClass { let Name = "CLUIImm"; let RenderMethod = "addImmOperands"; 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, 0(a1) +# CHECK: encoding: [0x73,0xc5,0x05,0x60] +hlv.b a0, (a1) + +# CHECK-INST: hlv.bu a0, 0(a1) +# CHECK: encoding: [0x73,0xc5,0x15,0x60] +hlv.bu a0, (a1) + +# CHECK-INST: hlv.h a1, 0(a2) +# CHECK: encoding: [0xf3,0x45,0x06,0x64] +hlv.h a1, (a2) + +# CHECK-INST: hlv.hu a1, 0(a1) +# CHECK: encoding: [0xf3,0xc5,0x15,0x64] +hlv.hu a1, (a1) + +# CHECK-INST: hlvx.hu a1, 0(a2) +# CHECK: encoding: [0xf3,0x45,0x36,0x64] +hlvx.hu a1, (a2) + +# CHECK-INST: hlv.w a2, 0(a2) +# CHECK: encoding: [0x73,0x46,0x06,0x68] +hlv.w a2, (a2) + +# CHECK-INST: hlvx.wu a2, 0(a3) +# CHECK: encoding: [0x73,0xc6,0x36,0x68] +hlvx.wu a2, (a3) + +# CHECK-INST: hsv.b a0, 0(a1) +# CHECK: encoding: [0x73,0xc0,0xa5,0x62] +hsv.b a0, (a1) + +# CHECK-INST: hsv.h a0, 0(a1) +# CHECK: encoding: [0x73,0xc0,0xa5,0x66] +hsv.h a0, (a1) + +# CHECK-INST: hsv.w a0, 0(a1) +# CHECK: encoding: [0x73,0xc0,0xa5,0x6a] +hsv.w a0, (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 @@ -1,4 +1,4 @@ -# RUN: not llvm-mc -triple riscv32 < %s 2>&1 | FileCheck %s +# RUN: not llvm-mc -triple riscv64 < %s 2>&1 | FileCheck %s mret 0x10 # CHECK: :[[@LINE]]:6: error: invalid operand for instruction @@ -29,3 +29,51 @@ 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]]:11: error: immediate must be zero + +hlv.b a0, 1(a1) # CHECK: :[[@LINE]]:11: error: immediate must be zero + +hlv.bu a0, 0x10 # CHECK: :[[@LINE]]:12: error: immediate must be zero + +hlv.bu a0, 1(a1) # CHECK: :[[@LINE]]:12: error: immediate must be zero + +hlv.h a0, 0x10 # CHECK: :[[@LINE]]:11: error: immediate must be zero + +hlv.h a0, 1(a1) # CHECK: :[[@LINE]]:11: error: immediate must be zero + +hlv.hu a0, 0x10 # CHECK: :[[@LINE]]:12: error: immediate must be zero + +hlv.hu a0, 1(a1) # CHECK: :[[@LINE]]:12: error: immediate must be zero + +hlvx.hu a0, 0x10 # CHECK: :[[@LINE]]:13: error: immediate must be zero + +hlvx.hu a0, 1(a1) # CHECK: :[[@LINE]]:13: error: immediate must be zero + +hlv.w a0, 0x10 # CHECK: :[[@LINE]]:11: error: immediate must be zero + +hlv.w a0, 1(a1) # CHECK: :[[@LINE]]:11: error: immediate must be zero + +hlv.wu a0, 0x10 # CHECK: :[[@LINE]]:12: error: immediate must be zero + +hlv.wu a0, 1(a1) # CHECK: :[[@LINE]]:12: error: immediate must be zero + +hlv.d a0, 0x10 # CHECK: :[[@LINE]]:11: error: immediate must be zero + +hlv.d a0, 1(a1) # CHECK: :[[@LINE]]:11: error: immediate must be zero + +hsv.b a0, 0x10 # CHECK: :[[@LINE]]:11: error: immediate must be zero + +hsv.b a0, 1(a1) # CHECK: :[[@LINE]]:11: error: immediate must be zero + +hsv.h a0, 0x10 # CHECK: :[[@LINE]]:11: error: immediate must be zero + +hsv.h a0, 1(a1) # CHECK: :[[@LINE]]:11: error: immediate must be zero + +hsv.w a0, 0x10 # CHECK: :[[@LINE]]:11: error: immediate must be zero + +hsv.w a0, 1(a1) # CHECK: :[[@LINE]]:11: error: immediate must be zero + +hsv.d a0, 0x10 # CHECK: :[[@LINE]]:11: error: immediate must be zero + +hsv.d a0, 1(a1) # CHECK: :[[@LINE]]:11: error: immediate must be zero 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,21 @@ +# 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 + +# CHECK-INST: hlv.wu a0, 0(a1) +# CHECK: encoding: [0x73,0xc5,0x15,0x68] +hlv.wu a0, (a1) + +# CHECK-INST: hlv.wu a0, 0(a1) +# CHECK: encoding: [0x73,0xc5,0x15,0x68] +hlv.wu a0, 0(a1) + +# CHECK-INST: hlv.d a0, 0(a1) +# CHECK: encoding: [0x73,0xc5,0x05,0x6c] +hlv.d a0, (a1) + +# CHECK-INST: hsv.d a0, 0(a1) +# CHECK: encoding: [0x73,0xc0,0xa5,0x6e] +hsv.d a0, (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 @@ -76,3 +76,43 @@ # CHECK-INST: hinval.gvma a0, a1 # CHECK: encoding: [0x73,0x00,0xb5,0x66] hinval.gvma a0, a1 + +# CHECK-INST: hlv.b a0, 0(a1) +# CHECK: encoding: [0x73,0xc5,0x05,0x60] +hlv.b a0, 0(a1) + +# CHECK-INST: hlv.bu a0, 0(a1) +# CHECK: encoding: [0x73,0xc5,0x15,0x60] +hlv.bu a0, 0(a1) + +# CHECK-INST: hlv.h a1, 0(a2) +# CHECK: encoding: [0xf3,0x45,0x06,0x64] +hlv.h a1, 0(a2) + +# CHECK-INST: hlv.hu a1, 0(a1) +# CHECK: encoding: [0xf3,0xc5,0x15,0x64] +hlv.hu a1, 0(a1) + +# CHECK-INST: hlvx.hu a1, 0(a2) +# CHECK: encoding: [0xf3,0x45,0x36,0x64] +hlvx.hu a1, 0(a2) + +# CHECK-INST: hlv.w a2, 0(a2) +# CHECK: encoding: [0x73,0x46,0x06,0x68] +hlv.w a2, 0(a2) + +# CHECK-INST: hlvx.wu a2, 0(a3) +# CHECK: encoding: [0x73,0xc6,0x36,0x68] +hlvx.wu a2, 0(a3) + +# CHECK-INST: hsv.b a0, 0(a1) +# CHECK: encoding: [0x73,0xc0,0xa5,0x62] +hsv.b a0, 0(a1) + +# CHECK-INST: hsv.h a0, 0(a1) +# CHECK: encoding: [0x73,0xc0,0xa5,0x66] +hsv.h a0, 0(a1) + +# CHECK-INST: hsv.w a0, 0(a1) +# CHECK: encoding: [0x73,0xc0,0xa5,0x6a] +hsv.w a0, 0(a1)