blob: 54991eaddef5a2b39dccb964b9a1ada3212cfdd3 [file] [log] [blame]
This patch enables custom RISCV instructions in our version of LLVM.
These instructions aren't part of the standard RISCV spec, so upstreaming seems
nontrivial.
new file mode 100644
--- /dev/null
+++ b/clang/include/clang/Basic/BuiltinsSoteria.def
@@ -0,0 +1,24 @@
+//===-- BuiltinsSoteria.def - Soteria Builtin function database --*- C++ -*-==//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file defines the Soteria-specific builtin function database. Users of
+// this file must define the BUILTIN macro to make use of this information.
+//
+//===----------------------------------------------------------------------===//
+
+// The format of this database matches clang/Basic/Builtins.def.
+
+// The builtins below are not autogenerated from iset.py.
+// Make sure you do not overwrite these.
+
+BUILTIN(__builtin_riscv_soteria_grev, "iii", "nc")
+BUILTIN(__builtin_riscv_soteria_bitc, "iii", "nc")
+BUILTIN(__builtin_riscv_soteria_bits, "iii", "nc")
+BUILTIN(__builtin_riscv_soteria_fls, "ii", "nc")
+
+#undef BUILTIN
--- a/clang/include/clang/Basic/TargetBuiltins.h
+++ b/clang/include/clang/Basic/TargetBuiltins.h
@@ -300,6 +300,15 @@ namespace clang {
};
}
+ namespace RISCV {
+ enum {
+ LastTIBuiltin = clang::Builtin::FirstTSBuiltin - 1,
+ #define BUILTIN(ID, TYPE, ATTRS) BI##ID,
+ #include "clang/Basic/BuiltinsSoteria.def"
+ LastTSBuiltin
+ };
+ }
+
/// SystemZ builtins
namespace SystemZ {
enum {
--- a/clang/lib/Basic/Targets/RISCV.cpp
+++ b/clang/lib/Basic/Targets/RISCV.cpp
@@ -11,6 +11,8 @@
//===----------------------------------------------------------------------===//
#include "RISCV.h"
+#include "clang/Basic/Builtins.h"
+#include "clang/Basic/TargetBuiltins.h"
#include "clang/Basic/MacroBuilder.h"
#include "llvm/ADT/StringSwitch.h"
#include "llvm/Support/TargetParser.h"
@@ -18,6 +20,16 @@
using namespace clang;
using namespace clang::targets;
+const Builtin::Info RISCVTargetInfo::BuiltinInfo[] = {
+#define BUILTIN(ID, TYPE, ATTRS) \
+ {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, nullptr},
+#define TARGET_BUILTIN(ID, TYPE, ATTRS, FEATURE) \
+ {#ID, TYPE, ATTRS, nullptr, ALL_LANGUAGES, FEATURE},
+#define LIBBUILTIN(ID, TYPE, ATTRS, HEADER) \
+ {#ID, TYPE, ATTRS, HEADER, ALL_LANGUAGES, nullptr},
+#include "clang/Basic/BuiltinsSoteria.def"
+};
+
ArrayRef<const char *> RISCVTargetInfo::getGCCRegNames() const {
static const char *const GCCRegNames[] = {
// Integer registers
@@ -129,6 +141,14 @@ void RISCVTargetInfo::getTargetDefines(const LangOptions &Opts,
if (HasB)
Builder.defineMacro("__riscv_bitmanip");
+
+ if (HasSoteria)
+ Builder.defineMacro("__soteria");
+}
+
+ArrayRef<Builtin::Info> RISCVTargetInfo::getTargetBuiltins() const {
+ return llvm::makeArrayRef(BuiltinInfo, clang::RISCV::LastTSBuiltin -
+ Builtin::FirstTSBuiltin);
}
/// Return true if has this feature, need to sync with handleTargetFeatures.
@@ -144,6 +164,7 @@ bool RISCVTargetInfo::hasFeature(StringRef Feature) const {
.Case("d", HasD)
.Case("c", HasC)
.Case("experimental-b", HasB)
+ .Case("xsoteria", HasSoteria)
.Default(false);
}
@@ -163,6 +184,8 @@ bool RISCVTargetInfo::handleTargetFeatures(std::vector<std::string> &Features,
HasC = true;
else if (Feature == "+experimental-b")
HasB = true;
+ else if (Feature == "+xsoteria")
+ HasSoteria = true;
}
return true;
--- a/clang/lib/Basic/Targets/RISCV.h
+++ b/clang/lib/Basic/Targets/RISCV.h
@@ -31,11 +31,13 @@ protected:
bool HasD;
bool HasC;
bool HasB;
+ bool HasSoteria;
+ static const Builtin::Info BuiltinInfo[];
public:
RISCVTargetInfo(const llvm::Triple &Triple, const TargetOptions &)
: TargetInfo(Triple), HasM(false), HasA(false), HasF(false),
- HasD(false), HasC(false), HasB(false) {
+ HasD(false), HasC(false), HasB(false), HasSoteria(false) {
LongDoubleWidth = 128;
LongDoubleAlign = 128;
LongDoubleFormat = &llvm::APFloat::IEEEquad();
@@ -55,7 +57,7 @@ public:
void getTargetDefines(const LangOptions &Opts,
MacroBuilder &Builder) const override;
- ArrayRef<Builtin::Info> getTargetBuiltins() const override { return None; }
+ ArrayRef<Builtin::Info> getTargetBuiltins() const override;
BuiltinVaListKind getBuiltinVaListKind() const override {
return TargetInfo::VoidPtrBuiltinVaList;
--- a/clang/lib/CodeGen/CGBuiltin.cpp
+++ b/clang/lib/CodeGen/CGBuiltin.cpp
@@ -4534,6 +4534,9 @@ static Value *EmitTargetArchBuiltinExpr(CodeGenFunction *CGF,
case llvm::Triple::nvptx:
case llvm::Triple::nvptx64:
return CGF->EmitNVPTXBuiltinExpr(BuiltinID, E);
+ case llvm::Triple::riscv32:
+ case llvm::Triple::riscv64:
+ return CGF->EmitRISCVBuiltinExpr(BuiltinID, E);
case llvm::Triple::wasm32:
case llvm::Triple::wasm64:
return CGF->EmitWebAssemblyBuiltinExpr(BuiltinID, E);
@@ -16100,6 +16103,14 @@ RValue CodeGenFunction::EmitBuiltinAlignTo(const CallExpr *E, bool AlignUp) {
return RValue::get(Result);
}
+Value *CodeGenFunction::EmitRISCVBuiltinExpr(unsigned BuiltinID,
+ const CallExpr *E) {
+ switch (BuiltinID) {
+ default:
+ return nullptr;
+ }
+}
+
Value *CodeGenFunction::EmitWebAssemblyBuiltinExpr(unsigned BuiltinID,
const CallExpr *E) {
switch (BuiltinID) {
--- a/clang/lib/CodeGen/CodeGenFunction.h
+++ b/clang/lib/CodeGen/CodeGenFunction.h
@@ -4068,6 +4068,7 @@ public:
llvm::Value *EmitAMDGPUBuiltinExpr(unsigned BuiltinID, const CallExpr *E);
llvm::Value *EmitSystemZBuiltinExpr(unsigned BuiltinID, const CallExpr *E);
llvm::Value *EmitNVPTXBuiltinExpr(unsigned BuiltinID, const CallExpr *E);
+ llvm::Value *EmitRISCVBuiltinExpr(unsigned BuiltinID, const CallExpr *E);
llvm::Value *EmitWebAssemblyBuiltinExpr(unsigned BuiltinID,
const CallExpr *E);
llvm::Value *EmitHexagonBuiltinExpr(unsigned BuiltinID, const CallExpr *E);
--- a/clang/lib/Driver/ToolChains/Arch/RISCV.cpp
+++ b/clang/lib/Driver/ToolChains/Arch/RISCV.cpp
@@ -73,6 +73,9 @@ static bool isSupportedExtension(StringRef Ext) {
return true;
// LLVM does not support "sx", "s" nor "x" extensions.
+ if (Ext == "xsoteria") {
+ return true;
+ }
return false;
}
new file mode 100644
--- /dev/null
+++ b/clang/test/CodeGen/builtins-soteria.c
@@ -0,0 +1,53 @@
+// RUN: %clang_cc1 -triple=riscv32-unknown-none -target-feature +xsoteria -O3 \
+// RUN: -S -o - %s | FileCheck %s -check-prefix=RV32S
+
+int intrinsics(int x) {
+ // RV32S-LABEL: intrinsics:
+
+ int v1 = __builtin_riscv_soteria_grev(x, x);
+ // RV32S: grev
+
+ int v2 = __builtin_riscv_soteria_grev(x, 1);
+ // RV32S: grevi
+
+ int v3 = __builtin_riscv_soteria_bitc(x, x);
+ // RV32S: bitc
+
+ int v4 = __builtin_riscv_soteria_bitc(x, 2);
+ // RV32S: bitci
+
+ int v5 = __builtin_riscv_soteria_bits(x, x);
+ // RV32S: bits
+
+ int v6 = __builtin_riscv_soteria_bits(x, 3);
+ // RV32S: bitsi
+
+ int v7 = __builtin_popcount(x);
+ // RV32S: pcnt
+
+ int v8 = __builtin_clz(x);
+ // RV32S: clz
+
+ int v9 = __builtin_riscv_soteria_fls(x);
+ // RV32S: fls
+
+ return v1 + v2 + v3 + v4 + v5 + v6 + v7 + v8 + v9;
+}
+
+int bitc_pattern(int a, int b) {
+ // RV32S-LABEL: bitc_pattern:
+
+ return a & ~(1 << b);
+ // RV32S-NOT: and
+ // RV32S: bitc a0, a0, a1
+ // RV32S-NEXT: ret
+}
+
+int bits_pattern(int a, int b) {
+ // RV32S-LABEL: bits_pattern:
+
+ return a | (1 << b);
+ // RV32S-NOT: or
+ // RV32S: bits a0, a0, a1
+ // RV32S-NEXT: ret
+}
--- a/llvm/include/llvm/BinaryFormat/ELF.h
+++ b/llvm/include/llvm/BinaryFormat/ELF.h
@@ -622,7 +622,9 @@ enum : unsigned {
EF_RISCV_FLOAT_ABI_SINGLE = 0x0002,
EF_RISCV_FLOAT_ABI_DOUBLE = 0x0004,
EF_RISCV_FLOAT_ABI_QUAD = 0x0006,
- EF_RISCV_RVE = 0x0008
+ EF_RISCV_RVE = 0x0008,
+ // 0x0010 is used by melvin
+ EF_RISCV_SOTERIA = 0x0020
};
// ELF Relocation types for RISC-V
--- a/llvm/include/llvm/IR/IntrinsicsRISCV.td
+++ b/llvm/include/llvm/IR/IntrinsicsRISCV.td
@@ -65,4 +65,23 @@ let TargetPrefix = "riscv" in {
// @llvm.riscv.masked.cmpxchg.{i32,i64}.<p>(...)
defm int_riscv_masked_cmpxchg : MaskedAtomicRMWFiveArgIntrinsics;
+class SoteriaIntrinsic<string name,
+ list<LLVMType> ret_types,
+ list<LLVMType> param_types = [],
+ list<IntrinsicProperty> properties = []>
+ : GCCBuiltin<"__builtin_riscv_soteria_"#name>,
+ Intrinsic<ret_types, param_types, properties>;
+
+def int_riscv_soteria_grev
+ : SoteriaIntrinsic<"grev", [llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
+ [IntrNoMem]>;
+def int_riscv_soteria_bitc
+ : SoteriaIntrinsic<"bitc", [llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
+ [IntrNoMem]>;
+def int_riscv_soteria_bits
+ : SoteriaIntrinsic<"bits", [llvm_i32_ty], [llvm_i32_ty, llvm_i32_ty],
+ [IntrNoMem]>;
+def int_riscv_soteria_fls
+ : SoteriaIntrinsic<"fls", [llvm_i32_ty], [llvm_i32_ty], [IntrNoMem]>;
+
} // TargetPrefix = "riscv"
--- a/llvm/lib/Object/ELFObjectFile.cpp
+++ b/llvm/lib/Object/ELFObjectFile.cpp
@@ -293,6 +293,9 @@ SubtargetFeatures ELFObjectFileBase::getRISCVFeatures() const {
if (PlatformFlags & ELF::EF_RISCV_RVC) {
Features.AddFeature("c");
}
+ if (PlatformFlags & ELF::EF_RISCV_SOTERIA) {
+ Features.AddFeature("xsoteria");
+ }
// Add features according to the ELF attribute section.
// If there are any unrecognized features, ignore them.
--- a/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.cpp
+++ b/llvm/lib/Target/RISCV/MCTargetDesc/RISCVELFStreamer.cpp
@@ -37,6 +37,8 @@ RISCVTargetELFStreamer::RISCVTargetELFStreamer(MCStreamer &S,
if (Features[RISCV::FeatureStdExtC])
EFlags |= ELF::EF_RISCV_RVC;
+ if (Features[RISCV::FeatureSoteria])
+ EFlags |= ELF::EF_RISCV_SOTERIA;
switch (ABI) {
case RISCVABI::ABI_ILP32:
--- a/llvm/lib/Target/RISCV/RISCV.td
+++ b/llvm/lib/Target/RISCV/RISCV.td
@@ -164,6 +164,13 @@ def IsRV32 : Predicate<"!Subtarget->is64Bit()">,
AssemblerPredicate<(all_of (not Feature64Bit)),
"RV32I Base Instruction Set">;
+def FeatureSoteria
+ : SubtargetFeature<"xsoteria", "HasExtSoteria", "true",
+ "'Soteria' (Soteria non-standard instructions)">;
+def HasExtSoteria : Predicate<"Subtarget->hasExtSoteria()">,
+ AssemblerPredicate<(all_of FeatureSoteria),
+ "'Soteria' (Soteria non-standard instructions)">;
+
def RV64 : HwMode<"+64bit">;
def RV32 : HwMode<"-64bit">;
--- a/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
+++ b/llvm/lib/Target/RISCV/RISCVISelLowering.cpp
@@ -157,7 +157,11 @@ RISCVTargetLowering::RISCVTargetLowering(const TargetMachine &TM,
if (!Subtarget.hasStdExtZbp())
setOperationAction(ISD::BSWAP, XLenVT, Expand);
- if (!Subtarget.hasStdExtZbb()) {
+ if (Subtarget.hasExtSoteria()) {
+ setOperationAction(ISD::CTPOP, XLenVT, Legal);
+ setOperationAction(ISD::CTLZ, XLenVT, Legal);
+ setOperationAction(ISD::CTTZ, XLenVT, Expand);
+ } else if (!Subtarget.hasStdExtZbb()) {
setOperationAction(ISD::CTTZ, XLenVT, Expand);
setOperationAction(ISD::CTLZ, XLenVT, Expand);
setOperationAction(ISD::CTPOP, XLenVT, Expand);
--- a/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.cpp
@@ -818,3 +818,7 @@ MachineBasicBlock::iterator RISCVInstrInfo::insertOutlinedCall(
RISCVII::MO_CALL));
return It;
}
+
+bool RISCVInstrInfo::isSoteria() const {
+ return STI.hasExtSoteria();
+}
--- a/llvm/lib/Target/RISCV/RISCVInstrInfo.h
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.h
@@ -130,6 +130,8 @@ public:
insertOutlinedCall(Module &M, MachineBasicBlock &MBB,
MachineBasicBlock::iterator &It, MachineFunction &MF,
const outliner::Candidate &C) const override;
+ bool isSoteria() const;
+
protected:
const RISCVSubtarget &STI;
};
--- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td
@@ -1178,3 +1178,4 @@ include "RISCVInstrInfoD.td"
include "RISCVInstrInfoC.td"
include "RISCVInstrInfoB.td"
include "RISCVInstrInfoV.td"
+include "RISCVInstrInfoSoteria.td"
new file mode 100644
--- /dev/null
+++ b/llvm/lib/Target/RISCV/RISCVInstrInfoSoteria.td
@@ -0,0 +1,96 @@
+//===-- RISCVInstrInfoSoteria.td - Soteria instructions ----*- tablegen -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file describes the RISC-V instructions that are specific to the
+// Soteria architecture.
+//
+//===----------------------------------------------------------------------===//
+
+
+def OPC_GREV : RISCVOpcode<0b0101011>;
+def OPC_GREVI : RISCVOpcode<0b0001011>;
+def OPC_BITC : RISCVOpcode<0b0101011>;
+def OPC_BITCI : RISCVOpcode<0b0001011>;
+def OPC_BITS : RISCVOpcode<0b0101011>;
+def OPC_BITSI : RISCVOpcode<0b0001011>;
+def OPC_PCNT : RISCVOpcode<0b0001011>;
+def OPC_CLZ : RISCVOpcode<0b0001011>;
+def OPC_FLS : RISCVOpcode<0b0001011>;
+
+// Some Soteria specific instructions take 2 register operands with a normal R
+// style encoding.
+let mayLoad = 0, mayStore = 0, hasSideEffects = 0 in {
+class SoteriaInstR<bits<7> funct7, bits<3> funct3, RISCVOpcode opcode, string opcodestr>
+ : RVInstR<funct7, funct3, opcode, (outs GPR:$rd), (ins GPR:$rs1, GPR:$rs2), opcodestr, "$rd, $rs1, $rs2">;
+
+// Other soteria instructions take a single register operand and a 5 bit
+// immediate value.
+class SoteriaInstI<bits<7> funct7, bits<3> funct3, RISCVOpcode opcode, string opcodestr>
+ : RVInst<(outs GPR:$rd), (ins GPR:$rs1, uimm5:$imm5), opcodestr, "$rd, $rs1, $imm5", [], InstFormatOther> {
+ bits<5> rs1;
+ bits<5> imm5;
+ bits<5> rd;
+
+ let Inst{31-25} = funct7;
+ let Inst{24-20} = imm5;
+ let Inst{19-15} = rs1;
+ let Inst{14-12} = funct3;
+ let Inst{11-7} = rd;
+ let Opcode = opcode.Value;
+}
+
+// PCNT, CLZ and FLS instructions only have a single source operand.
+class SoteriaInst<bits<12> funct12, bits<3> funct3, RISCVOpcode opcode, string opcodestr>
+ : RVInst<(outs GPR:$rd), (ins GPR:$rs1), opcodestr, "$rd, $rs1", [], InstFormatOther> {
+ bits<5> rs1;
+ bits<5> rd;
+
+ let Inst{31-20} = funct12;
+ let Inst{19-15} = rs1;
+ let Inst{14-12} = funct3;
+ let Inst{11-7} = rd;
+ let Opcode = opcode.Value;
+}
+}
+
+let Predicates = [HasExtSoteria], hasNoSchedulingInfo = 1 in {
+def SOT_GREV : SoteriaInstR<0b0000000, 0b000, OPC_GREV, "grev">;
+def SOT_GREVI : SoteriaInstI<0b0000000, 0b000, OPC_GREVI, "grevi">;
+def SOT_BITC : SoteriaInstR<0b0000000, 0b001, OPC_BITC, "bitc">;
+def SOT_BITCI : SoteriaInstI<0b0000000, 0b001, OPC_BITCI, "bitci">;
+def SOT_BITS : SoteriaInstR<0b0100000, 0b001, OPC_BITS, "bits">;
+def SOT_BITSI : SoteriaInstI<0b0100000, 0b001, OPC_BITSI, "bitsi">;
+def SOT_PCNT : SoteriaInst<0b000000000000, 0b011, OPC_PCNT, "pcnt">;
+def SOT_CLZ : SoteriaInst<0b010000000000, 0b010, OPC_CLZ, "clz">;
+def SOT_FLS : SoteriaInst<0b000000000000, 0b010, OPC_FLS, "fls">;
+
+}
+
+let Predicates = [HasExtSoteria] in {
+def : Pat<(int_riscv_soteria_grev GPR:$rs1, GPR:$rs2),
+ (SOT_GREV GPR:$rs1, GPR:$rs2)>;
+def : Pat<(int_riscv_soteria_grev GPR:$rs1, uimm5:$imm5),
+ (SOT_GREVI GPR:$rs1, uimm5:$imm5)>;
+def : Pat<(int_riscv_soteria_bitc GPR:$rs1, GPR:$rs2),
+ (SOT_BITC GPR:$rs1, GPR:$rs2)>;
+def : Pat<(int_riscv_soteria_bitc GPR:$rs1, uimm5:$imm5),
+ (SOT_BITCI GPR:$rs1, uimm5:$imm5)>;
+def : Pat<(int_riscv_soteria_bits GPR:$rs1, GPR:$rs2),
+ (SOT_BITS GPR:$rs1, GPR:$rs2)>;
+def : Pat<(int_riscv_soteria_bits GPR:$rs1, uimm5:$imm5),
+ (SOT_BITSI GPR:$rs1, uimm5:$imm5)>;
+def : Pat<(ctpop GPR:$rs1), (SOT_PCNT GPR:$rs1)>;
+def : Pat<(ctlz GPR:$rs1), (SOT_CLZ GPR:$rs1)>;
+def : Pat<(int_riscv_soteria_fls GPR:$rs1), (SOT_FLS GPR:$rs1)>;
+
+def : Pat<(and (xor (shl 1, GPR:$rs2), -1), GPR:$rs1),
+ (SOT_BITC GPR:$rs1, GPR:$rs2)>;
+def : Pat<(or (shl 1, GPR:$rs2), GPR:$rs1),
+ (SOT_BITS GPR:$rs1, GPR:$rs2)>;
+}
+
--- a/llvm/lib/Target/RISCV/RISCVSubtarget.h
+++ b/llvm/lib/Target/RISCV/RISCVSubtarget.h
@@ -53,6 +53,7 @@ class RISCVSubtarget : public RISCVGenSubtargetInfo {
bool HasStdExtV = false;
bool HasRV64 = false;
bool IsRV32E = false;
+ bool HasExtSoteria = false;
bool EnableLinkerRelax = false;
bool EnableRVCHintInstrs = true;
bool EnableSaveRestore = false;
@@ -114,6 +115,7 @@ public:
bool hasStdExtV() const { return HasStdExtV; }
bool is64Bit() const { return HasRV64; }
bool isRV32E() const { return IsRV32E; }
+ bool hasExtSoteria() const { return HasExtSoteria; }
bool enableLinkerRelax() const { return EnableLinkerRelax; }
bool enableRVCHintInstrs() const { return EnableRVCHintInstrs; }
bool enableSaveRestore() const { return EnableSaveRestore; }
--- a/llvm/lib/Target/RISCV/RISCVSystemOperands.td
+++ b/llvm/lib/Target/RISCV/RISCVSystemOperands.td
@@ -370,3 +370,6 @@ def : SysReg<"vxrm", 0x00A>;
def : SysReg<"vl", 0xC20>;
def : SysReg<"vtype", 0xC21>;
def : SysReg<"vlenb", 0xC22>;
+
+include "SoteriaSystemOperands.td"
+
new file mode 100644
--- /dev/null
+++ b/llvm/lib/Target/RISCV/SoteriaSystemOperands.td
@@ -0,0 +1,51 @@
+//===-----------------------------------------------
+// Soteria Non-Standard CSRs
+//===-----------------------------------------------
+def : SysReg<"mgpscratch0", 0x7C0>;
+def : SysReg<"mgpscratch1", 0x7C1>;
+def : SysReg<"mgpscratch2", 0x7C2>;
+def : SysReg<"mgpscratch3", 0x7C3>;
+def : SysReg<"mgpscratch4", 0x7C4>;
+def : SysReg<"mgpscratch5", 0x7C5>;
+def : SysReg<"mgpscratch6", 0x7C6>;
+def : SysReg<"mgpscratch7", 0x7C7>;
+def : SysReg<"mgpscratch8", 0x7C8>;
+def : SysReg<"mgpscratch9", 0x7C9>;
+def : SysReg<"mgpscratch10", 0x7CA>;
+def : SysReg<"mgpscratch11", 0x7CB>;
+def : SysReg<"mgpscratch12", 0x7CC>;
+def : SysReg<"mgpscratch13", 0x7CD>;
+def : SysReg<"mgpscratch14", 0x7CE>;
+def : SysReg<"mgpscratch15", 0x7CF>;
+def : SysReg<"mnmivec", 0x7D0>;
+def : SysReg<"ualert", 0x802>;
+
+//===-----------------------------------------------
+// Soteria Attack Countermeasure CSRs
+//===-----------------------------------------------
+def : SysReg<"mx0", 0xBC0>;
+
+//===-----------------------------------------------
+// Soteria Control Flow Integrity CSRs
+//===-----------------------------------------------
+def : SysReg<"ucfic", 0x807>;
+def : SysReg<"ucfiseed0", 0x803>;
+def : SysReg<"ucfiseed1", 0x80A>;
+def : SysReg<"ucfichk0", 0x80E>;
+def : SysReg<"ucfichk1", 0x806>;
+def : SysReg<"ucfimix0", 0x805>;
+def : SysReg<"ucfimix1", 0x801>;
+def : SysReg<"ucfisave0", 0x804>;
+def : SysReg<"ucfisave1", 0x80F>;
+
+//===-----------------------------------------------
+// Soteria Pseudorandom Decoy Instruction CSRs
+//===-----------------------------------------------
+def : SysReg<"mpigrate", 0xBC9>;
+def : SysReg<"mpigseed0", 0xBCE>;
+def : SysReg<"mpigseed1", 0xBCC>;
+
+//===-----------------------------------------------
+// Soteria Machine State Wipe
+//===-----------------------------------------------
+def : SysReg<"uswc", 0x800>;
\ No newline at end of file
new file mode 100644
--- /dev/null
+++ b/llvm/test/CodeGen/RISCV/builtins-soteria.ll
@@ -0,0 +1,94 @@
+; RUN: llc -O3 -verify-machineinstrs --show-mc-encoding < %s \
+; RUN: | FileCheck %s -check-prefix=RV32S
+
+target datalayout = "e-m:e-p:32:32-i64:64-n32-S128"
+target triple = "riscv32-unknown-unknown-elf"
+
+define dso_local i32 @grev(i32 %a, i32 %b) local_unnamed_addr #0 {
+; RV32S-LABEL: grev:
+entry:
+ %0 = tail call i32 @llvm.riscv.soteria.grev(i32 %a, i32 %b)
+ ; RV32S: grev a0, a0, a1 # encoding: [0x2b,0x05,0xb5,0x00]
+ ret i32 %0
+}
+
+define dso_local i32 @grevi(i32 %a) local_unnamed_addr #0 {
+; RV32S-LABEL: grevi:
+entry:
+ %0 = tail call i32 @llvm.riscv.soteria.grev(i32 %a, i32 16)
+ ; RV32S: grevi a0, a0, 16 # encoding: [0x0b,0x05,0x05,0x01]
+ ret i32 %0
+}
+
+define dso_local i32 @bitc(i32 %a, i32 %b) local_unnamed_addr #0 {
+; RV32S-LABEL: bitc:
+entry:
+ %0 = tail call i32 @llvm.riscv.soteria.bitc(i32 %a, i32 %b)
+ ; RV32S: bitc a0, a0, a1 # encoding: [0x2b,0x15,0xb5,0x00]
+ ret i32 %0
+}
+
+define dso_local i32 @bitci(i32 %a) local_unnamed_addr #0 {
+; RV32S-LABEL: bitci:
+entry:
+ %0 = tail call i32 @llvm.riscv.soteria.bitc(i32 %a, i32 18)
+ ; RV32S: bitci a0, a0, 18 # encoding: [0x0b,0x15,0x25,0x01]
+ ret i32 %0
+}
+
+define dso_local i32 @bits(i32 %a, i32 %b) local_unnamed_addr #0 {
+; RV32S-LABEL: bits:
+entry:
+ %0 = tail call i32 @llvm.riscv.soteria.bits(i32 %a, i32 %b)
+ ; RV32S: bits a0, a0, a1 # encoding: [0x2b,0x15,0xb5,0x40]
+ ret i32 %0
+}
+
+define dso_local i32 @bitsi(i32 %a) local_unnamed_addr #0 {
+; RV32S-LABEL: bitsi:
+entry:
+ %0 = tail call i32 @llvm.riscv.soteria.bits(i32 %a, i32 31)
+ ; RV32S: bitsi a0, a0, 31 # encoding: [0x0b,0x15,0xf5,0x41]
+ ret i32 %0
+}
+
+define dso_local i32 @pcnt(i32 %a) local_unnamed_addr #0 {
+; RV32S-LABEL: pcnt:
+entry:
+ %0 = tail call i32 @llvm.ctpop.i32(i32 %a), !range !3
+ ; RV32S: pcnt a0, a0 # encoding: [0x0b,0x35,0x05,0x00]
+ ret i32 %0
+}
+
+define dso_local i32 @clz(i32 %a) local_unnamed_addr #0 {
+; RV32S-LABEL: clz:
+entry:
+ %0 = tail call i32 @llvm.ctlz.i32(i32 %a, i1 true), !range !3
+ ; RV32S: clz a0, a0 # encoding: [0x0b,0x25,0x05,0x40]
+ ret i32 %0
+}
+
+define dso_local i32 @fls(i32 %a) local_unnamed_addr #0 {
+; RV32S-LABEL: fls:
+entry:
+ %0 = tail call i32 @llvm.riscv.soteria.fls(i32 %a)
+ ; RV32S: fls a0, a0 # encoding: [0x0b,0x25,0x05,0x00]
+ ret i32 %0
+}
+
+declare i32 @llvm.riscv.soteria.grev(i32, i32) #1
+declare i32 @llvm.riscv.soteria.bitc(i32, i32) #1
+declare i32 @llvm.riscv.soteria.bits(i32, i32) #1
+declare i32 @llvm.ctpop.i32(i32) #1
+declare i32 @llvm.ctlz.i32(i32, i1 immarg) #1
+declare i32 @llvm.riscv.soteria.fls(i32) #1
+
+attributes #0 = { nounwind readnone "target-features"="+c,+m,+relax,+xsoteria" }
+attributes #1 = { nounwind readnone }
+
+!llvm.module.flags = !{!0, !1}
+
+!0 = !{i32 1, !"wchar_size", i32 4}
+!1 = !{i32 1, !"target-abi", !"ilp32"}
+!3 = !{i32 0, i32 33}
+
new file mode 100644
--- /dev/null
+++ b/llvm/test/MC/RISCV/soteria-csr-names.s
@@ -0,0 +1,488 @@
+# RUN: llvm-mc %s -triple=riscv32 -riscv-no-aliases -show-encoding \
+# RUN: | FileCheck -check-prefixes=CHECK-INST,CHECK-ENC %s
+# RUN: llvm-mc -filetype=obj -triple riscv32 < %s \
+# RUN: | llvm-objdump -d - \
+# RUN: | FileCheck -check-prefix=CHECK-INST-ALIAS %s
+
+###################################################
+# Soteria Non-Standard CSRs
+###################################################
+
+# mgpscratch0
+# name
+# CHECK-INST: csrrs t1, mgpscratch0, zero
+# CHECK-ENC: encoding: [0x73,0x23,0x00,0x7c]
+# CHECK-INST-ALIAS: csrr t1, mgpscratch0
+# uimm12
+# CHECK-INST: csrrs t2, mgpscratch0, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0x00,0x7c]
+# CHECK-INST-ALIAS: csrr t2, mgpscratch0
+# name
+csrrs t1, mgpscratch0, zero
+# uimm12
+csrrs t2, 0x7C0, zero
+
+# mgpscratch1
+# name
+# CHECK-INST: csrrs t1, mgpscratch1, zero
+# CHECK-ENC: encoding: [0x73,0x23,0x10,0x7c]
+# CHECK-INST-ALIAS: csrr t1, mgpscratch1
+# uimm12
+# CHECK-INST: csrrs t2, mgpscratch1, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0x10,0x7c]
+# CHECK-INST-ALIAS: csrr t2, mgpscratch1
+# name
+csrrs t1, mgpscratch1, zero
+# uimm12
+csrrs t2, 0x7C1, zero
+
+# mgpscratch2
+# name
+# CHECK-INST: csrrs t1, mgpscratch2, zero
+# CHECK-ENC: encoding: [0x73,0x23,0x20,0x7c]
+# CHECK-INST-ALIAS: csrr t1, mgpscratch2
+# uimm12
+# CHECK-INST: csrrs t2, mgpscratch2, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0x20,0x7c]
+# CHECK-INST-ALIAS: csrr t2, mgpscratch2
+# name
+csrrs t1, mgpscratch2, zero
+# uimm12
+csrrs t2, 0x7C2, zero
+
+# mgpscratch3
+# name
+# CHECK-INST: csrrs t1, mgpscratch3, zero
+# CHECK-ENC: encoding: [0x73,0x23,0x30,0x7c]
+# CHECK-INST-ALIAS: csrr t1, mgpscratch3
+# uimm12
+# CHECK-INST: csrrs t2, mgpscratch3, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0x30,0x7c]
+# CHECK-INST-ALIAS: csrr t2, mgpscratch3
+# name
+csrrs t1, mgpscratch3, zero
+# uimm12
+csrrs t2, 0x7C3, zero
+
+# mgpscratch4
+# name
+# CHECK-INST: csrrs t1, mgpscratch4, zero
+# CHECK-ENC: encoding: [0x73,0x23,0x40,0x7c]
+# CHECK-INST-ALIAS: csrr t1, mgpscratch4
+# uimm12
+# CHECK-INST: csrrs t2, mgpscratch4, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0x40,0x7c]
+# CHECK-INST-ALIAS: csrr t2, mgpscratch4
+# name
+csrrs t1, mgpscratch4, zero
+# uimm12
+csrrs t2, 0x7C4, zero
+
+# mgpscratch5
+# name
+# CHECK-INST: csrrs t1, mgpscratch5, zero
+# CHECK-ENC: encoding: [0x73,0x23,0x50,0x7c]
+# CHECK-INST-ALIAS: csrr t1, mgpscratch5
+# uimm12
+# CHECK-INST: csrrs t2, mgpscratch5, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0x50,0x7c]
+# CHECK-INST-ALIAS: csrr t2, mgpscratch5
+# name
+csrrs t1, mgpscratch5, zero
+# uimm12
+csrrs t2, 0x7C5, zero
+
+# mgpscratch6
+# name
+# CHECK-INST: csrrs t1, mgpscratch6, zero
+# CHECK-ENC: encoding: [0x73,0x23,0x60,0x7c]
+# CHECK-INST-ALIAS: csrr t1, mgpscratch6
+# uimm12
+# CHECK-INST: csrrs t2, mgpscratch6, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0x60,0x7c]
+# CHECK-INST-ALIAS: csrr t2, mgpscratch6
+# name
+csrrs t1, mgpscratch6, zero
+# uimm12
+csrrs t2, 0x7C6, zero
+
+# mgpscratch7
+# name
+# CHECK-INST: csrrs t1, mgpscratch7, zero
+# CHECK-ENC: encoding: [0x73,0x23,0x70,0x7c]
+# CHECK-INST-ALIAS: csrr t1, mgpscratch7
+# uimm12
+# CHECK-INST: csrrs t2, mgpscratch7, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0x70,0x7c]
+# CHECK-INST-ALIAS: csrr t2, mgpscratch7
+# name
+csrrs t1, mgpscratch7, zero
+# uimm12
+csrrs t2, 0x7C7, zero
+
+# mgpscratch8
+# name
+# CHECK-INST: csrrs t1, mgpscratch8, zero
+# CHECK-ENC: encoding: [0x73,0x23,0x80,0x7c]
+# CHECK-INST-ALIAS: csrr t1, mgpscratch8
+# uimm12
+# CHECK-INST: csrrs t2, mgpscratch8, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0x80,0x7c]
+# CHECK-INST-ALIAS: csrr t2, mgpscratch8
+# name
+csrrs t1, mgpscratch8, zero
+# uimm12
+csrrs t2, 0x7C8, zero
+
+# mgpscratch9
+# name
+# CHECK-INST: csrrs t1, mgpscratch9, zero
+# CHECK-ENC: encoding: [0x73,0x23,0x90,0x7c]
+# CHECK-INST-ALIAS: csrr t1, mgpscratch9
+# uimm12
+# CHECK-INST: csrrs t2, mgpscratch9, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0x90,0x7c]
+# CHECK-INST-ALIAS: csrr t2, mgpscratch9
+# name
+csrrs t1, mgpscratch9, zero
+# uimm12
+csrrs t2, 0x7C9, zero
+
+# mgpscratch10
+# name
+# CHECK-INST: csrrs t1, mgpscratch10, zero
+# CHECK-ENC: encoding: [0x73,0x23,0xa0,0x7c]
+# CHECK-INST-ALIAS: csrr t1, mgpscratch10
+# uimm12
+# CHECK-INST: csrrs t2, mgpscratch10, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0xa0,0x7c]
+# CHECK-INST-ALIAS: csrr t2, mgpscratch10
+# name
+csrrs t1, mgpscratch10, zero
+# uimm12
+csrrs t2, 0x7CA, zero
+
+# mgpscratch11
+# name
+# CHECK-INST: csrrs t1, mgpscratch11, zero
+# CHECK-ENC: encoding: [0x73,0x23,0xb0,0x7c]
+# CHECK-INST-ALIAS: csrr t1, mgpscratch11
+# uimm12
+# CHECK-INST: csrrs t2, mgpscratch11, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0xb0,0x7c]
+# CHECK-INST-ALIAS: csrr t2, mgpscratch11
+# name
+csrrs t1, mgpscratch11, zero
+# uimm12
+csrrs t2, 0x7CB, zero
+
+# mgpscratch12
+# name
+# CHECK-INST: csrrs t1, mgpscratch12, zero
+# CHECK-ENC: encoding: [0x73,0x23,0xc0,0x7c]
+# CHECK-INST-ALIAS: csrr t1, mgpscratch12
+# uimm12
+# CHECK-INST: csrrs t2, mgpscratch12, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0xc0,0x7c]
+# CHECK-INST-ALIAS: csrr t2, mgpscratch12
+# name
+csrrs t1, mgpscratch12, zero
+# uimm12
+csrrs t2, 0x7CC, zero
+
+# mgpscratch13
+# name
+# CHECK-INST: csrrs t1, mgpscratch13, zero
+# CHECK-ENC: encoding: [0x73,0x23,0xd0,0x7c]
+# CHECK-INST-ALIAS: csrr t1, mgpscratch13
+# uimm12
+# CHECK-INST: csrrs t2, mgpscratch13, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0xd0,0x7c]
+# CHECK-INST-ALIAS: csrr t2, mgpscratch13
+# name
+csrrs t1, mgpscratch13, zero
+# uimm12
+csrrs t2, 0x7CD, zero
+
+# mgpscratch14
+# name
+# CHECK-INST: csrrs t1, mgpscratch14, zero
+# CHECK-ENC: encoding: [0x73,0x23,0xe0,0x7c]
+# CHECK-INST-ALIAS: csrr t1, mgpscratch14
+# uimm12
+# CHECK-INST: csrrs t2, mgpscratch14, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0xe0,0x7c]
+# CHECK-INST-ALIAS: csrr t2, mgpscratch14
+# name
+csrrs t1, mgpscratch14, zero
+# uimm12
+csrrs t2, 0x7CE, zero
+
+# mgpscratch15
+# name
+# CHECK-INST: csrrs t1, mgpscratch15, zero
+# CHECK-ENC: encoding: [0x73,0x23,0xf0,0x7c]
+# CHECK-INST-ALIAS: csrr t1, mgpscratch15
+# uimm12
+# CHECK-INST: csrrs t2, mgpscratch15, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0xf0,0x7c]
+# CHECK-INST-ALIAS: csrr t2, mgpscratch15
+# name
+csrrs t1, mgpscratch15, zero
+# uimm12
+csrrs t2, 0x7CF, zero
+
+# mnmivec
+# name
+# CHECK-INST: csrrs t1, mnmivec, zero
+# CHECK-ENC: encoding: [0x73,0x23,0x00,0x7d]
+# CHECK-INST-ALIAS: csrr t1, mnmivec
+# uimm12
+# CHECK-INST: csrrs t2, mnmivec, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0x00,0x7d]
+# CHECK-INST-ALIAS: csrr t2, mnmivec
+# name
+csrrs t1, mnmivec, zero
+# uimm12
+csrrs t2, 0x7D0, zero
+
+# ualert
+# name
+# CHECK-INST: csrrs t1, ualert, zero
+# CHECK-ENC: encoding: [0x73,0x23,0x20,0x80]
+# CHECK-INST-ALIAS: csrr t1, ualert
+# uimm12
+# CHECK-INST: csrrs t2, ualert, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0x20,0x80]
+# CHECK-INST-ALIAS: csrr t2, ualert
+# name
+csrrs t1, ualert, zero
+# uimm12
+csrrs t2, 0x802, zero
+
+
+###################################################
+# Soteria Attack Countermeasure CSRs
+###################################################
+
+# mx0
+# name
+# CHECK-INST: csrrs t1, mx0, zero
+# CHECK-ENC: encoding: [0x73,0x23,0x00,0xbc]
+# CHECK-INST-ALIAS: csrr t1, mx0
+# uimm12
+# CHECK-INST: csrrs t2, mx0, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0x00,0xbc]
+# CHECK-INST-ALIAS: csrr t2, mx0
+# name
+csrrs t1, mx0, zero
+# uimm12
+csrrs t2, 0xBC0, zero
+
+###################################################
+# Soteria Control Flow Integrity CSRs
+###################################################
+
+# ucfic
+# name
+# CHECK-INST: csrrs t1, ucfic, zero
+# CHECK-ENC: encoding: [0x73,0x23,0x70,0x80]
+# CHECK-INST-ALIAS: csrr t1, ucfic
+# uimm12
+# CHECK-INST: csrrs t2, ucfic, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0x70,0x80]
+# CHECK-INST-ALIAS: csrr t2, ucfic
+# name
+csrrs t1, ucfic, zero
+# uimm12
+csrrs t2, 0x807, zero
+
+# ucfiseed0
+# name
+# CHECK-INST: csrrs t1, ucfiseed0, zero
+# CHECK-ENC: encoding: [0x73,0x23,0x30,0x80]
+# CHECK-INST-ALIAS: csrr t1, ucfiseed0
+# uimm12
+# CHECK-INST: csrrs t2, ucfiseed0, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0x30,0x80]
+# CHECK-INST-ALIAS: csrr t2, ucfiseed0
+# name
+csrrs t1, ucfiseed0, zero
+# uimm12
+csrrs t2, 0x803, zero
+
+# ucfiseed1
+# name
+# CHECK-INST: csrrs t1, ucfiseed1, zero
+# CHECK-ENC: encoding: [0x73,0x23,0xa0,0x80]
+# CHECK-INST-ALIAS: csrr t1, ucfiseed1
+# uimm12
+# CHECK-INST: csrrs t2, ucfiseed1, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0xa0,0x80]
+# CHECK-INST-ALIAS: csrr t2, ucfiseed1
+# name
+csrrs t1, ucfiseed1, zero
+# uimm12
+csrrs t2, 0x80A, zero
+
+# ucfichk0
+# name
+# CHECK-INST: csrrs t1, ucfichk0, zero
+# CHECK-ENC: encoding: [0x73,0x23,0xe0,0x80]
+# CHECK-INST-ALIAS: csrr t1, ucfichk0
+# uimm12
+# CHECK-INST: csrrs t2, ucfichk0, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0xe0,0x80]
+# CHECK-INST-ALIAS: csrr t2, ucfichk0
+# name
+csrrs t1, ucfichk0, zero
+# uimm12
+csrrs t2, 0x80E, zero
+
+# ucfichk1
+# name
+# CHECK-INST: csrrs t1, ucfichk1, zero
+# CHECK-ENC: encoding: [0x73,0x23,0x60,0x80]
+# CHECK-INST-ALIAS: csrr t1, ucfichk1
+# uimm12
+# CHECK-INST: csrrs t2, ucfichk1, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0x60,0x80]
+# CHECK-INST-ALIAS: csrr t2, ucfichk1
+# name
+csrrs t1, ucfichk1, zero
+# uimm12
+csrrs t2, 0x806, zero
+
+# ucfimix0
+# name
+# CHECK-INST: csrrs t1, ucfimix0, zero
+# CHECK-ENC: encoding: [0x73,0x23,0x50,0x80]
+# CHECK-INST-ALIAS: csrr t1, ucfimix0
+# uimm12
+# CHECK-INST: csrrs t2, ucfimix0, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0x50,0x80]
+# CHECK-INST-ALIAS: csrr t2, ucfimix0
+# name
+csrrs t1, ucfimix0, zero
+# uimm12
+csrrs t2, 0x805, zero
+
+# ucfimix1
+# name
+# CHECK-INST: csrrs t1, ucfimix1, zero
+# CHECK-ENC: encoding: [0x73,0x23,0x10,0x80]
+# CHECK-INST-ALIAS: csrr t1, ucfimix1
+# uimm12
+# CHECK-INST: csrrs t2, ucfimix1, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0x10,0x80]
+# CHECK-INST-ALIAS: csrr t2, ucfimix1
+# name
+csrrs t1, ucfimix1, zero
+# uimm12
+csrrs t2, 0x801, zero
+
+# ucfisave0
+# name
+# CHECK-INST: csrrs t1, ucfisave0, zero
+# CHECK-ENC: encoding: [0x73,0x23,0x40,0x80]
+# CHECK-INST-ALIAS: csrr t1, ucfisave0
+# uimm12
+# CHECK-INST: csrrs t2, ucfisave0, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0x40,0x80]
+# CHECK-INST-ALIAS: csrr t2, ucfisave0
+# name
+csrrs t1, ucfisave0, zero
+# uimm12
+csrrs t2, 0x804, zero
+
+# ucfisave0
+# name
+# CHECK-INST: csrrs t1, ucfisave0, zero
+# CHECK-ENC: encoding: [0x73,0x23,0x40,0x80]
+# CHECK-INST-ALIAS: csrr t1, ucfisave0
+# uimm12
+# CHECK-INST: csrrs t2, ucfisave0, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0x40,0x80]
+# CHECK-INST-ALIAS: csrr t2, ucfisave0
+# name
+csrrs t1, ucfisave0, zero
+# uimm12
+csrrs t2, 0x804, zero
+
+# ucfisave1
+# name
+# CHECK-INST: csrrs t1, ucfisave1, zero
+# CHECK-ENC: encoding: [0x73,0x23,0xf0,0x80]
+# CHECK-INST-ALIAS: csrr t1, ucfisave1
+# uimm12
+# CHECK-INST: csrrs t2, ucfisave1, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0xf0,0x80]
+# CHECK-INST-ALIAS: csrr t2, ucfisave1
+# name
+csrrs t1, ucfisave1, zero
+# uimm12
+csrrs t2, 0x80F, zero
+
+###################################################
+# Soteria Pseudorandom Decoy Instruction CSRs
+###################################################
+
+# mpigrate
+# name
+# CHECK-INST: csrrs t1, mpigrate, zero
+# CHECK-ENC: encoding: [0x73,0x23,0x90,0xbc]
+# CHECK-INST-ALIAS: csrr t1, mpigrate
+# uimm12
+# CHECK-INST: csrrs t2, mpigrate, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0x90,0xbc]
+# CHECK-INST-ALIAS: csrr t2, mpigrate
+# name
+csrrs t1, mpigrate, zero
+# uimm12
+csrrs t2, 0xBC9, zero
+
+# mpigseed0
+# name
+# CHECK-INST: csrrs t1, mpigseed0, zero
+# CHECK-ENC: encoding: [0x73,0x23,0xe0,0xbc]
+# CHECK-INST-ALIAS: csrr t1, mpigseed0
+# uimm12
+# CHECK-INST: csrrs t2, mpigseed0, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0xe0,0xbc]
+# CHECK-INST-ALIAS: csrr t2, mpigseed0
+# name
+csrrs t1, mpigseed0, zero
+# uimm12
+csrrs t2, 0xBCE, zero
+
+# mpigseed1
+# name
+# CHECK-INST: csrrs t1, mpigseed1, zero
+# CHECK-ENC: encoding: [0x73,0x23,0xc0,0xbc]
+# CHECK-INST-ALIAS: csrr t1, mpigseed1
+# uimm12
+# CHECK-INST: csrrs t2, mpigseed1, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0xc0,0xbc]
+# CHECK-INST-ALIAS: csrr t2, mpigseed1
+# name
+csrrs t1, mpigseed1, zero
+# uimm12
+csrrs t2, 0xBCC, zero
+
+###################################################
+# Soteria Machine State Wipe
+###################################################
+
+# uswc
+# name
+# CHECK-INST: csrrs t1, uswc, zero
+# CHECK-ENC: encoding: [0x73,0x23,0x00,0x80]
+# CHECK-INST-ALIAS: csrr t1, uswc
+# uimm12
+# CHECK-INST: csrrs t2, uswc, zero
+# CHECK-ENC: encoding: [0xf3,0x23,0x00,0x80]
+# CHECK-INST-ALIAS: csrr t2, uswc
+# name
+csrrs t1, uswc, zero
+# uimm12
+csrrs t2, 0x800, zero
--- a/llvm/tools/llvm-readobj/ELFDumper.cpp
+++ b/llvm/tools/llvm-readobj/ELFDumper.cpp
@@ -1855,7 +1855,8 @@ static const EnumEntry<unsigned> ElfHeaderRISCVFlags[] = {
ENUM_ENT(EF_RISCV_FLOAT_ABI_SINGLE, "single-float ABI"),
ENUM_ENT(EF_RISCV_FLOAT_ABI_DOUBLE, "double-float ABI"),
ENUM_ENT(EF_RISCV_FLOAT_ABI_QUAD, "quad-float ABI"),
- ENUM_ENT(EF_RISCV_RVE, "RVE")
+ ENUM_ENT(EF_RISCV_RVE, "RVE"),
+ ENUM_ENT(EF_RISCV_SOTERIA, "Soteria")
};
static const EnumEntry<unsigned> ElfSymOtherFlags[] = {