Index: lib/Target/RISCV/RISCVInstrInfo.td =================================================================== --- lib/Target/RISCV/RISCVInstrInfo.td +++ lib/Target/RISCV/RISCVInstrInfo.td @@ -574,3 +574,42 @@ include "RISCVInstrInfoA.td" include "RISCVInstrInfoF.td" include "RISCVInstrInfoD.td" + +//===----------------------------------------------------------------------===// +// Privileged instructions +//===----------------------------------------------------------------------===// + +let hasSideEffects = 1, mayLoad = 0, mayStore = 0 in +class Prv_ri + : RVInstI<0b000, OPC_SYSTEM, (outs), (ins), opcodestr, "">; + +def URET : Prv_ri<"uret"> { + let rs1 = 0; + let rd = 0; + let imm12 = 0b000000000010; +} + +def SRET : Prv_ri<"sret"> { + let rs1 = 0; + let rd = 0; + let imm12 = 0b000100000010; +} + +def MRET : Prv_ri<"mret"> { + let rs1 = 0; + let rd = 0; + let imm12 = 0b001100000010; +} + +def WFI : Prv_ri<"wfi"> { + let rs1 = 0; + let rd = 0; + let imm12 = 0b000100000101; +} + +let hasSideEffects = 1, mayLoad = 0, mayStore = 0 in +def SFENCEVM : RVInstR<0b0001001, 0b000, OPC_SYSTEM, (outs), + (ins GPR:$rs1, GPR:$rs2), + "sfence.vma", "$rs1, $rs2"> { + let rd = 0; +} Index: test/MC/RISCV/priv.s =================================================================== --- /dev/null +++ test/MC/RISCV/priv.s @@ -0,0 +1,40 @@ +# 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: ecall +# CHECK: encoding: [0x73,0x00,0x00,0x00] + ecall + + # CHECK-INST: ebreak +# CHECK: encoding: [0x73,0x00,0x10,0x00] + ebreak + +# 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