Index: llvm/trunk/lib/Target/RISCV/RISCVInstrInfo.td =================================================================== --- llvm/trunk/lib/Target/RISCV/RISCVInstrInfo.td +++ llvm/trunk/lib/Target/RISCV/RISCVInstrInfo.td @@ -211,6 +211,11 @@ : RVInstR; +let hasSideEffects = 1, mayLoad = 0, mayStore = 0 in +class Priv funct7> + : RVInstR; + //===----------------------------------------------------------------------===// // Instructions //===----------------------------------------------------------------------===// @@ -334,6 +339,43 @@ } // Predicates = [IsRV64] //===----------------------------------------------------------------------===// +// Privileged instructions +//===----------------------------------------------------------------------===// + +let isBarrier = 1, isReturn = 1, isTerminator = 1 in { +def URET : Priv<"uret", 0b0000000> { + let rd = 0; + let rs1 = 0; + let rs2 = 0b00010; +} + +def SRET : Priv<"sret", 0b0001000> { + let rd = 0; + let rs1 = 0; + let rs2 = 0b00010; +} + +def MRET : Priv<"mret", 0b0011000> { + let rd = 0; + let rs1 = 0; + let rs2 = 0b00010; +} +} // isBarrier = 1, isReturn = 1, isTerminator = 1 + +def WFI : Priv<"wfi", 0b0001000> { + let rd = 0; + let rs1 = 0; + let rs2 = 0b00101; +} + +let hasSideEffects = 1, mayLoad = 0, mayStore = 0 in +def SFENCE_VMA : RVInstR<0b0001001, 0b000, OPC_SYSTEM, (outs), + (ins GPR:$rs1, GPR:$rs2), + "sfence.vma", "$rs1, $rs2"> { + let rd = 0; +} + +//===----------------------------------------------------------------------===// // Pseudo-instructions and codegen patterns // // Naming convention: For 'generic' pattern classes, we use the naming Index: llvm/trunk/test/MC/RISCV/priv-invalid.s =================================================================== --- llvm/trunk/test/MC/RISCV/priv-invalid.s +++ llvm/trunk/test/MC/RISCV/priv-invalid.s @@ -0,0 +1,7 @@ +# RUN: not llvm-mc -triple riscv32 < %s 2>&1 | FileCheck %s + +mret 0x10 # CHECK: :[[@LINE]]:6: error: invalid operand for instruction + +sfence.vma zero # CHECK: :[[@LINE]]:1: error: too few operands for instruction + +sfence.vma a0, 0x10 # CHECK: :[[@LINE]]:16: error: invalid operand for instruction Index: llvm/trunk/test/MC/RISCV/priv-valid.s =================================================================== --- llvm/trunk/test/MC/RISCV/priv-valid.s +++ llvm/trunk/test/MC/RISCV/priv-valid.s @@ -0,0 +1,32 @@ +# RUN: llvm-mc %s -triple=riscv32 -show-encoding \ +# RUN: | FileCheck -check-prefixes=CHECK,CHECK-INST %s +# RUN: llvm-mc %s -triple=riscv64 -show-encoding \ +# RUN: | FileCheck -check-prefixes=CHECK,CHECK-INST %s +# RUN: llvm-mc -filetype=obj -triple riscv32 < %s \ +# RUN: | llvm-objdump -d - | FileCheck -check-prefix=CHECK-INST %s +# RUN: llvm-mc -filetype=obj -triple riscv64 < %s \ +# RUN: | llvm-objdump -d - | FileCheck -check-prefix=CHECK-INST %s + +# CHECK-INST: uret +# CHECK: encoding: [0x73,0x00,0x20,0x00] +uret + +# CHECK-INST: sret +# CHECK: encoding: [0x73,0x00,0x20,0x10] +sret + +# CHECK-INST: mret +# CHECK: encoding: [0x73,0x00,0x20,0x30] +mret + +# CHECK-INST: wfi +# CHECK: encoding: [0x73,0x00,0x50,0x10] +wfi + +# CHECK-INST: sfence.vma zero, zero +# CHECK: encoding: [0x73,0x00,0x00,0x12] +sfence.vma zero, zero + +# CHECK-INST: sfence.vma a0, a1 +# CHECK: encoding: [0x73,0x00,0xb5,0x12] +sfence.vma a0, a1