diff options
| author | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-16 15:39:45 +0800 |
|---|---|---|
| committer | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-16 15:39:45 +0800 |
| commit | 4f7b41c3c711d6c6fa4e422f3eec8961c91eea7a (patch) | |
| tree | a825927a4a3ef91ec6e3489aa1f96e63788ff476 | |
| parent | a39d8f6f4ed2ad0f8435b73bd6b2a35769c6fead (diff) | |
| download | rcc-project-4f7b41c3c711d6c6fa4e422f3eec8961c91eea7a.tar.gz rcc-project-4f7b41c3c711d6c6fa4e422f3eec8961c91eea7a.tar.xz | |
tablegen: Generate GlobalISel match tables
28 files changed, 5272 insertions, 4103 deletions
diff --git a/backend/include/rcc/CodeGen/GlobalISel/GIMatchTableExecutor.h b/backend/include/rcc/CodeGen/GlobalISel/GIMatchTableExecutor.h new file mode 100644 index 0000000..807cb4a --- /dev/null +++ b/backend/include/rcc/CodeGen/GlobalISel/GIMatchTableExecutor.h @@ -0,0 +1,70 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +#ifndef RCC_CODEGEN_GLOBALISEL_GIMATCHTABLEEXECUTOR_H +#define RCC_CODEGEN_GLOBALISEL_GIMATCHTABLEEXECUTOR_H + +#include "rcc/CodeGen/MachineIRTypes.h" +#include "rcc/Support/Error.h" + +#include <cstdint> +#include <span> +#include <string_view> + +namespace rcc { + +class MachineFunction; +class MachineInstr; +class TargetDescription; + +enum class GIMatchTypeKind : std::uint8_t { + Any, + Scalar, + Pointer, +}; + +enum class GIMatchTableOpcode : std::uint8_t { + CheckOpcode, + CheckOperandType, + CheckOperandBank, + CheckOperandClass, + MutateOpcode, + AppendImmediate, + Complete, +}; + +struct GIMatchTableInstruction final { + GIMatchTableOpcode Opcode = GIMatchTableOpcode::Complete; + std::uint16_t OperandIndex = 0; + std::uint32_t Value = 0; + std::uint32_t Auxiliary = 0; + std::int64_t Immediate = 0; +}; + +struct GIMatchTableRule final { + std::string_view Name; + std::uint32_t Priority = 0; + std::uint32_t FirstInstruction = 0; + std::uint32_t InstructionCount = 0; +}; + +struct GIMatchTable final { + std::span<const GIMatchTableInstruction> Instructions; + std::span<const GIMatchTableRule> Rules; +}; + +class GIMatchTableExecutor { +public: + [[nodiscard]] Expected<bool> match(const GIMatchTable &Table, const MachineInstr &Instruction, + const MachineFunction &Function, + const TargetDescription &Target) const; + + // A false result means that no table rule matched. The executor completes all + // predicates before applying the selected rule to MachineIR. + [[nodiscard]] Expected<bool> select(const GIMatchTable &Table, MachineInstr &Instruction, + MachineFunction &Function, + const TargetDescription &Target) const; +}; + +} // namespace rcc + +#endif // RCC_CODEGEN_GLOBALISEL_GIMATCHTABLEEXECUTOR_H diff --git a/backend/include/rcc/CodeGen/GlobalISel/InstructionSelector.h b/backend/include/rcc/CodeGen/GlobalISel/InstructionSelector.h index 4bea4e7..36fca8d 100644 --- a/backend/include/rcc/CodeGen/GlobalISel/InstructionSelector.h +++ b/backend/include/rcc/CodeGen/GlobalISel/InstructionSelector.h @@ -3,7 +3,7 @@ #ifndef RCC_CODEGEN_GLOBALISEL_INSTRUCTIONSELECTOR_H #define RCC_CODEGEN_GLOBALISEL_INSTRUCTIONSELECTOR_H -#include "rcc/CodeGen/MachineIRTypes.h" +#include "rcc/CodeGen/GlobalISel/GIMatchTableExecutor.h" #include "rcc/Support/Error.h" namespace rcc { @@ -12,7 +12,7 @@ class MachineFunction; class MachineInstr; class TargetDescription; -class InstructionSelector { +class InstructionSelector : public GIMatchTableExecutor { public: virtual ~InstructionSelector() = default; diff --git a/backend/include/rcc/TableGen/Record.h b/backend/include/rcc/TableGen/Record.h index 50ac4c9..94308c7 100644 --- a/backend/include/rcc/TableGen/Record.h +++ b/backend/include/rcc/TableGen/Record.h @@ -205,6 +205,43 @@ struct SourceInstruction final { TextRange Range; }; +struct SourceSelectionTypePredicate final { + std::string Kind; + std::uint32_t Bits = 0; + TextRange Range; +}; + +struct SourceSelectionOperandTypePredicate final { + std::uint32_t OperandIndex = 0; + SourceSelectionTypePredicate Type; + TextRange Range; +}; + +struct SourceSelectionOperandBankPredicate final { + std::uint32_t OperandIndex = 0; + std::string BankSymbol; + TextRange Range; +}; + +struct SourceSelectionOperandClassPredicate final { + std::uint32_t OperandIndex = 0; + std::string ClassSymbol; + TextRange Range; +}; + +struct SourceSelectionRule final { + std::string Symbol; + std::uint32_t Priority = 0; + std::string MatchOpcodeSymbol; + std::optional<SourceSelectionTypePredicate> ResultType; + std::vector<SourceSelectionOperandTypePredicate> OperandTypes; + std::vector<SourceSelectionOperandBankPredicate> OperandBanks; + std::vector<SourceSelectionOperandClassPredicate> OperandClasses; + std::string ResultOpcodeSymbol; + std::vector<std::int64_t> AppendedImmediates; + TextRange Range; +}; + struct DescriptionAST final { SourceTarget Target; std::vector<SourceRegisterUnit> RegisterUnits; @@ -220,6 +257,7 @@ struct DescriptionAST final { std::vector<SourceEncodingCategory> EncodingCategories; std::vector<SourceAssemblyFormat> AssemblyFormats; std::vector<SourceInstruction> Instructions; + std::vector<SourceSelectionRule> SelectionRules; }; [[nodiscard]] std::string lowerASCII(std::string_view Value); diff --git a/backend/lib/CodeGen/GlobalISel/CMakeLists.txt b/backend/lib/CodeGen/GlobalISel/CMakeLists.txt index 8fc50d2..5e3c33f 100644 --- a/backend/lib/CodeGen/GlobalISel/CMakeLists.txt +++ b/backend/lib/CodeGen/GlobalISel/CMakeLists.txt @@ -4,6 +4,7 @@ set( RCCBackendGlobalISelSources CSEInfo.cpp CSEMIRBuilder.cpp + GIMatchTableExecutor.cpp GISelChangeObserver.cpp GISelValueTracking.cpp InstructionSelect.cpp @@ -18,6 +19,7 @@ set( RCCBackendGlobalISelHeaders "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/GlobalISel/CSEInfo.h" "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/GlobalISel/CSEMIRBuilder.h" + "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/GlobalISel/GIMatchTableExecutor.h" "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/GlobalISel/GISelChangeObserver.h" "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/GlobalISel/GISelValueTracking.h" "${RCC_BACKEND_SOURCE_DIR}/include/rcc/CodeGen/GlobalISel/GISelWorkList.h" @@ -37,6 +39,7 @@ target_sources(RCCBackendCodeGen PRIVATE ${RCCBackendGlobalISelSources}) rcc_backend_register_format_files( "${CMAKE_CURRENT_SOURCE_DIR}/CSEInfo.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/CSEMIRBuilder.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/GIMatchTableExecutor.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/GISelChangeObserver.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/GISelValueTracking.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/InstructionSelect.cpp" @@ -51,6 +54,7 @@ rcc_backend_register_format_files( rcc_backend_register_tidy_files( "${CMAKE_CURRENT_SOURCE_DIR}/CSEInfo.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/CSEMIRBuilder.cpp" + "${CMAKE_CURRENT_SOURCE_DIR}/GIMatchTableExecutor.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/GISelChangeObserver.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/GISelValueTracking.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/InstructionSelect.cpp" diff --git a/backend/lib/CodeGen/GlobalISel/GIMatchTableExecutor.cpp b/backend/lib/CodeGen/GlobalISel/GIMatchTableExecutor.cpp new file mode 100644 index 0000000..a195d11 --- /dev/null +++ b/backend/lib/CodeGen/GlobalISel/GIMatchTableExecutor.cpp @@ -0,0 +1,251 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "rcc/CodeGen/GlobalISel/GIMatchTableExecutor.h" + +#include "rcc/CodeGen/LowLevelType.h" +#include "rcc/CodeGen/MachineFunction.h" +#include "rcc/CodeGen/MachineInstr.h" +#include "rcc/CodeGen/MachineOperand.h" +#include "rcc/CodeGen/MachineRegisterInfo.h" +#include "rcc/CodeGen/TargetDescription.h" + +#include <cstddef> +#include <optional> +#include <vector> + +namespace rcc { +namespace { + +[[nodiscard]] Expected<std::optional<LowLevelType>> operandType(const MachineInstr &Instruction, + const MachineFunction &Function, + std::size_t OperandIndex) { + const MachineOperand *Operand = Instruction.operandAt(OperandIndex); + const Register *Reg = Operand == nullptr ? nullptr : Operand->getIf<Register>(); + if (Reg == nullptr || !Reg->isVirtual()) + return std::optional<LowLevelType>{}; + auto Info = Function.registerInfo().virtualRegisterInfo(*Reg); + if (!Info) + return std::unexpected(Info.error()); + return Info->get().Type; +} + +[[nodiscard]] Expected<bool> matchesType(const MachineInstr &Instruction, + const MachineFunction &Function, + const GIMatchTableInstruction &Step) { + auto Type = operandType(Instruction, Function, Step.OperandIndex); + if (!Type) + return std::unexpected(Type.error()); + if (!*Type) + return false; + + const auto Kind = static_cast<GIMatchTypeKind>(Step.Auxiliary); + switch (Kind) { + case GIMatchTypeKind::Any: + return Step.Value == 0 || (*Type)->scalarBitWidth() == Step.Value; + case GIMatchTypeKind::Scalar: + return (*Type)->isCategoryNeutralScalar() && (*Type)->scalarBitWidth() == Step.Value; + case GIMatchTypeKind::Pointer: + return (*Type)->isPointer() && (*Type)->scalarBitWidth() == Step.Value; + } + return makeUnexpected(ErrorCode::VerificationError, + "generated match table has an invalid type predicate"); +} + +[[nodiscard]] Expected<bool> matchesBank(const MachineInstr &Instruction, + const MachineFunction &Function, + const GIMatchTableInstruction &Step) { + const MachineOperand *Operand = Instruction.operandAt(Step.OperandIndex); + const Register *Reg = Operand == nullptr ? nullptr : Operand->getIf<Register>(); + if (Reg == nullptr || !Reg->isVirtual()) + return false; + auto Info = Function.registerInfo().virtualRegisterInfo(*Reg); + if (!Info) + return std::unexpected(Info.error()); + const VirtualRegisterInfo &RegisterInfo = Info->get(); + if (!RegisterInfo.Bank) + return false; + return RegisterInfo.Bank->value() == Step.Value; +} + +[[nodiscard]] Expected<bool> matchesClass(const MachineInstr &Instruction, + const MachineFunction &Function, + const GIMatchTableInstruction &Step) { + const MachineOperand *Operand = Instruction.operandAt(Step.OperandIndex); + const Register *Reg = Operand == nullptr ? nullptr : Operand->getIf<Register>(); + if (Reg == nullptr || !Reg->isVirtual()) + return false; + auto Info = Function.registerInfo().virtualRegisterInfo(*Reg); + if (!Info) + return std::unexpected(Info.error()); + const VirtualRegisterInfo &RegisterInfo = Info->get(); + if (!RegisterInfo.RegClass) + return false; + return RegisterInfo.RegClass->value() == Step.Value; +} + +struct MatchedRule final { + Opcode ResultOpcode; + std::vector<std::int64_t> AppendedImmediates; +}; + +[[nodiscard]] Expected<std::optional<MatchedRule>> matchRule(const GIMatchTable &Table, + const GIMatchTableRule &Rule, + const MachineInstr &Instruction, + const MachineFunction &Function) { + const std::size_t First = Rule.FirstInstruction; + const std::size_t Count = Rule.InstructionCount; + if (First > Table.Instructions.size() || Count > Table.Instructions.size() - First) { + return makeUnexpected(ErrorCode::VerificationError, + "generated match table rule has an invalid instruction range"); + } + + MatchedRule Result; + bool HasResultOpcode = false; + bool Applying = false; + bool Complete = false; + for (std::size_t Index = First; Index < First + Count; ++Index) { + const GIMatchTableInstruction &Step = Table.Instructions[Index]; + switch (Step.Opcode) { + case GIMatchTableOpcode::CheckOpcode: + if (Applying) + return makeUnexpected(ErrorCode::VerificationError, + "generated match table performs a predicate after rendering"); + if (Instruction.opcode().value() != Step.Value) + return std::optional<MatchedRule>{}; + break; + case GIMatchTableOpcode::CheckOperandType: { + if (Applying) + return makeUnexpected(ErrorCode::VerificationError, + "generated match table performs a predicate after rendering"); + auto Matched = matchesType(Instruction, Function, Step); + if (!Matched) + return std::unexpected(Matched.error()); + if (!*Matched) + return std::optional<MatchedRule>{}; + break; + } + case GIMatchTableOpcode::CheckOperandBank: { + if (Applying) + return makeUnexpected(ErrorCode::VerificationError, + "generated match table performs a predicate after rendering"); + auto Matched = matchesBank(Instruction, Function, Step); + if (!Matched) + return std::unexpected(Matched.error()); + if (!*Matched) + return std::optional<MatchedRule>{}; + break; + } + case GIMatchTableOpcode::CheckOperandClass: { + if (Applying) + return makeUnexpected(ErrorCode::VerificationError, + "generated match table performs a predicate after rendering"); + auto Matched = matchesClass(Instruction, Function, Step); + if (!Matched) + return std::unexpected(Matched.error()); + if (!*Matched) + return std::optional<MatchedRule>{}; + break; + } + case GIMatchTableOpcode::MutateOpcode: + if (Complete || HasResultOpcode || Step.Value == 0) + return makeUnexpected(ErrorCode::VerificationError, + "generated match table has an invalid opcode mutation"); + Applying = true; + Result.ResultOpcode = Opcode::fromValue(Step.Value); + HasResultOpcode = true; + break; + case GIMatchTableOpcode::AppendImmediate: + if (Complete) + return makeUnexpected(ErrorCode::VerificationError, + "generated match table renders after completion"); + Applying = true; + Result.AppendedImmediates.push_back(Step.Immediate); + break; + case GIMatchTableOpcode::Complete: + if (Complete || !HasResultOpcode || Index + 1 != First + Count) + return makeUnexpected(ErrorCode::VerificationError, + "generated match table has an invalid completion action"); + Complete = true; + break; + } + } + + if (!Complete || !HasResultOpcode) + return makeUnexpected(ErrorCode::VerificationError, + "generated match table rule does not complete rendering"); + return std::optional<MatchedRule>(std::move(Result)); +} + +[[nodiscard]] Expected<void> applyRule(const MatchedRule &Rule, MachineInstr &Instruction, + const TargetDescription &Target) { + const InstructionDescriptor *Descriptor = Target.instructionDescriptor(Rule.ResultOpcode); + if (Descriptor == nullptr) + return makeUnexpected(ErrorCode::VerificationError, + "generated match table selects an unknown instruction opcode"); + if (!Descriptor->Variadic && + Descriptor->Operands.size() != Instruction.operandCount() + Rule.AppendedImmediates.size()) { + return makeUnexpected(ErrorCode::VerificationError, + "generated match table result has an incompatible operand count"); + } + + const Opcode OriginalOpcode = Instruction.opcode(); + auto SetOpcode = Instruction.setOpcode(Rule.ResultOpcode); + if (!SetOpcode) + return std::unexpected(SetOpcode.error()); + const std::size_t OriginalOperandCount = Instruction.operandCount(); + for (const std::int64_t Immediate : Rule.AppendedImmediates) { + auto Added = Instruction.addOperand(MachineOperand::immediate(Immediate)); + if (Added) + continue; + while (Instruction.operandCount() > OriginalOperandCount) { + auto Removed = Instruction.eraseOperand(Instruction.operandCount() - 1U); + if (!Removed) + return std::unexpected(Removed.error()); + } + auto Restored = Instruction.setOpcode(OriginalOpcode); + if (!Restored) + return std::unexpected(Restored.error()); + return std::unexpected(Added.error()); + } + return {}; +} + +} // namespace + +Expected<bool> GIMatchTableExecutor::match(const GIMatchTable &Table, + const MachineInstr &Instruction, + const MachineFunction &Function, + const TargetDescription &Target) const { + for (const GIMatchTableRule &Rule : Table.Rules) { + auto Match = matchRule(Table, Rule, Instruction, Function); + if (!Match) + return std::unexpected(Match.error()); + if (!*Match) + continue; + if (Target.instructionDescriptor((*Match)->ResultOpcode) == nullptr) { + return makeUnexpected(ErrorCode::VerificationError, + "generated match table selects an unknown instruction opcode"); + } + return true; + } + return false; +} + +Expected<bool> GIMatchTableExecutor::select(const GIMatchTable &Table, MachineInstr &Instruction, + MachineFunction &Function, + const TargetDescription &Target) const { + for (const GIMatchTableRule &Rule : Table.Rules) { + auto Match = matchRule(Table, Rule, Instruction, Function); + if (!Match) + return std::unexpected(Match.error()); + if (!*Match) + continue; + auto Applied = applyRule(**Match, Instruction, Target); + if (!Applied) + return std::unexpected(Applied.error()); + return true; + } + return false; +} + +} // namespace rcc diff --git a/backend/lib/TableGen/Parser.cpp b/backend/lib/TableGen/Parser.cpp index 2d7116d..65687da 100644 --- a/backend/lib/TableGen/Parser.cpp +++ b/backend/lib/TableGen/Parser.cpp @@ -40,7 +40,7 @@ public: {"schema", "target", "register_units", "registers", "register_banks", "register_classes", "register_masks", "mir_operand_flags", "named_operands", "immediate_predicates", "scheduling_classes", "encoding_categories", - "assembly_formats", "calling_conventions", "instructions"}, + "assembly_formats", "calling_conventions", "instructions", "selection_rules"}, "target description root")) { return std::nullopt; } @@ -80,6 +80,7 @@ public: requiredNode(*Root, "calling_conventions", "target description root"); const yaml::Node *InstructionsNode = requiredNode(*Root, "instructions", "target description root"); + const yaml::Node *SelectionRulesNode = optionalNode(*Root, "selection_rules"); if (UnitsNode == nullptr || RegistersNode == nullptr || BanksNode == nullptr || ClassesNode == nullptr || MasksNode == nullptr || NamedOperandsNode == nullptr || ImmediatePredicatesNode == nullptr || SchedulingClassesNode == nullptr || @@ -98,7 +99,9 @@ public: !parseEncodingCategories(*EncodingCategoriesNode, Result.EncodingCategories) || !parseAssemblyFormats(*AssemblyFormatsNode, Result.AssemblyFormats) || !parseCallingConventions(*CallingConventionsNode, Result.CallingConventions) || - !parseInstructions(*InstructionsNode, Result.Instructions)) { + !parseInstructions(*InstructionsNode, Result.Instructions) || + (SelectionRulesNode != nullptr && + !parseSelectionRules(*SelectionRulesNode, Result.SelectionRules))) { return std::nullopt; } return Result; @@ -1025,6 +1028,195 @@ private: return Result; } + [[nodiscard]] std::optional<SourceSelectionTypePredicate> + parseSelectionTypePredicate(const yaml::Node &Node, std::string_view Context) { + if (!requireMapping(&Node, Context)) + return std::nullopt; + if (!checkKeys(Node, {"kind", "bits"}, Context)) + return std::nullopt; + const auto Kind = requiredScalar(Node, "kind", Context); + const yaml::Node *BitsNode = requiredNode(Node, "bits", Context); + if (!Kind || BitsNode == nullptr) + return std::nullopt; + const auto Bits = unsignedInteger32(*BitsNode, std::string(Context) + " bits"); + if (!Bits) + return std::nullopt; + return SourceSelectionTypePredicate{ + .Kind = *Kind, + .Bits = *Bits, + .Range = Node.range(), + }; + } + + [[nodiscard]] bool + parseSelectionOperandTypes(const yaml::Node &Node, + std::vector<SourceSelectionOperandTypePredicate> &Result) { + if (!requireSequence(&Node, "selection operand type predicates")) + return false; + for (const yaml::NodeID ElementID : Node.sequence()) { + const yaml::Node *Element = Input.node(ElementID); + if (!requireMapping(Element, "selection operand type predicate") || + !checkKeys(*Element, {"index", "kind", "bits"}, "selection operand type predicate")) { + return false; + } + const yaml::Node *IndexNode = + requiredNode(*Element, "index", "selection operand type predicate"); + const auto Kind = requiredScalar(*Element, "kind", "selection operand type predicate"); + const yaml::Node *BitsNode = + requiredNode(*Element, "bits", "selection operand type predicate"); + if (IndexNode == nullptr || !Kind || BitsNode == nullptr) + return false; + const auto Index = unsignedInteger32(*IndexNode, "selection operand type index"); + const auto Bits = unsignedInteger32(*BitsNode, "selection operand type bits"); + if (!Index || !Bits) + return false; + Result.push_back({ + .OperandIndex = *Index, + .Type = {.Kind = *Kind, .Bits = *Bits, .Range = Element->range()}, + .Range = Element->range(), + }); + } + return true; + } + + [[nodiscard]] bool + parseSelectionOperandBanks(const yaml::Node &Node, + std::vector<SourceSelectionOperandBankPredicate> &Result) { + if (!requireSequence(&Node, "selection operand bank predicates")) + return false; + for (const yaml::NodeID ElementID : Node.sequence()) { + const yaml::Node *Element = Input.node(ElementID); + if (!requireMapping(Element, "selection operand bank predicate") || + !checkKeys(*Element, {"index", "bank"}, "selection operand bank predicate")) { + return false; + } + const yaml::Node *IndexNode = + requiredNode(*Element, "index", "selection operand bank predicate"); + const auto Bank = requiredScalar(*Element, "bank", "selection operand bank predicate"); + if (IndexNode == nullptr || !Bank) + return false; + const auto Index = unsignedInteger32(*IndexNode, "selection operand bank index"); + if (!Index) + return false; + Result.push_back({ + .OperandIndex = *Index, + .BankSymbol = *Bank, + .Range = Element->range(), + }); + } + return true; + } + + [[nodiscard]] bool + parseSelectionOperandClasses(const yaml::Node &Node, + std::vector<SourceSelectionOperandClassPredicate> &Result) { + if (!requireSequence(&Node, "selection operand class predicates")) + return false; + for (const yaml::NodeID ElementID : Node.sequence()) { + const yaml::Node *Element = Input.node(ElementID); + if (!requireMapping(Element, "selection operand class predicate") || + !checkKeys(*Element, {"index", "class"}, "selection operand class predicate")) { + return false; + } + const yaml::Node *IndexNode = + requiredNode(*Element, "index", "selection operand class predicate"); + const auto Class = requiredScalar(*Element, "class", "selection operand class predicate"); + if (IndexNode == nullptr || !Class) + return false; + const auto Index = unsignedInteger32(*IndexNode, "selection operand class index"); + if (!Index) + return false; + Result.push_back({ + .OperandIndex = *Index, + .ClassSymbol = *Class, + .Range = Element->range(), + }); + } + return true; + } + + [[nodiscard]] bool parseSelectionRuleMatch(const yaml::Node &Node, SourceSelectionRule &Result) { + if (!requireMapping(&Node, "selection rule match") || + !checkKeys(Node, + {"opcode", "result_type", "operand_types", "operand_banks", "operand_classes"}, + "selection rule match")) { + return false; + } + const auto Opcode = requiredScalar(Node, "opcode", "selection rule match"); + if (!Opcode) + return false; + Result.MatchOpcodeSymbol = *Opcode; + if (const yaml::Node *ResultType = optionalNode(Node, "result_type")) { + auto Parsed = parseSelectionTypePredicate(*ResultType, "selection result type predicate"); + if (!Parsed) + return false; + Result.ResultType = std::move(*Parsed); + } + if (const yaml::Node *OperandTypes = optionalNode(Node, "operand_types")) { + if (!parseSelectionOperandTypes(*OperandTypes, Result.OperandTypes)) + return false; + } + if (const yaml::Node *OperandBanks = optionalNode(Node, "operand_banks")) { + if (!parseSelectionOperandBanks(*OperandBanks, Result.OperandBanks)) + return false; + } + if (const yaml::Node *OperandClasses = optionalNode(Node, "operand_classes")) { + if (!parseSelectionOperandClasses(*OperandClasses, Result.OperandClasses)) + return false; + } + return true; + } + + [[nodiscard]] bool parseSelectionRuleApply(const yaml::Node &Node, SourceSelectionRule &Result) { + if (!requireMapping(&Node, "selection rule apply") || + !checkKeys(Node, {"opcode", "append_immediates"}, "selection rule apply")) { + return false; + } + const auto Opcode = requiredScalar(Node, "opcode", "selection rule apply"); + if (!Opcode) + return false; + Result.ResultOpcodeSymbol = *Opcode; + if (const yaml::Node *Immediates = optionalNode(Node, "append_immediates")) { + auto Values = signedIntegerSequence(*Immediates, "selection rule appended immediates"); + if (!Values) + return false; + Result.AppendedImmediates = std::move(*Values); + } + return true; + } + + [[nodiscard]] bool parseSelectionRules(const yaml::Node &Node, + std::vector<SourceSelectionRule> &Result) { + if (!requireSequence(&Node, "selection_rules")) + return false; + for (const yaml::NodeID ElementID : Node.sequence()) { + const yaml::Node *Element = Input.node(ElementID); + if (!requireMapping(Element, "selection rule") || + !checkKeys(*Element, {"id", "priority", "match", "apply"}, "selection rule")) { + return false; + } + const auto Symbol = requiredScalar(*Element, "id", "selection rule"); + const yaml::Node *PriorityNode = requiredNode(*Element, "priority", "selection rule"); + const yaml::Node *MatchNode = requiredNode(*Element, "match", "selection rule"); + const yaml::Node *ApplyNode = requiredNode(*Element, "apply", "selection rule"); + if (!Symbol || PriorityNode == nullptr || MatchNode == nullptr || ApplyNode == nullptr) + return false; + const auto Priority = unsignedInteger32(*PriorityNode, "selection rule priority"); + if (!Priority) + return false; + SourceSelectionRule Rule; + Rule.Symbol = *Symbol; + Rule.Priority = *Priority; + Rule.Range = Element->range(); + if (!parseSelectionRuleMatch(*MatchNode, Rule) || + !parseSelectionRuleApply(*ApplyNode, Rule)) { + return false; + } + Result.push_back(std::move(Rule)); + } + return true; + } + [[nodiscard]] bool parseInstructions(const yaml::Node &Node, std::vector<SourceInstruction> &Result) { if (!requireSequence(&Node, "instructions")) diff --git a/backend/lib/Target/RISCV/CMakeLists.txt b/backend/lib/Target/RISCV/CMakeLists.txt index c4dbdf7..bd6bf3d 100644 --- a/backend/lib/Target/RISCV/CMakeLists.txt +++ b/backend/lib/Target/RISCV/CMakeLists.txt @@ -1,6 +1,25 @@ # SPDX-License-Identifier: GPL-3.0-or-later -set(RCCBackendRISCVDescription "${CMAKE_CURRENT_SOURCE_DIR}/RISCV.rccdesc") +set( + RCCBackendRISCVDescriptionSources + "${CMAKE_CURRENT_SOURCE_DIR}/RISCV.rccdesc" + "${CMAKE_CURRENT_SOURCE_DIR}/RISCVRegisterInfo.rccdesc" + "${CMAKE_CURRENT_SOURCE_DIR}/RISCVCallingConv.rccdesc" + "${CMAKE_CURRENT_SOURCE_DIR}/RISCVInstrInfoBase.rccdesc" + "${CMAKE_CURRENT_SOURCE_DIR}/RISCVInstrInfoI.rccdesc" + "${CMAKE_CURRENT_SOURCE_DIR}/RISCVInstrInfoM.rccdesc" + "${CMAKE_CURRENT_SOURCE_DIR}/RISCVInstrInfoA.rccdesc" + "${CMAKE_CURRENT_SOURCE_DIR}/RISCVInstrInfoF.rccdesc" + "${CMAKE_CURRENT_SOURCE_DIR}/RISCVInstrInfoD.rccdesc" + "${CMAKE_CURRENT_SOURCE_DIR}/RISCVInstrInfoC.rccdesc" + "${CMAKE_CURRENT_SOURCE_DIR}/RISCVInstrInfoZb.rccdesc" + "${CMAKE_CURRENT_SOURCE_DIR}/RISCVInstrInfoPseudo.rccdesc" + "${CMAKE_CURRENT_SOURCE_DIR}/RISCVGISel.rccdesc" +) +set(RCCBackendRISCVTableGenArguments) +foreach(RCCBackendRISCVDescriptionSource IN LISTS RCCBackendRISCVDescriptionSources) + list(APPEND RCCBackendRISCVTableGenArguments --input "${RCCBackendRISCVDescriptionSource}") +endforeach() set( RCCBackendRISCVGeneratedRegisterHeader "${RCC_BACKEND_BINARY_DIR}/generated/include/rcc/Target/RISCV/RISCVRegisters.h" @@ -13,19 +32,25 @@ set( RCCBackendRISCVGeneratedTables "${RCC_BACKEND_BINARY_DIR}/generated/lib/Target/RISCV/RISCVGenTargetDescription.inc" ) +set( + RCCBackendRISCVGeneratedGlobalISel + "${RCC_BACKEND_BINARY_DIR}/generated/lib/Target/RISCV/RISCVGenGlobalISel.inc" +) add_custom_command( OUTPUT "${RCCBackendRISCVGeneratedRegisterHeader}" "${RCCBackendRISCVGeneratedInstructionHeader}" "${RCCBackendRISCVGeneratedTables}" + "${RCCBackendRISCVGeneratedGlobalISel}" COMMAND "$<TARGET_FILE:RCCBackendTableGenTool>" - --input "${RCCBackendRISCVDescription}" + ${RCCBackendRISCVTableGenArguments} --register-header "${RCCBackendRISCVGeneratedRegisterHeader}" --instruction-header "${RCCBackendRISCVGeneratedInstructionHeader}" --tables "${RCCBackendRISCVGeneratedTables}" - DEPENDS RCCBackendTableGenTool "${RCCBackendRISCVDescription}" + --global-isel "${RCCBackendRISCVGeneratedGlobalISel}" + DEPENDS RCCBackendTableGenTool ${RCCBackendRISCVDescriptionSources} COMMENT "Generating RCC RV64GC target tables" VERBATIM ) @@ -36,12 +61,14 @@ add_custom_target( "${RCCBackendRISCVGeneratedRegisterHeader}" "${RCCBackendRISCVGeneratedInstructionHeader}" "${RCCBackendRISCVGeneratedTables}" + "${RCCBackendRISCVGeneratedGlobalISel}" ) set_source_files_properties( "${RCCBackendRISCVGeneratedRegisterHeader}" "${RCCBackendRISCVGeneratedInstructionHeader}" "${RCCBackendRISCVGeneratedTables}" + "${RCCBackendRISCVGeneratedGlobalISel}" PROPERTIES GENERATED TRUE HEADER_FILE_ONLY TRUE ) @@ -74,6 +101,7 @@ add_library( "${RCCBackendRISCVGeneratedRegisterHeader}" "${RCCBackendRISCVGeneratedInstructionHeader}" "${RCCBackendRISCVGeneratedTables}" + "${RCCBackendRISCVGeneratedGlobalISel}" ) add_library(RCCBackend::RISCV ALIAS RCCBackendRISCV) add_dependencies(RCCBackendRISCV RCCBackendRISCVGeneratedTablesTarget) diff --git a/backend/lib/Target/RISCV/GISel/RISCVInstructionSelector.cpp b/backend/lib/Target/RISCV/GISel/RISCVInstructionSelector.cpp index 62c10af..68574a3 100644 --- a/backend/lib/Target/RISCV/GISel/RISCVInstructionSelector.cpp +++ b/backend/lib/Target/RISCV/GISel/RISCVInstructionSelector.cpp @@ -5,7 +5,6 @@ #include "RISCVRegisterBankInfo.h" #include "rcc/CodeGen/GenericOpcodes.h" #include "rcc/CodeGen/GlobalISel/InstructionSelector.h" -#include "rcc/CodeGen/GlobalISel/LegalizerInfo.h" #include "rcc/CodeGen/LowLevelType.h" #include "rcc/CodeGen/MachineBasicBlock.h" #include "rcc/CodeGen/MachineFunction.h" @@ -33,6 +32,10 @@ namespace rcc::riscv { namespace { +#define GET_GLOBALISEL_MATCH_TABLE +#include "RISCVGenGlobalISel.inc" +#undef GET_GLOBALISEL_MATCH_TABLE + [[nodiscard]] std::optional<LowLevelType> registerType(const MachineFunction &Function, const MachineOperand &Operand) { const Register *Reg = Operand.getIf<Register>(); @@ -72,12 +75,6 @@ operandType(const MachineFunction &Function, const MachineInstr &Instruction, st Type.scalarBitWidth() <= 64; } -[[nodiscard]] bool isScalarGPRType(LowLevelType Type) noexcept { - return (Type.isCategoryNeutralScalar() && Type.scalarBitWidth() != 0 && - Type.scalarBitWidth() <= 64) || - (Type.isPointer() && Type.scalarBitWidth() == 64); -} - [[nodiscard]] constexpr RegisterBankID fprBank() noexcept { return RegisterBankID::fromValue(static_cast<std::uint32_t>(RegisterBank::FPR)); } @@ -183,39 +180,23 @@ public: [[nodiscard]] Expected<void> canSelect(const MachineInstr &Instruction, const MachineFunction &Function, const TargetDescription &Target) const override { - if (Instruction.opcode() == instructionOpcode(InstructionOpcode::G_SLLW) || - Instruction.opcode() == instructionOpcode(InstructionOpcode::G_SRAW) || - Instruction.opcode() == instructionOpcode(InstructionOpcode::G_SRLW) || - Instruction.opcode() == instructionOpcode(InstructionOpcode::G_DIVW) || - Instruction.opcode() == instructionOpcode(InstructionOpcode::G_DIVUW) || - Instruction.opcode() == instructionOpcode(InstructionOpcode::G_REMUW)) { - const std::optional<LowLevelType> Type = resultType(Function, Instruction); - const std::optional<LowLevelType> Left = operandType(Function, Instruction, 1); - const std::optional<LowLevelType> Right = operandType(Function, Instruction, 2); - return Type && Left && Right && isScalarGPRType(*Type) && Type->scalarBitWidth() == 64 && - *Left == *Type && *Right == *Type - ? Expected<void>{} - : makeUnexpected(ErrorCode::Unsupported, - "RISC-V word shift pseudo requires three 64-bit GPR operands"); - } - if (!isGenericOpcode(Instruction.opcode())) + auto Generated = + GIMatchTableExecutor::match(generatedGlobalISelMatchTable(), Instruction, Function, Target); + if (!Generated) + return std::unexpected(Generated.error()); + if (*Generated) return {}; + if (!isGenericOpcode(Instruction.opcode())) { + const InstructionDescriptor *Descriptor = Target.instructionDescriptor(Instruction.opcode()); + if (Descriptor != nullptr && !Descriptor->Flags.has(InstructionFlag::Generic)) + return {}; + return makeUnexpected(ErrorCode::Unsupported, + "RISC-V instruction selector has no generated rule for target pseudo"); + } const GenericOpcode Generic = static_cast<GenericOpcode>(Instruction.opcode().value()); const std::optional<LowLevelType> Type = resultType(Function, Instruction); const auto Integer = [Type] { return Type && isSupportedIntegerType(*Type); }; const auto Float = [Type] { return Type && isSupportedFloatingScalar(*Type); }; - auto Classification = Subtarget.getLegalizerInfo()->getDecision(Instruction, Function, Target); - if (!Classification) - return std::unexpected(Classification.error()); - if (Classification->Action != LegalizationAction::Legal && - Classification->Action != LegalizationAction::Custom) { - std::string Message = "RISC-V selector cannot select opcode '" + - std::string(getGenericOpcodeName(Generic)) + "'"; - if (Type) - Message += " with result type '" + Type->toString() + "'"; - Message += ": the legalization rule explicitly marks this combination unsupported"; - return makeUnexpected(ErrorCode::Unsupported, std::move(Message)); - } switch (Generic) { case GenericOpcode::G_ADD: case GenericOpcode::G_SUB: @@ -343,21 +324,15 @@ public: [[nodiscard]] Expected<void> select(MachineInstr &Instruction, MachineFunction &Function, const TargetDescription &Target) const override { + auto Generated = GIMatchTableExecutor::select(generatedGlobalISelMatchTable(), Instruction, + Function, Target); + if (!Generated) + return std::unexpected(Generated.error()); + if (*Generated) + return {}; auto Match = canSelect(Instruction, Function, Target); if (!Match) return std::unexpected(Match.error()); - if (Instruction.opcode() == instructionOpcode(InstructionOpcode::G_SLLW)) - return Instruction.setOpcode(instructionOpcode(InstructionOpcode::SLLW)); - if (Instruction.opcode() == instructionOpcode(InstructionOpcode::G_SRAW)) - return Instruction.setOpcode(instructionOpcode(InstructionOpcode::SRAW)); - if (Instruction.opcode() == instructionOpcode(InstructionOpcode::G_SRLW)) - return Instruction.setOpcode(instructionOpcode(InstructionOpcode::SRLW)); - if (Instruction.opcode() == instructionOpcode(InstructionOpcode::G_DIVW)) - return Instruction.setOpcode(instructionOpcode(InstructionOpcode::DIVW)); - if (Instruction.opcode() == instructionOpcode(InstructionOpcode::G_DIVUW)) - return Instruction.setOpcode(instructionOpcode(InstructionOpcode::DIVUW)); - if (Instruction.opcode() == instructionOpcode(InstructionOpcode::G_REMUW)) - return Instruction.setOpcode(instructionOpcode(InstructionOpcode::REMUW)); const GenericOpcode Generic = static_cast<GenericOpcode>(Instruction.opcode().value()); const std::optional<LowLevelType> Type = resultType(Function, Instruction); diff --git a/backend/lib/Target/RISCV/RISCV.rccdesc b/backend/lib/Target/RISCV/RISCV.rccdesc index 832e8c1..7623afd 100644 --- a/backend/lib/Target/RISCV/RISCV.rccdesc +++ b/backend/lib/Target/RISCV/RISCV.rccdesc @@ -9,4032 +9,3 @@ target: abi: lp64d data_layout: e-m:e-p:64:64-i64:64-i128:128-n32:64-S128 features: [i, m, a, f, d, c, zicsr, zifencei] - -register_units: - - { id: 1, symbol: U_X0, name: x0.unit } - - { id: 2, symbol: U_X1, name: x1.unit } - - { id: 3, symbol: U_X2, name: x2.unit } - - { id: 4, symbol: U_X3, name: x3.unit } - - { id: 5, symbol: U_X4, name: x4.unit } - - { id: 6, symbol: U_X5, name: x5.unit } - - { id: 7, symbol: U_X6, name: x6.unit } - - { id: 8, symbol: U_X7, name: x7.unit } - - { id: 9, symbol: U_X8, name: x8.unit } - - { id: 10, symbol: U_X9, name: x9.unit } - - { id: 11, symbol: U_X10, name: x10.unit } - - { id: 12, symbol: U_X11, name: x11.unit } - - { id: 13, symbol: U_X12, name: x12.unit } - - { id: 14, symbol: U_X13, name: x13.unit } - - { id: 15, symbol: U_X14, name: x14.unit } - - { id: 16, symbol: U_X15, name: x15.unit } - - { id: 17, symbol: U_X16, name: x16.unit } - - { id: 18, symbol: U_X17, name: x17.unit } - - { id: 19, symbol: U_X18, name: x18.unit } - - { id: 20, symbol: U_X19, name: x19.unit } - - { id: 21, symbol: U_X20, name: x20.unit } - - { id: 22, symbol: U_X21, name: x21.unit } - - { id: 23, symbol: U_X22, name: x22.unit } - - { id: 24, symbol: U_X23, name: x23.unit } - - { id: 25, symbol: U_X24, name: x24.unit } - - { id: 26, symbol: U_X25, name: x25.unit } - - { id: 27, symbol: U_X26, name: x26.unit } - - { id: 28, symbol: U_X27, name: x27.unit } - - { id: 29, symbol: U_X28, name: x28.unit } - - { id: 30, symbol: U_X29, name: x29.unit } - - { id: 31, symbol: U_X30, name: x30.unit } - - { id: 32, symbol: U_X31, name: x31.unit } - - { id: 33, symbol: U_F0, name: f0.unit } - - { id: 34, symbol: U_F1, name: f1.unit } - - { id: 35, symbol: U_F2, name: f2.unit } - - { id: 36, symbol: U_F3, name: f3.unit } - - { id: 37, symbol: U_F4, name: f4.unit } - - { id: 38, symbol: U_F5, name: f5.unit } - - { id: 39, symbol: U_F6, name: f6.unit } - - { id: 40, symbol: U_F7, name: f7.unit } - - { id: 41, symbol: U_F8, name: f8.unit } - - { id: 42, symbol: U_F9, name: f9.unit } - - { id: 43, symbol: U_F10, name: f10.unit } - - { id: 44, symbol: U_F11, name: f11.unit } - - { id: 45, symbol: U_F12, name: f12.unit } - - { id: 46, symbol: U_F13, name: f13.unit } - - { id: 47, symbol: U_F14, name: f14.unit } - - { id: 48, symbol: U_F15, name: f15.unit } - - { id: 49, symbol: U_F16, name: f16.unit } - - { id: 50, symbol: U_F17, name: f17.unit } - - { id: 51, symbol: U_F18, name: f18.unit } - - { id: 52, symbol: U_F19, name: f19.unit } - - { id: 53, symbol: U_F20, name: f20.unit } - - { id: 54, symbol: U_F21, name: f21.unit } - - { id: 55, symbol: U_F22, name: f22.unit } - - { id: 56, symbol: U_F23, name: f23.unit } - - { id: 57, symbol: U_F24, name: f24.unit } - - { id: 58, symbol: U_F25, name: f25.unit } - - { id: 59, symbol: U_F26, name: f26.unit } - - { id: 60, symbol: U_F27, name: f27.unit } - - { id: 61, symbol: U_F28, name: f28.unit } - - { id: 62, symbol: U_F29, name: f29.unit } - - { id: 63, symbol: U_F30, name: f30.unit } - - { id: 64, symbol: U_F31, name: f31.unit } - - { id: 65, symbol: U_FFLAGS, name: fflags.unit } - - { id: 66, symbol: U_FRM, name: frm.unit } - - { id: 67, symbol: U_V0, name: v0.unit } - - { id: 68, symbol: U_V1, name: v1.unit } - - { id: 69, symbol: U_V2, name: v2.unit } - - { id: 70, symbol: U_V3, name: v3.unit } - - { id: 71, symbol: U_V4, name: v4.unit } - - { id: 72, symbol: U_V5, name: v5.unit } - - { id: 73, symbol: U_V6, name: v6.unit } - - { id: 74, symbol: U_V7, name: v7.unit } - - { id: 75, symbol: U_V8, name: v8.unit } - - { id: 76, symbol: U_V9, name: v9.unit } - - { id: 77, symbol: U_V10, name: v10.unit } - - { id: 78, symbol: U_V11, name: v11.unit } - - { id: 79, symbol: U_V12, name: v12.unit } - - { id: 80, symbol: U_V13, name: v13.unit } - - { id: 81, symbol: U_V14, name: v14.unit } - - { id: 82, symbol: U_V15, name: v15.unit } - - { id: 83, symbol: U_V16, name: v16.unit } - - { id: 84, symbol: U_V17, name: v17.unit } - - { id: 85, symbol: U_V18, name: v18.unit } - - { id: 86, symbol: U_V19, name: v19.unit } - - { id: 87, symbol: U_V20, name: v20.unit } - - { id: 88, symbol: U_V21, name: v21.unit } - - { id: 89, symbol: U_V22, name: v22.unit } - - { id: 90, symbol: U_V23, name: v23.unit } - - { id: 91, symbol: U_V24, name: v24.unit } - - { id: 92, symbol: U_V25, name: v25.unit } - - { id: 93, symbol: U_V26, name: v26.unit } - - { id: 94, symbol: U_V27, name: v27.unit } - - { id: 95, symbol: U_V28, name: v28.unit } - - { id: 96, symbol: U_V29, name: v29.unit } - - { id: 97, symbol: U_V30, name: v30.unit } - - { id: 98, symbol: U_V31, name: v31.unit } - -registers: - - { id: 1, symbol: X0, name: x0, encoding: 0, dwarf_register: 0, units: [{ unit: U_X0, lanes: 1 }], constant: true, reserved: true, aliases: [zero] } - - { id: 2, symbol: X1, name: x1, encoding: 1, dwarf_register: 1, units: [{ unit: U_X1, lanes: 1 }], aliases: [ra] } - - { id: 3, symbol: X2, name: x2, encoding: 2, dwarf_register: 2, units: [{ unit: U_X2, lanes: 1 }], reserved: true, aliases: [sp] } - - { id: 4, symbol: X3, name: x3, encoding: 3, dwarf_register: 3, units: [{ unit: U_X3, lanes: 1 }], reserved: true, aliases: [gp] } - - { id: 5, symbol: X4, name: x4, encoding: 4, dwarf_register: 4, units: [{ unit: U_X4, lanes: 1 }], reserved: true, aliases: [tp] } - - { id: 6, symbol: X5, name: x5, encoding: 5, dwarf_register: 5, units: [{ unit: U_X5, lanes: 1 }], aliases: [t0] } - - { id: 7, symbol: X6, name: x6, encoding: 6, dwarf_register: 6, units: [{ unit: U_X6, lanes: 1 }], aliases: [t1] } - - { id: 8, symbol: X7, name: x7, encoding: 7, dwarf_register: 7, units: [{ unit: U_X7, lanes: 1 }], aliases: [t2] } - - { id: 9, symbol: X8, name: x8, encoding: 8, dwarf_register: 8, units: [{ unit: U_X8, lanes: 1 }], aliases: [s0, fp] } - - { id: 10, symbol: X9, name: x9, encoding: 9, dwarf_register: 9, units: [{ unit: U_X9, lanes: 1 }], aliases: [s1] } - - { id: 11, symbol: X10, name: x10, encoding: 10, dwarf_register: 10, units: [{ unit: U_X10, lanes: 1 }], aliases: [a0] } - - { id: 12, symbol: X11, name: x11, encoding: 11, dwarf_register: 11, units: [{ unit: U_X11, lanes: 1 }], aliases: [a1] } - - { id: 13, symbol: X12, name: x12, encoding: 12, dwarf_register: 12, units: [{ unit: U_X12, lanes: 1 }], aliases: [a2] } - - { id: 14, symbol: X13, name: x13, encoding: 13, dwarf_register: 13, units: [{ unit: U_X13, lanes: 1 }], aliases: [a3] } - - { id: 15, symbol: X14, name: x14, encoding: 14, dwarf_register: 14, units: [{ unit: U_X14, lanes: 1 }], aliases: [a4] } - - { id: 16, symbol: X15, name: x15, encoding: 15, dwarf_register: 15, units: [{ unit: U_X15, lanes: 1 }], aliases: [a5] } - - { id: 17, symbol: X16, name: x16, encoding: 16, dwarf_register: 16, units: [{ unit: U_X16, lanes: 1 }], aliases: [a6] } - - { id: 18, symbol: X17, name: x17, encoding: 17, dwarf_register: 17, units: [{ unit: U_X17, lanes: 1 }], aliases: [a7] } - - { id: 19, symbol: X18, name: x18, encoding: 18, dwarf_register: 18, units: [{ unit: U_X18, lanes: 1 }], aliases: [s2] } - - { id: 20, symbol: X19, name: x19, encoding: 19, dwarf_register: 19, units: [{ unit: U_X19, lanes: 1 }], aliases: [s3] } - - { id: 21, symbol: X20, name: x20, encoding: 20, dwarf_register: 20, units: [{ unit: U_X20, lanes: 1 }], aliases: [s4] } - - { id: 22, symbol: X21, name: x21, encoding: 21, dwarf_register: 21, units: [{ unit: U_X21, lanes: 1 }], aliases: [s5] } - - { id: 23, symbol: X22, name: x22, encoding: 22, dwarf_register: 22, units: [{ unit: U_X22, lanes: 1 }], aliases: [s6] } - - { id: 24, symbol: X23, name: x23, encoding: 23, dwarf_register: 23, units: [{ unit: U_X23, lanes: 1 }], aliases: [s7] } - - { id: 25, symbol: X24, name: x24, encoding: 24, dwarf_register: 24, units: [{ unit: U_X24, lanes: 1 }], aliases: [s8] } - - { id: 26, symbol: X25, name: x25, encoding: 25, dwarf_register: 25, units: [{ unit: U_X25, lanes: 1 }], aliases: [s9] } - - { id: 27, symbol: X26, name: x26, encoding: 26, dwarf_register: 26, units: [{ unit: U_X26, lanes: 1 }], aliases: [s10] } - - { id: 28, symbol: X27, name: x27, encoding: 27, dwarf_register: 27, units: [{ unit: U_X27, lanes: 1 }], aliases: [s11] } - - { id: 29, symbol: X28, name: x28, encoding: 28, dwarf_register: 28, units: [{ unit: U_X28, lanes: 1 }], aliases: [t3] } - - { id: 30, symbol: X29, name: x29, encoding: 29, dwarf_register: 29, units: [{ unit: U_X29, lanes: 1 }], aliases: [t4] } - - { id: 31, symbol: X30, name: x30, encoding: 30, dwarf_register: 30, units: [{ unit: U_X30, lanes: 1 }], aliases: [t5] } - - { id: 32, symbol: X31, name: x31, encoding: 31, dwarf_register: 31, units: [{ unit: U_X31, lanes: 1 }], aliases: [t6] } - - { id: 33, symbol: F0_D, name: f0_d, encoding: 0, dwarf_register: 32, units: [{ unit: U_F0, lanes: 1 }], aliases: [ft0] } - - { id: 34, symbol: F1_D, name: f1_d, encoding: 1, dwarf_register: 33, units: [{ unit: U_F1, lanes: 1 }], aliases: [ft1] } - - { id: 35, symbol: F2_D, name: f2_d, encoding: 2, dwarf_register: 34, units: [{ unit: U_F2, lanes: 1 }], aliases: [ft2] } - - { id: 36, symbol: F3_D, name: f3_d, encoding: 3, dwarf_register: 35, units: [{ unit: U_F3, lanes: 1 }], aliases: [ft3] } - - { id: 37, symbol: F4_D, name: f4_d, encoding: 4, dwarf_register: 36, units: [{ unit: U_F4, lanes: 1 }], aliases: [ft4] } - - { id: 38, symbol: F5_D, name: f5_d, encoding: 5, dwarf_register: 37, units: [{ unit: U_F5, lanes: 1 }], aliases: [ft5] } - - { id: 39, symbol: F6_D, name: f6_d, encoding: 6, dwarf_register: 38, units: [{ unit: U_F6, lanes: 1 }], aliases: [ft6] } - - { id: 40, symbol: F7_D, name: f7_d, encoding: 7, dwarf_register: 39, units: [{ unit: U_F7, lanes: 1 }], aliases: [ft7] } - - { id: 41, symbol: F8_D, name: f8_d, encoding: 8, dwarf_register: 40, units: [{ unit: U_F8, lanes: 1 }], aliases: [fs0] } - - { id: 42, symbol: F9_D, name: f9_d, encoding: 9, dwarf_register: 41, units: [{ unit: U_F9, lanes: 1 }], aliases: [fs1] } - - { id: 43, symbol: F10_D, name: f10_d, encoding: 10, dwarf_register: 42, units: [{ unit: U_F10, lanes: 1 }], aliases: [fa0] } - - { id: 44, symbol: F11_D, name: f11_d, encoding: 11, dwarf_register: 43, units: [{ unit: U_F11, lanes: 1 }], aliases: [fa1] } - - { id: 45, symbol: F12_D, name: f12_d, encoding: 12, dwarf_register: 44, units: [{ unit: U_F12, lanes: 1 }], aliases: [fa2] } - - { id: 46, symbol: F13_D, name: f13_d, encoding: 13, dwarf_register: 45, units: [{ unit: U_F13, lanes: 1 }], aliases: [fa3] } - - { id: 47, symbol: F14_D, name: f14_d, encoding: 14, dwarf_register: 46, units: [{ unit: U_F14, lanes: 1 }], aliases: [fa4] } - - { id: 48, symbol: F15_D, name: f15_d, encoding: 15, dwarf_register: 47, units: [{ unit: U_F15, lanes: 1 }], aliases: [fa5] } - - { id: 49, symbol: F16_D, name: f16_d, encoding: 16, dwarf_register: 48, units: [{ unit: U_F16, lanes: 1 }], aliases: [fa6] } - - { id: 50, symbol: F17_D, name: f17_d, encoding: 17, dwarf_register: 49, units: [{ unit: U_F17, lanes: 1 }], aliases: [fa7] } - - { id: 51, symbol: F18_D, name: f18_d, encoding: 18, dwarf_register: 50, units: [{ unit: U_F18, lanes: 1 }], aliases: [fs2] } - - { id: 52, symbol: F19_D, name: f19_d, encoding: 19, dwarf_register: 51, units: [{ unit: U_F19, lanes: 1 }], aliases: [fs3] } - - { id: 53, symbol: F20_D, name: f20_d, encoding: 20, dwarf_register: 52, units: [{ unit: U_F20, lanes: 1 }], aliases: [fs4] } - - { id: 54, symbol: F21_D, name: f21_d, encoding: 21, dwarf_register: 53, units: [{ unit: U_F21, lanes: 1 }], aliases: [fs5] } - - { id: 55, symbol: F22_D, name: f22_d, encoding: 22, dwarf_register: 54, units: [{ unit: U_F22, lanes: 1 }], aliases: [fs6] } - - { id: 56, symbol: F23_D, name: f23_d, encoding: 23, dwarf_register: 55, units: [{ unit: U_F23, lanes: 1 }], aliases: [fs7] } - - { id: 57, symbol: F24_D, name: f24_d, encoding: 24, dwarf_register: 56, units: [{ unit: U_F24, lanes: 1 }], aliases: [fs8] } - - { id: 58, symbol: F25_D, name: f25_d, encoding: 25, dwarf_register: 57, units: [{ unit: U_F25, lanes: 1 }], aliases: [fs9] } - - { id: 59, symbol: F26_D, name: f26_d, encoding: 26, dwarf_register: 58, units: [{ unit: U_F26, lanes: 1 }], aliases: [fs10] } - - { id: 60, symbol: F27_D, name: f27_d, encoding: 27, dwarf_register: 59, units: [{ unit: U_F27, lanes: 1 }], aliases: [fs11] } - - { id: 61, symbol: F28_D, name: f28_d, encoding: 28, dwarf_register: 60, units: [{ unit: U_F28, lanes: 1 }], aliases: [ft8] } - - { id: 62, symbol: F29_D, name: f29_d, encoding: 29, dwarf_register: 61, units: [{ unit: U_F29, lanes: 1 }], aliases: [ft9] } - - { id: 63, symbol: F30_D, name: f30_d, encoding: 30, dwarf_register: 62, units: [{ unit: U_F30, lanes: 1 }], aliases: [ft10] } - - { id: 64, symbol: F31_D, name: f31_d, encoding: 31, dwarf_register: 63, units: [{ unit: U_F31, lanes: 1 }], aliases: [ft11] } - - { id: 65, symbol: F0_F, name: f0_f, encoding: 0, dwarf_register: 32, units: [{ unit: U_F0, lanes: 1 }] } - - { id: 66, symbol: F1_F, name: f1_f, encoding: 1, dwarf_register: 33, units: [{ unit: U_F1, lanes: 1 }] } - - { id: 67, symbol: F2_F, name: f2_f, encoding: 2, dwarf_register: 34, units: [{ unit: U_F2, lanes: 1 }] } - - { id: 68, symbol: F3_F, name: f3_f, encoding: 3, dwarf_register: 35, units: [{ unit: U_F3, lanes: 1 }] } - - { id: 69, symbol: F4_F, name: f4_f, encoding: 4, dwarf_register: 36, units: [{ unit: U_F4, lanes: 1 }] } - - { id: 70, symbol: F5_F, name: f5_f, encoding: 5, dwarf_register: 37, units: [{ unit: U_F5, lanes: 1 }] } - - { id: 71, symbol: F6_F, name: f6_f, encoding: 6, dwarf_register: 38, units: [{ unit: U_F6, lanes: 1 }] } - - { id: 72, symbol: F7_F, name: f7_f, encoding: 7, dwarf_register: 39, units: [{ unit: U_F7, lanes: 1 }] } - - { id: 73, symbol: F8_F, name: f8_f, encoding: 8, dwarf_register: 40, units: [{ unit: U_F8, lanes: 1 }] } - - { id: 74, symbol: F9_F, name: f9_f, encoding: 9, dwarf_register: 41, units: [{ unit: U_F9, lanes: 1 }] } - - { id: 75, symbol: F10_F, name: f10_f, encoding: 10, dwarf_register: 42, units: [{ unit: U_F10, lanes: 1 }] } - - { id: 76, symbol: F11_F, name: f11_f, encoding: 11, dwarf_register: 43, units: [{ unit: U_F11, lanes: 1 }] } - - { id: 77, symbol: F12_F, name: f12_f, encoding: 12, dwarf_register: 44, units: [{ unit: U_F12, lanes: 1 }] } - - { id: 78, symbol: F13_F, name: f13_f, encoding: 13, dwarf_register: 45, units: [{ unit: U_F13, lanes: 1 }] } - - { id: 79, symbol: F14_F, name: f14_f, encoding: 14, dwarf_register: 46, units: [{ unit: U_F14, lanes: 1 }] } - - { id: 80, symbol: F15_F, name: f15_f, encoding: 15, dwarf_register: 47, units: [{ unit: U_F15, lanes: 1 }] } - - { id: 81, symbol: F16_F, name: f16_f, encoding: 16, dwarf_register: 48, units: [{ unit: U_F16, lanes: 1 }] } - - { id: 82, symbol: F17_F, name: f17_f, encoding: 17, dwarf_register: 49, units: [{ unit: U_F17, lanes: 1 }] } - - { id: 83, symbol: F18_F, name: f18_f, encoding: 18, dwarf_register: 50, units: [{ unit: U_F18, lanes: 1 }] } - - { id: 84, symbol: F19_F, name: f19_f, encoding: 19, dwarf_register: 51, units: [{ unit: U_F19, lanes: 1 }] } - - { id: 85, symbol: F20_F, name: f20_f, encoding: 20, dwarf_register: 52, units: [{ unit: U_F20, lanes: 1 }] } - - { id: 86, symbol: F21_F, name: f21_f, encoding: 21, dwarf_register: 53, units: [{ unit: U_F21, lanes: 1 }] } - - { id: 87, symbol: F22_F, name: f22_f, encoding: 22, dwarf_register: 54, units: [{ unit: U_F22, lanes: 1 }] } - - { id: 88, symbol: F23_F, name: f23_f, encoding: 23, dwarf_register: 55, units: [{ unit: U_F23, lanes: 1 }] } - - { id: 89, symbol: F24_F, name: f24_f, encoding: 24, dwarf_register: 56, units: [{ unit: U_F24, lanes: 1 }] } - - { id: 90, symbol: F25_F, name: f25_f, encoding: 25, dwarf_register: 57, units: [{ unit: U_F25, lanes: 1 }] } - - { id: 91, symbol: F26_F, name: f26_f, encoding: 26, dwarf_register: 58, units: [{ unit: U_F26, lanes: 1 }] } - - { id: 92, symbol: F27_F, name: f27_f, encoding: 27, dwarf_register: 59, units: [{ unit: U_F27, lanes: 1 }] } - - { id: 93, symbol: F28_F, name: f28_f, encoding: 28, dwarf_register: 60, units: [{ unit: U_F28, lanes: 1 }] } - - { id: 94, symbol: F29_F, name: f29_f, encoding: 29, dwarf_register: 61, units: [{ unit: U_F29, lanes: 1 }] } - - { id: 95, symbol: F30_F, name: f30_f, encoding: 30, dwarf_register: 62, units: [{ unit: U_F30, lanes: 1 }] } - - { id: 96, symbol: F31_F, name: f31_f, encoding: 31, dwarf_register: 63, units: [{ unit: U_F31, lanes: 1 }] } - - { id: 97, symbol: FFLAGS, name: fflags, encoding: 0, dwarf_register: 65, units: [{ unit: U_FFLAGS, lanes: 1 }], artificial: true, reserved: true } - - { id: 98, symbol: FRM, name: frm, encoding: 0, dwarf_register: 66, units: [{ unit: U_FRM, lanes: 1 }], artificial: true, reserved: true } - - { id: 99, symbol: V0, name: v0, encoding: 0, dwarf_register: 96, units: [{ unit: U_V0, lanes: 1 }] } - - { id: 100, symbol: V1, name: v1, encoding: 1, dwarf_register: 97, units: [{ unit: U_V1, lanes: 1 }] } - - { id: 101, symbol: V2, name: v2, encoding: 2, dwarf_register: 98, units: [{ unit: U_V2, lanes: 1 }] } - - { id: 102, symbol: V3, name: v3, encoding: 3, dwarf_register: 99, units: [{ unit: U_V3, lanes: 1 }] } - - { id: 103, symbol: V4, name: v4, encoding: 4, dwarf_register: 100, units: [{ unit: U_V4, lanes: 1 }] } - - { id: 104, symbol: V5, name: v5, encoding: 5, dwarf_register: 101, units: [{ unit: U_V5, lanes: 1 }] } - - { id: 105, symbol: V6, name: v6, encoding: 6, dwarf_register: 102, units: [{ unit: U_V6, lanes: 1 }] } - - { id: 106, symbol: V7, name: v7, encoding: 7, dwarf_register: 103, units: [{ unit: U_V7, lanes: 1 }] } - - { id: 107, symbol: V8, name: v8, encoding: 8, dwarf_register: 104, units: [{ unit: U_V8, lanes: 1 }] } - - { id: 108, symbol: V9, name: v9, encoding: 9, dwarf_register: 105, units: [{ unit: U_V9, lanes: 1 }] } - - { id: 109, symbol: V10, name: v10, encoding: 10, dwarf_register: 106, units: [{ unit: U_V10, lanes: 1 }] } - - { id: 110, symbol: V11, name: v11, encoding: 11, dwarf_register: 107, units: [{ unit: U_V11, lanes: 1 }] } - - { id: 111, symbol: V12, name: v12, encoding: 12, dwarf_register: 108, units: [{ unit: U_V12, lanes: 1 }] } - - { id: 112, symbol: V13, name: v13, encoding: 13, dwarf_register: 109, units: [{ unit: U_V13, lanes: 1 }] } - - { id: 113, symbol: V14, name: v14, encoding: 14, dwarf_register: 110, units: [{ unit: U_V14, lanes: 1 }] } - - { id: 114, symbol: V15, name: v15, encoding: 15, dwarf_register: 111, units: [{ unit: U_V15, lanes: 1 }] } - - { id: 115, symbol: V16, name: v16, encoding: 16, dwarf_register: 112, units: [{ unit: U_V16, lanes: 1 }] } - - { id: 116, symbol: V17, name: v17, encoding: 17, dwarf_register: 113, units: [{ unit: U_V17, lanes: 1 }] } - - { id: 117, symbol: V18, name: v18, encoding: 18, dwarf_register: 114, units: [{ unit: U_V18, lanes: 1 }] } - - { id: 118, symbol: V19, name: v19, encoding: 19, dwarf_register: 115, units: [{ unit: U_V19, lanes: 1 }] } - - { id: 119, symbol: V20, name: v20, encoding: 20, dwarf_register: 116, units: [{ unit: U_V20, lanes: 1 }] } - - { id: 120, symbol: V21, name: v21, encoding: 21, dwarf_register: 117, units: [{ unit: U_V21, lanes: 1 }] } - - { id: 121, symbol: V22, name: v22, encoding: 22, dwarf_register: 118, units: [{ unit: U_V22, lanes: 1 }] } - - { id: 122, symbol: V23, name: v23, encoding: 23, dwarf_register: 119, units: [{ unit: U_V23, lanes: 1 }] } - - { id: 123, symbol: V24, name: v24, encoding: 24, dwarf_register: 120, units: [{ unit: U_V24, lanes: 1 }] } - - { id: 124, symbol: V25, name: v25, encoding: 25, dwarf_register: 121, units: [{ unit: U_V25, lanes: 1 }] } - - { id: 125, symbol: V26, name: v26, encoding: 26, dwarf_register: 122, units: [{ unit: U_V26, lanes: 1 }] } - - { id: 126, symbol: V27, name: v27, encoding: 27, dwarf_register: 123, units: [{ unit: U_V27, lanes: 1 }] } - - { id: 127, symbol: V28, name: v28, encoding: 28, dwarf_register: 124, units: [{ unit: U_V28, lanes: 1 }] } - - { id: 128, symbol: V29, name: v29, encoding: 29, dwarf_register: 125, units: [{ unit: U_V29, lanes: 1 }] } - - { id: 129, symbol: V30, name: v30, encoding: 30, dwarf_register: 126, units: [{ unit: U_V30, lanes: 1 }] } - - { id: 130, symbol: V31, name: v31, encoding: 31, dwarf_register: 127, units: [{ unit: U_V31, lanes: 1 }] } - -register_banks: - - { id: 1, symbol: GPR, name: GPRB, maximum_size_bits: 64 } - - { id: 2, symbol: FPR, name: FPRB, maximum_size_bits: 64 } - - { id: 3, symbol: CSR, name: CSRB, maximum_size_bits: 32 } - - { id: 4, symbol: VR, name: VRB, maximum_size_bits: 512 } - -register_classes: - - - id: 1 - symbol: GPR - name: GPR - bank: GPR - size_bits: 64 - spill_size_bits: 64 - spill_alignment_bits: 64 - lanes: 1 - registers: [X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31] - allocation_order: [X5, X6, X7, X28, X29, X30, X31, X10, X11, X12, X13, X14, X15, X16, X17, X8, X9, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X1] - - - id: 2 - symbol: GPRC - name: GPRC - bank: GPR - size_bits: 64 - spill_size_bits: 64 - spill_alignment_bits: 64 - lanes: 1 - registers: [X8, X9, X10, X11, X12, X13, X14, X15] - allocation_order: [X10, X11, X12, X13, X14, X15, X8, X9] - - - id: 3 - symbol: FPR64 - name: FPR64 - bank: FPR - size_bits: 64 - spill_size_bits: 64 - spill_alignment_bits: 64 - lanes: 1 - registers: [F0_D, F1_D, F2_D, F3_D, F4_D, F5_D, F6_D, F7_D, F8_D, F9_D, F10_D, F11_D, F12_D, F13_D, F14_D, F15_D, F16_D, F17_D, F18_D, F19_D, F20_D, F21_D, F22_D, F23_D, F24_D, F25_D, F26_D, F27_D, F28_D, F29_D, F30_D, F31_D] - allocation_order: [F10_D, F11_D, F12_D, F13_D, F14_D, F15_D, F16_D, F17_D, F0_D, F1_D, F2_D, F3_D, F4_D, F5_D, F6_D, F7_D, F28_D, F29_D, F30_D, F31_D, F8_D, F9_D, F18_D, F19_D, F20_D, F21_D, F22_D, F23_D, F24_D, F25_D, F26_D, F27_D] - - - id: 4 - symbol: FPR64C - name: FPR64C - bank: FPR - size_bits: 64 - spill_size_bits: 64 - spill_alignment_bits: 64 - lanes: 1 - registers: [F8_D, F9_D, F10_D, F11_D, F12_D, F13_D, F14_D, F15_D] - allocation_order: [F10_D, F11_D, F12_D, F13_D, F14_D, F15_D, F8_D, F9_D] - - - id: 5 - symbol: FPR32 - name: FPR32 - bank: FPR - size_bits: 32 - spill_size_bits: 32 - spill_alignment_bits: 32 - lanes: 1 - registers: [F0_F, F1_F, F2_F, F3_F, F4_F, F5_F, F6_F, F7_F, F8_F, F9_F, F10_F, F11_F, F12_F, F13_F, F14_F, F15_F, F16_F, F17_F, F18_F, F19_F, F20_F, F21_F, F22_F, F23_F, F24_F, F25_F, F26_F, F27_F, F28_F, F29_F, F30_F, F31_F] - allocation_order: [F10_F, F11_F, F12_F, F13_F, F14_F, F15_F, F16_F, F17_F, F0_F, F1_F, F2_F, F3_F, F4_F, F5_F, F6_F, F7_F, F28_F, F29_F, F30_F, F31_F, F8_F, F9_F, F18_F, F19_F, F20_F, F21_F, F22_F, F23_F, F24_F, F25_F, F26_F, F27_F] - - - id: 6 - symbol: FPR32C - name: FPR32C - bank: FPR - size_bits: 32 - spill_size_bits: 32 - spill_alignment_bits: 32 - lanes: 1 - registers: [F8_F, F9_F, F10_F, F11_F, F12_F, F13_F, F14_F, F15_F] - allocation_order: [F10_F, F11_F, F12_F, F13_F, F14_F, F15_F, F8_F, F9_F] - - - id: 7 - symbol: GPR_NX0 - name: GPR_NX0 - bank: GPR - size_bits: 64 - spill_size_bits: 64 - spill_alignment_bits: 64 - lanes: 1 - registers: [X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31] - allocation_order: [X5, X6, X7, X28, X29, X30, X31, X10, X11, X12, X13, X14, X15, X16, X17, X8, X9, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X1] - - - id: 8 - symbol: GPR_NX0_NX2 - name: GPR_NX0_NX2 - bank: GPR - size_bits: 64 - spill_size_bits: 64 - spill_alignment_bits: 64 - lanes: 1 - registers: [X1, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31] - allocation_order: [X5, X6, X7, X28, X29, X30, X31, X10, X11, X12, X13, X14, X15, X16, X17, X8, X9, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X1] - - - id: 9 - symbol: FFLAGS - name: FFLAGS - bank: CSR - size_bits: 32 - spill_size_bits: 32 - spill_alignment_bits: 32 - lanes: 1 - registers: [FFLAGS] - allocation_order: [] - allocatable: false - - - id: 10 - symbol: FRM - name: FRM - bank: CSR - size_bits: 32 - spill_size_bits: 32 - spill_alignment_bits: 32 - lanes: 1 - registers: [FRM] - allocation_order: [] - allocatable: false - - - id: 11 - symbol: VR - name: VR - bank: VR - size_bits: 64 - spill_size_bits: 64 - spill_alignment_bits: 64 - lanes: 1 - registers: [V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24, V25, V26, V27, V28, V29, V30, V31] - allocation_order: [] - allocatable: false - -register_masks: - - - name: CSR_ILP32_LP64 - preserved: [X1, X8, X9, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27] - - - name: CSR_ILP32D_LP64D - preserved: [X1, X8, X9, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, F8_D, F9_D, F18_D, F19_D, F20_D, F21_D, F22_D, F23_D, F24_D, F25_D, F26_D, F27_D, F8_F, F9_F, F18_F, F19_F, F20_F, F21_F, F22_F, F23_F, F24_F, F25_F, F26_F, F27_F] - -mir_operand_flags: - direct_mask: 127 - direct: - - { name: riscv-call, value: 1 } - - { name: riscv-pcrel-hi, value: 2 } - - { name: riscv-pcrel-lo, value: 4 } - - { name: riscv-copy-f32, value: 8 } - - { name: riscv-copy-f64, value: 16 } - - { name: riscv-hi, value: 32 } - - { name: riscv-lo, value: 64 } - bitmask: [] - -calling_conventions: - - - id: 2 - symbol: LP64 - name: lp64 - integer_register_class: GPR - floating_register_class: FPR64 - integer_argument_registers: [X10, X11, X12, X13, X14, X15, X16, X17] - floating_argument_registers: [] - integer_return_registers: [X10, X11] - floating_return_registers: [] - preserved_mask: CSR_ILP32_LP64 - stack_alignment_bytes: 16 - stack_argument_alignment_bytes: 16 - shadow_space_bytes: 0 - supports_varargs: true - supports_tail_calls: true - - - id: 1 - symbol: LP64D - name: lp64d - integer_register_class: GPR - floating_register_class: FPR64 - integer_argument_registers: [X10, X11, X12, X13, X14, X15, X16, X17] - floating_argument_registers: [F10_D, F11_D, F12_D, F13_D, F14_D, F15_D, F16_D, F17_D] - integer_return_registers: [X10, X11] - floating_return_registers: [F10_D, F11_D] - preserved_mask: CSR_ILP32D_LP64D - stack_alignment_bytes: 16 - stack_argument_alignment_bytes: 16 - shadow_space_bytes: 0 - supports_varargs: true - supports_tail_calls: true - -named_operands: - - { id: 1, symbol: RD, name: rd } - - { id: 2, symbol: RS1, name: rs1 } - - { id: 3, symbol: RS2, name: rs2 } - - { id: 4, symbol: IMM, name: imm } - - { id: 5, symbol: TARGET, name: target } - - { id: 6, symbol: CSR, name: csr } - - { id: 7, symbol: ZIMM, name: zimm } - - { id: 8, symbol: PRED, name: pred } - - { id: 9, symbol: SUCC, name: succ } - - { id: 10, symbol: FRD, name: frd } - - { id: 11, symbol: FRS1, name: frs1 } - - { id: 12, symbol: FRS2, name: frs2 } - - { id: 13, symbol: FRS3, name: frs3 } - - { id: 14, symbol: RM, name: rm } - -immediate_predicates: - - { id: 1, symbol: SIMM12, name: simm12, kind: signed, bits: 12 } - - { id: 2, symbol: UIMM20, name: uimm20, kind: unsigned, bits: 20 } - - { id: 3, symbol: UIMM5, name: uimm5, kind: unsigned, bits: 5 } - - { id: 4, symbol: UIMM6, name: uimm6, kind: unsigned, bits: 6 } - - { id: 5, symbol: UIMM12, name: uimm12, kind: unsigned, bits: 12 } - - { id: 6, symbol: UIMM4, name: uimm4, kind: unsigned, bits: 4 } - - { id: 7, symbol: RM, name: rm, kind: unsigned, bits: 3, allowed_values: [0, 1, 2, 3, 4, 7] } - - { id: 8, symbol: C_UIMM10_NZ_A4, name: c-uimm10-nz-a4, kind: unsigned, bits: 10, alignment: 4, nonzero: true } - - { id: 9, symbol: C_UIMM7_A4, name: c-uimm7-a4, kind: unsigned, bits: 7, alignment: 4 } - - { id: 10, symbol: C_UIMM8_A8, name: c-uimm8-a8, kind: unsigned, bits: 8, alignment: 8 } - - { id: 11, symbol: C_UIMM8_A4, name: c-uimm8-a4, kind: unsigned, bits: 8, alignment: 4 } - - { id: 12, symbol: C_UIMM9_A8, name: c-uimm9-a8, kind: unsigned, bits: 9, alignment: 8 } - - { id: 13, symbol: C_SIMM6, name: c-simm6, kind: signed, bits: 6 } - - { id: 14, symbol: C_SIMM6_NZ, name: c-simm6-nz, kind: signed, bits: 6, nonzero: true } - - { id: 15, symbol: C_SIMM9_A2, name: c-simm9-a2, kind: signed, bits: 9, alignment: 2 } - - { id: 16, symbol: C_SIMM12_A2, name: c-simm12-a2, kind: signed, bits: 12, alignment: 2 } - - { id: 17, symbol: C_SIMM10_A16_NZ, name: c-simm10-a16-nz, kind: signed, bits: 10, alignment: 16, nonzero: true } - -scheduling_classes: - - { id: 1, symbol: ALU, name: alu, micro_ops: 1, latency: 1 } - - { id: 2, symbol: LOAD, name: load, micro_ops: 1, latency: 3 } - - { id: 3, symbol: STORE, name: store, micro_ops: 1, latency: 1 } - - { id: 4, symbol: BRANCH, name: branch, micro_ops: 1, latency: 1 } - - { id: 5, symbol: SYSTEM, name: system, micro_ops: 1, latency: 1 } - - { id: 6, symbol: MUL, name: mul, micro_ops: 1, latency: 3 } - - { id: 7, symbol: DIV, name: div, micro_ops: 1, latency: 20 } - - { id: 8, symbol: FENCE, name: fence, micro_ops: 1, latency: 1 } - - { id: 9, symbol: ATOMIC, name: atomic, micro_ops: 1, latency: 4 } - - { id: 10, symbol: FP_ADD, name: fp-add, micro_ops: 1, latency: 4 } - - { id: 11, symbol: FP_MUL, name: fp-mul, micro_ops: 1, latency: 4 } - - { id: 12, symbol: FP_DIV, name: fp-div, micro_ops: 1, latency: 20 } - - { id: 13, symbol: FP_SQRT, name: fp-sqrt, micro_ops: 1, latency: 20 } - - { id: 14, symbol: FP_CONVERT, name: fp-convert, micro_ops: 1, latency: 4 } - - { id: 15, symbol: COMPRESSED, name: compressed, micro_ops: 1, latency: 1 } - -encoding_categories: - - { id: 1, symbol: R, name: r, size_bytes: 4 } - - { id: 2, symbol: I, name: i, size_bytes: 4 } - - { id: 3, symbol: S, name: s, size_bytes: 4 } - - { id: 4, symbol: B, name: b, size_bytes: 4 } - - { id: 5, symbol: U, name: u, size_bytes: 4 } - - { id: 6, symbol: J, name: j, size_bytes: 4 } - - { id: 7, symbol: SYSTEM, name: system, size_bytes: 4 } - - { id: 8, symbol: AMO, name: amo, size_bytes: 4 } - - { id: 9, symbol: R4, name: r4, size_bytes: 4 } - - { id: 10, symbol: C, name: c, size_bytes: 2 } - -assembly_formats: - - { id: 1, symbol: RD_IMM, name: rd-imm } - - { id: 2, symbol: RD_RS1_IMM, name: rd-rs1-imm } - - { id: 3, symbol: RD_RS1_RS2, name: rd-rs1-rs2 } - - { id: 4, symbol: RD_OFFSET_RS1, name: rd-offset-rs1 } - - { id: 5, symbol: RS2_OFFSET_RS1, name: rs2-offset-rs1 } - - { id: 6, symbol: RS1_RS2_TARGET, name: rs1-rs2-target } - - { id: 7, symbol: RD_TARGET, name: rd-target } - - { id: 8, symbol: NONE, name: none } - - { id: 9, symbol: IMM_IMM, name: imm-imm } - - { id: 10, symbol: RD_CSR_RS1, name: rd-csr-rs1 } - - { id: 11, symbol: RD_CSR_IMM, name: rd-csr-imm } - - { id: 12, symbol: RD_PAREN_RS1, name: rd-paren-rs1 } - - { id: 13, symbol: RD_RS2_PAREN_RS1, name: rd-rs2-paren-rs1 } - - { id: 14, symbol: FRD_OFFSET_RS1, name: frd-offset-rs1 } - - { id: 15, symbol: FRS2_OFFSET_RS1, name: frs2-offset-rs1 } - - { id: 16, symbol: FRD_FRS1_FRS2_RM, name: frd-frs1-frs2-rm } - - { id: 17, symbol: FRD_FRS1_FRS2_FRS3_RM, name: frd-frs1-frs2-frs3-rm } - - { id: 18, symbol: FRD_FRS1_RM, name: frd-frs1-rm } - - { id: 19, symbol: FRD_FRS1_FRS2, name: frd-frs1-frs2 } - - { id: 20, symbol: RD_FRS1_RM, name: rd-frs1-rm } - - { id: 21, symbol: RD_FRS1, name: rd-frs1 } - - { id: 22, symbol: RD_FRS1_FRS2, name: rd-frs1-frs2 } - - { id: 23, symbol: FRD_RS1_RM, name: frd-rs1-rm } - - { id: 24, symbol: FRD_RS1, name: frd-rs1 } - - { id: 25, symbol: TARGET, name: target } - - { id: 26, symbol: RS1_TARGET, name: rs1-target } - - { id: 27, symbol: RS1, name: rs1 } - - { id: 28, symbol: RD_RS2, name: rd-rs2 } - - { id: 29, symbol: IMM_SP, name: imm-sp } - - { id: 30, symbol: RD_IMM_SP, name: rd-imm-sp } - - { id: 31, symbol: RD_OFFSET_SP, name: rd-offset-sp } - - { id: 32, symbol: RS2_OFFSET_SP, name: rs2-offset-sp } - - { id: 33, symbol: FRD_OFFSET_SP, name: frd-offset-sp } - - { id: 34, symbol: FRS2_OFFSET_SP, name: frs2-offset-sp } - - { id: 35, symbol: RD_RS1, name: rd-rs1 } - -instructions: - - - id: 1024 - symbol: LUI - name: LUI - assembly_mnemonic: lui - encoding: 5175 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: UIMM20, allowed_target_flags: 32, name: IMM } - num_explicit_defs: 1 - flags: [produces_code, rematerializable] - scheduling_class: ALU - encoding_category: U - assembly_format: RD_IMM - - - id: 1025 - symbol: AUIPC - name: AUIPC - assembly_mnemonic: auipc - encoding: 5143 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [immediate, basic_block, global_symbol, external_symbol, mc_symbol], immediate_predicate: UIMM20, allowed_target_flags: 3, name: IMM } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: U - assembly_format: RD_IMM - - - id: 1026 - symbol: ADDI - name: ADDI - assembly_mnemonic: addi - encoding: 1344531 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register, frame_index], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, allowed_target_flags: 68, name: IMM } - num_explicit_defs: 1 - flags: [produces_code, rematerializable] - scheduling_class: ALU - encoding_category: I - assembly_format: RD_RS1_IMM - - - id: 1042 - symbol: SRLI - name: SRLI - assembly_mnemonic: srli - encoding: 1365011 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [immediate], immediate_predicate: UIMM6, name: IMM } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: I - assembly_format: RD_RS1_IMM - - - id: 1043 - symbol: SRAI - name: SRAI - assembly_mnemonic: srai - encoding: 1075106835 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [immediate], immediate_predicate: UIMM6, name: IMM } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: I - assembly_format: RD_RS1_IMM - - - id: 1044 - symbol: ADDIW - name: ADDIW - assembly_mnemonic: addiw - encoding: 1344539 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [immediate], immediate_predicate: SIMM12, name: IMM } - num_explicit_defs: 1 - flags: [produces_code, rematerializable] - scheduling_class: ALU - encoding_category: I - assembly_format: RD_RS1_IMM - - - id: 1045 - symbol: SLLIW - name: SLLIW - assembly_mnemonic: slliw - encoding: 1348635 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [immediate], immediate_predicate: UIMM5, name: IMM } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: I - assembly_format: RD_RS1_IMM - - - id: 1046 - symbol: SRLIW - name: SRLIW - assembly_mnemonic: srliw - encoding: 1365019 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [immediate], immediate_predicate: UIMM5, name: IMM } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: I - assembly_format: RD_RS1_IMM - - - id: 1047 - symbol: SRAIW - name: SRAIW - assembly_mnemonic: sraiw - encoding: 1075106843 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [immediate], immediate_predicate: UIMM5, name: IMM } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: I - assembly_format: RD_RS1_IMM - - - id: 1048 - symbol: SLL - name: SLL - assembly_mnemonic: sll - encoding: 10785843 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1049 - symbol: SLT - name: SLT - assembly_mnemonic: slt - encoding: 10789939 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1050 - symbol: SLTU - name: SLTU - assembly_mnemonic: sltu - encoding: 10794035 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1051 - symbol: XOR - name: XOR - assembly_mnemonic: xor - encoding: 10798131 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1052 - symbol: SRL - name: SRL - assembly_mnemonic: srl - encoding: 10802227 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1053 - symbol: SRA - name: SRA - assembly_mnemonic: sra - encoding: 1084544051 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1054 - symbol: OR - name: OR - assembly_mnemonic: or - encoding: 10806323 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1055 - symbol: AND - name: AND - assembly_mnemonic: and - encoding: 10810419 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1056 - symbol: ADDW - name: ADDW - assembly_mnemonic: addw - encoding: 10781755 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1057 - symbol: SUBW - name: SUBW - assembly_mnemonic: subw - encoding: 1084523579 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1058 - symbol: SLLW - name: SLLW - assembly_mnemonic: sllw - encoding: 10785851 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1059 - symbol: SRLW - name: SRLW - assembly_mnemonic: srlw - encoding: 10802235 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1060 - symbol: SRAW - name: SRAW - assembly_mnemonic: sraw - encoding: 1084544059 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1061 - symbol: LB - name: LB - assembly_mnemonic: lb - encoding: 8684547 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, name: IMM, allowed_target_flags: 68 } - num_explicit_defs: 1 - flags: [may_load, produces_code] - scheduling_class: LOAD - encoding_category: I - assembly_format: RD_OFFSET_RS1 - - - id: 1062 - symbol: LH - name: LH - assembly_mnemonic: lh - encoding: 8688643 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, name: IMM, allowed_target_flags: 68 } - num_explicit_defs: 1 - flags: [may_load, produces_code] - scheduling_class: LOAD - encoding_category: I - assembly_format: RD_OFFSET_RS1 - - - id: 1063 - symbol: LW - name: LW - assembly_mnemonic: lw - encoding: 8692739 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [register, frame_index], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, name: IMM, allowed_target_flags: 68 } - num_explicit_defs: 1 - flags: [may_load, produces_code] - scheduling_class: LOAD - encoding_category: I - assembly_format: RD_OFFSET_RS1 - - - id: 1064 - symbol: LBU - name: LBU - assembly_mnemonic: lbu - encoding: 8700931 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, name: IMM, allowed_target_flags: 68 } - num_explicit_defs: 1 - flags: [may_load, produces_code] - scheduling_class: LOAD - encoding_category: I - assembly_format: RD_OFFSET_RS1 - - - id: 1065 - symbol: LHU - name: LHU - assembly_mnemonic: lhu - encoding: 8705027 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, name: IMM, allowed_target_flags: 68 } - num_explicit_defs: 1 - flags: [may_load, produces_code] - scheduling_class: LOAD - encoding_category: I - assembly_format: RD_OFFSET_RS1 - - - id: 1066 - symbol: LWU - name: LWU - assembly_mnemonic: lwu - encoding: 8709123 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, name: IMM, allowed_target_flags: 68 } - num_explicit_defs: 1 - flags: [may_load, produces_code] - scheduling_class: LOAD - encoding_category: I - assembly_format: RD_OFFSET_RS1 - - - id: 1067 - symbol: SB - name: SB - assembly_mnemonic: sb - encoding: 10781731 - operands: - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, name: IMM, allowed_target_flags: 68 } - num_explicit_defs: 0 - flags: [may_store, produces_code] - scheduling_class: STORE - encoding_category: S - assembly_format: RS2_OFFSET_RS1 - - - id: 1068 - symbol: SH - name: SH - assembly_mnemonic: sh - encoding: 10785827 - operands: - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, name: IMM, allowed_target_flags: 68 } - num_explicit_defs: 0 - flags: [may_store, produces_code] - scheduling_class: STORE - encoding_category: S - assembly_format: RS2_OFFSET_RS1 - - - id: 1069 - symbol: SW - name: SW - assembly_mnemonic: sw - encoding: 10789923 - operands: - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } - - { kinds: [register, frame_index], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, name: IMM, allowed_target_flags: 68 } - num_explicit_defs: 0 - flags: [may_store, produces_code] - scheduling_class: STORE - encoding_category: S - assembly_format: RS2_OFFSET_RS1 - - - id: 1070 - symbol: BLT - name: BLT - assembly_mnemonic: blt - encoding: 9715811 - operands: - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - - { kinds: [basic_block], name: TARGET } - num_explicit_defs: 0 - flags: [terminator, branch, produces_code] - scheduling_class: BRANCH - encoding_category: B - assembly_format: RS1_RS2_TARGET - - - id: 1071 - symbol: BGE - name: BGE - assembly_mnemonic: bge - encoding: 9719907 - operands: - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - - { kinds: [basic_block], name: TARGET } - num_explicit_defs: 0 - flags: [terminator, branch, produces_code] - scheduling_class: BRANCH - encoding_category: B - assembly_format: RS1_RS2_TARGET - - - id: 1072 - symbol: BLTU - name: BLTU - assembly_mnemonic: bltu - encoding: 9724003 - operands: - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - - { kinds: [basic_block], name: TARGET } - num_explicit_defs: 0 - flags: [terminator, branch, produces_code] - scheduling_class: BRANCH - encoding_category: B - assembly_format: RS1_RS2_TARGET - - - id: 1073 - symbol: BGEU - name: BGEU - assembly_mnemonic: bgeu - encoding: 9728099 - operands: - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - - { kinds: [basic_block], name: TARGET } - num_explicit_defs: 0 - flags: [terminator, branch, produces_code] - scheduling_class: BRANCH - encoding_category: B - assembly_format: RS1_RS2_TARGET - - - id: 1074 - symbol: JALR - name: JALR - assembly_mnemonic: jalr - encoding: 1344615 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [immediate, basic_block, global_symbol, external_symbol, mc_symbol], immediate_predicate: SIMM12, allowed_target_flags: 4, name: IMM } - num_explicit_defs: 1 - flags: [terminator, branch, indirect_branch, produces_code] - scheduling_class: BRANCH - encoding_category: I - assembly_format: RD_RS1_IMM - - - id: 1075 - symbol: FENCE - name: FENCE - assembly_mnemonic: fence - encoding: 15 - operands: - - { kinds: [immediate], immediate_predicate: UIMM4, name: PRED } - - { kinds: [immediate], immediate_predicate: UIMM4, name: SUCC } - num_explicit_defs: 0 - flags: [has_side_effects, produces_code] - scheduling_class: FENCE - encoding_category: I - assembly_format: IMM_IMM - - - id: 1076 - symbol: FENCE_I - name: FENCE_I - assembly_mnemonic: fence.i - encoding: 4111 - operands: [] - num_explicit_defs: 0 - flags: [has_side_effects, produces_code] - scheduling_class: FENCE - encoding_category: I - assembly_format: NONE - - - id: 1077 - symbol: CSRRW - name: CSRRW - assembly_mnemonic: csrrw - encoding: 1348723 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [immediate], immediate_predicate: UIMM12, name: CSR } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [has_side_effects, produces_code] - scheduling_class: SYSTEM - encoding_category: SYSTEM - assembly_format: RD_CSR_RS1 - - - id: 1078 - symbol: CSRRS - name: CSRRS - assembly_mnemonic: csrrs - encoding: 1352819 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [immediate], immediate_predicate: UIMM12, name: CSR } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [has_side_effects, produces_code] - scheduling_class: SYSTEM - encoding_category: SYSTEM - assembly_format: RD_CSR_RS1 - - - id: 1079 - symbol: CSRRC - name: CSRRC - assembly_mnemonic: csrrc - encoding: 1356915 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [immediate], immediate_predicate: UIMM12, name: CSR } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - num_explicit_defs: 1 - flags: [has_side_effects, produces_code] - scheduling_class: SYSTEM - encoding_category: SYSTEM - assembly_format: RD_CSR_RS1 - - - id: 1080 - symbol: CSRRWI - name: CSRRWI - assembly_mnemonic: csrrwi - encoding: 1102963 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [immediate], immediate_predicate: UIMM12, name: CSR } - - { kinds: [immediate], immediate_predicate: UIMM5, name: ZIMM } - num_explicit_defs: 1 - flags: [has_side_effects, produces_code] - scheduling_class: SYSTEM - encoding_category: SYSTEM - assembly_format: RD_CSR_IMM - - - id: 1083 - symbol: MUL - name: MUL - assembly_mnemonic: mul - encoding: 44336179 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code, commutable] - scheduling_class: MUL - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1084 - symbol: MULH - name: MULH - assembly_mnemonic: mulh - encoding: 44340275 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code, commutable] - scheduling_class: MUL - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1085 - symbol: MULHSU - name: MULHSU - assembly_mnemonic: mulhsu - encoding: 44344371 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: MUL - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1086 - symbol: MULHU - name: MULHU - assembly_mnemonic: mulhu - encoding: 44348467 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code, commutable] - scheduling_class: MUL - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1087 - symbol: DIV - name: DIV - assembly_mnemonic: div - encoding: 44352563 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: DIV - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1088 - symbol: DIVU - name: DIVU - assembly_mnemonic: divu - encoding: 44356659 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: DIV - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1089 - symbol: REM - name: REM - assembly_mnemonic: rem - encoding: 44360755 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: DIV - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1090 - symbol: REMU - name: REMU - assembly_mnemonic: remu - encoding: 44364851 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: DIV - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1091 - symbol: MULW - name: MULW - assembly_mnemonic: mulw - encoding: 44336187 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code, commutable] - scheduling_class: MUL - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1092 - symbol: DIVW - name: DIVW - assembly_mnemonic: divw - encoding: 44352571 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: DIV - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1093 - symbol: DIVUW - name: DIVUW - assembly_mnemonic: divuw - encoding: 44356667 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: DIV - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1094 - symbol: REMW - name: REMW - assembly_mnemonic: remw - encoding: 44360763 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: DIV - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1095 - symbol: REMUW - name: REMUW - assembly_mnemonic: remuw - encoding: 44364859 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: DIV - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1081 - symbol: CSRRSI - name: CSRRSI - assembly_mnemonic: csrrsi - encoding: 1107059 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [immediate], immediate_predicate: UIMM12, name: CSR } - - { kinds: [immediate], immediate_predicate: UIMM5, name: ZIMM } - num_explicit_defs: 1 - flags: [has_side_effects, produces_code] - scheduling_class: SYSTEM - encoding_category: SYSTEM - assembly_format: RD_CSR_IMM - - - id: 1082 - symbol: CSRRCI - name: CSRRCI - assembly_mnemonic: csrrci - encoding: 1111155 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [immediate], immediate_predicate: UIMM12, name: CSR } - - { kinds: [immediate], immediate_predicate: UIMM5, name: ZIMM } - num_explicit_defs: 1 - flags: [has_side_effects, produces_code] - scheduling_class: SYSTEM - encoding_category: SYSTEM - assembly_format: RD_CSR_IMM - - - id: 1027 - symbol: ADD - name: ADD - assembly_mnemonic: add - encoding: 10781747 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1028 - symbol: SUB - name: SUB - assembly_mnemonic: sub - encoding: 1084523571 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1029 - symbol: LD - name: LD - assembly_mnemonic: ld - encoding: 8696835 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [register, frame_index], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, name: IMM, allowed_target_flags: 68 } - num_explicit_defs: 1 - flags: [may_load, produces_code] - scheduling_class: LOAD - encoding_category: I - assembly_format: RD_OFFSET_RS1 - - - id: 1030 - symbol: SD - name: SD - assembly_mnemonic: sd - encoding: 10794019 - operands: - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } - - { kinds: [register, frame_index], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, name: IMM, allowed_target_flags: 68 } - num_explicit_defs: 0 - flags: [may_store, produces_code] - scheduling_class: STORE - encoding_category: S - assembly_format: RS2_OFFSET_RS1 - - - id: 1031 - symbol: BEQ - name: BEQ - assembly_mnemonic: beq - encoding: 9699427 - operands: - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - - { kinds: [basic_block], name: TARGET } - num_explicit_defs: 0 - flags: [terminator, branch, produces_code] - scheduling_class: BRANCH - encoding_category: B - assembly_format: RS1_RS2_TARGET - - - id: 1032 - symbol: BNE - name: BNE - assembly_mnemonic: bne - encoding: 9703523 - operands: - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - - { kinds: [basic_block], name: TARGET } - num_explicit_defs: 0 - flags: [terminator, branch, produces_code] - scheduling_class: BRANCH - encoding_category: B - assembly_format: RS1_RS2_TARGET - - - id: 1033 - symbol: JAL - name: JAL - assembly_mnemonic: jal - encoding: 1135 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [basic_block], name: TARGET } - num_explicit_defs: 1 - flags: [terminator, branch, produces_code] - scheduling_class: BRANCH - encoding_category: J - assembly_format: RD_TARGET - - - id: 1034 - symbol: ECALL - name: ECALL - assembly_mnemonic: ecall - encoding: 115 - operands: [] - num_explicit_defs: 0 - flags: [has_side_effects, produces_code] - scheduling_class: SYSTEM - encoding_category: SYSTEM - assembly_format: NONE - - - id: 1035 - symbol: EBREAK - name: EBREAK - assembly_mnemonic: ebreak - encoding: 1048691 - operands: [] - num_explicit_defs: 0 - flags: [has_side_effects, produces_code] - scheduling_class: SYSTEM - encoding_category: SYSTEM - assembly_format: NONE - - - id: 1036 - symbol: SLTI - name: SLTI - assembly_mnemonic: slti - encoding: 1352723 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [immediate], immediate_predicate: SIMM12, name: IMM } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: I - assembly_format: RD_RS1_IMM - - - id: 1037 - symbol: SLTIU - name: SLTIU - assembly_mnemonic: sltiu - encoding: 1356819 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [immediate], immediate_predicate: SIMM12, name: IMM } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: I - assembly_format: RD_RS1_IMM - - - id: 1038 - symbol: XORI - name: XORI - assembly_mnemonic: xori - encoding: 1360915 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [immediate], immediate_predicate: SIMM12, name: IMM } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: I - assembly_format: RD_RS1_IMM - - - id: 1039 - symbol: ORI - name: ORI - assembly_mnemonic: ori - encoding: 1369107 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [immediate], immediate_predicate: SIMM12, name: IMM } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: I - assembly_format: RD_RS1_IMM - - - id: 1040 - symbol: ANDI - name: ANDI - assembly_mnemonic: andi - encoding: 1373203 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [immediate], immediate_predicate: SIMM12, name: IMM } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: I - assembly_format: RD_RS1_IMM - - - id: 1041 - symbol: SLLI - name: SLLI - assembly_mnemonic: slli - encoding: 1348627 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [immediate], immediate_predicate: UIMM6, name: IMM } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: I - assembly_format: RD_RS1_IMM - - - id: 1247 - symbol: SH1ADD - name: SH1ADD - assembly_mnemonic: sh1add - encoding: 547660851 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1248 - symbol: SH2ADD - name: SH2ADD - assembly_mnemonic: sh2add - encoding: 547669043 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1249 - symbol: SH3ADD - name: SH3ADD - assembly_mnemonic: sh3add - encoding: 547677235 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1250 - symbol: SH1ADD_UW - name: SH1ADD_UW - assembly_mnemonic: sh1add.uw - encoding: 547660859 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1251 - symbol: SH2ADD_UW - name: SH2ADD_UW - assembly_mnemonic: sh2add.uw - encoding: 547669051 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1252 - symbol: SH3ADD_UW - name: SH3ADD_UW - assembly_mnemonic: sh3add.uw - encoding: 547677243 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1253 - symbol: SLLI_UW - name: SLLI_UW - assembly_mnemonic: slli.uw - encoding: 135566363 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [immediate], immediate_predicate: UIMM6, name: IMM } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: I - assembly_format: RD_RS1_IMM - - - id: 1254 - symbol: ADD_UW - name: ADD_UW - assembly_mnemonic: add.uw - encoding: 144999483 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1255 - symbol: SEXT_B - name: SEXT_B - assembly_mnemonic: sext.b - encoding: 1615107091 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: I - assembly_format: RD_RS1 - - - id: 1256 - symbol: SEXT_H - name: SEXT_H - assembly_mnemonic: sext.h - encoding: 1616155667 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: I - assembly_format: RD_RS1 - - - id: 1257 - symbol: ZEXT_H_RV32 - name: ZEXT_H_RV32 - assembly_mnemonic: zext.h - encoding: 134530099 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: R - assembly_format: RD_RS1 - - - id: 1258 - symbol: ZEXT_H_RV64 - name: ZEXT_H_RV64 - assembly_mnemonic: zext.h - encoding: 134530107 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: ALU - encoding_category: R - assembly_format: RD_RS1 - - - id: 1259 - symbol: MIN - name: MIN - assembly_mnemonic: min - encoding: 178570291 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code, commutable] - scheduling_class: ALU - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1260 - symbol: MINU - name: MINU - assembly_mnemonic: minu - encoding: 178574387 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code, commutable] - scheduling_class: ALU - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1261 - symbol: MAX - name: MAX - assembly_mnemonic: max - encoding: 178578483 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code, commutable] - scheduling_class: ALU - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1262 - symbol: MAXU - name: MAXU - assembly_mnemonic: maxu - encoding: 178582579 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code, commutable] - scheduling_class: ALU - encoding_category: R - assembly_format: RD_RS1_RS2 - - - id: 1096 - symbol: LR_W - name: LR_W - assembly_mnemonic: lr.w - encoding: 268739631 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - num_explicit_defs: 1 - flags: [may_load, produces_code] - scheduling_class: ATOMIC - encoding_category: AMO - assembly_format: RD_PAREN_RS1 - - - id: 1097 - symbol: SC_W - name: SC_W - assembly_mnemonic: sc.w - encoding: 413443119 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - num_explicit_defs: 1 - flags: [may_store, produces_code] - scheduling_class: ATOMIC - encoding_category: AMO - assembly_format: RD_RS2_PAREN_RS1 - - - id: 1098 - symbol: AMOSWAP_W - name: AMOSWAP_W - assembly_mnemonic: amoswap.w - encoding: 145007663 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - num_explicit_defs: 1 - flags: [may_load, may_store, produces_code] - scheduling_class: ATOMIC - encoding_category: AMO - assembly_format: RD_RS2_PAREN_RS1 - - - id: 1118 - symbol: FLW - name: FLW - assembly_mnemonic: flw - encoding: 8692743 - operands: - - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, memory_role: value, name: FRD } - - { kinds: [register, frame_index], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, name: IMM, allowed_target_flags: 68 } - num_explicit_defs: 1 - flags: [may_load, produces_code] - scheduling_class: LOAD - encoding_category: I - assembly_format: FRD_OFFSET_RS1 - - - id: 1119 - symbol: FSW - name: FSW - assembly_mnemonic: fsw - encoding: 10789927 - operands: - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, memory_role: value, name: FRS2 } - - { kinds: [register, frame_index], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, name: IMM, allowed_target_flags: 68 } - num_explicit_defs: 0 - flags: [may_store, produces_code] - scheduling_class: STORE - encoding_category: S - assembly_format: FRS2_OFFSET_RS1 - - - id: 1120 - symbol: FMADD_S - name: FMADD_S - assembly_mnemonic: fmadd.s - encoding: 1487176771 - operands: - - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS3 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_MUL - encoding_category: R4 - assembly_format: FRD_FRS1_FRS2_FRS3_RM - - - id: 1121 - symbol: FMSUB_S - name: FMSUB_S - assembly_mnemonic: fmsub.s - encoding: 1487176775 - operands: - - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS3 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_MUL - encoding_category: R4 - assembly_format: FRD_FRS1_FRS2_FRS3_RM - - - id: 1122 - symbol: FNMSUB_S - name: FNMSUB_S - assembly_mnemonic: fnmsub.s - encoding: 1487176779 - operands: - - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS3 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_MUL - encoding_category: R4 - assembly_format: FRD_FRS1_FRS2_FRS3_RM - - - id: 1123 - symbol: FNMADD_S - name: FNMADD_S - assembly_mnemonic: fnmadd.s - encoding: 1487176783 - operands: - - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS3 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_MUL - encoding_category: R4 - assembly_format: FRD_FRS1_FRS2_FRS3_RM - - - id: 1124 - symbol: FADD_S - name: FADD_S - assembly_mnemonic: fadd.s - encoding: 10781779 - operands: - - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_ADD - encoding_category: R - assembly_format: FRD_FRS1_FRS2_RM - - - id: 1125 - symbol: FSUB_S - name: FSUB_S - assembly_mnemonic: fsub.s - encoding: 144999507 - operands: - - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_ADD - encoding_category: R - assembly_format: FRD_FRS1_FRS2_RM - - - id: 1126 - symbol: FMUL_S - name: FMUL_S - assembly_mnemonic: fmul.s - encoding: 279217235 - operands: - - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_MUL - encoding_category: R - assembly_format: FRD_FRS1_FRS2_RM - - - id: 1127 - symbol: FDIV_S - name: FDIV_S - assembly_mnemonic: fdiv.s - encoding: 413434963 - operands: - - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_DIV - encoding_category: R - assembly_format: FRD_FRS1_FRS2_RM - - - id: 1128 - symbol: FSQRT_S - name: FSQRT_S - assembly_mnemonic: fsqrt.s - encoding: 1476691027 - operands: - - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_SQRT - encoding_category: R - assembly_format: FRD_FRS1_RM - - - id: 1129 - symbol: FSGNJ_S - name: FSGNJ_S - assembly_mnemonic: fsgnj.s - encoding: 547652691 - operands: - - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: FP_ADD - encoding_category: R - assembly_format: FRD_FRS1_FRS2 - - - id: 1130 - symbol: FSGNJN_S - name: FSGNJN_S - assembly_mnemonic: fsgnjn.s - encoding: 547656787 - operands: - - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: FP_ADD - encoding_category: R - assembly_format: FRD_FRS1_FRS2 - - - id: 1131 - symbol: FSGNJX_S - name: FSGNJX_S - assembly_mnemonic: fsgnjx.s - encoding: 547660883 - operands: - - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: FP_ADD - encoding_category: R - assembly_format: FRD_FRS1_FRS2 - - - id: 1132 - symbol: FMIN_S - name: FMIN_S - assembly_mnemonic: fmin.s - encoding: 681870419 - operands: - - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } - num_explicit_defs: 1 - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_ADD - encoding_category: R - assembly_format: FRD_FRS1_FRS2 - - - id: 1133 - symbol: FMAX_S - name: FMAX_S - assembly_mnemonic: fmax.s - encoding: 681874515 - operands: - - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } - num_explicit_defs: 1 - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_ADD - encoding_category: R - assembly_format: FRD_FRS1_FRS2 - - - id: 1134 - symbol: FCVT_W_S - name: FCVT_W_S - assembly_mnemonic: fcvt.w.s - encoding: 3221521491 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_CONVERT - encoding_category: R - assembly_format: RD_FRS1_RM - - - id: 1135 - symbol: FCVT_WU_S - name: FCVT_WU_S - assembly_mnemonic: fcvt.wu.s - encoding: 3222570067 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_CONVERT - encoding_category: R - assembly_format: RD_FRS1_RM - - - id: 1136 - symbol: FCVT_L_S - name: FCVT_L_S - assembly_mnemonic: fcvt.l.s - encoding: 3223618643 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_CONVERT - encoding_category: R - assembly_format: RD_FRS1_RM - - - id: 1137 - symbol: FCVT_LU_S - name: FCVT_LU_S - assembly_mnemonic: fcvt.lu.s - encoding: 3224667219 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_CONVERT - encoding_category: R - assembly_format: RD_FRS1_RM - - - id: 1138 - symbol: FMV_X_W - name: FMV_X_W - assembly_mnemonic: fmv.x.w - encoding: 3758392403 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: FP_CONVERT - encoding_category: R - assembly_format: RD_FRS1 - - - id: 1139 - symbol: FEQ_S - name: FEQ_S - assembly_mnemonic: feq.s - encoding: 2695144531 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } - num_explicit_defs: 1 - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_ADD - encoding_category: R - assembly_format: RD_FRS1_FRS2 - - - id: 1140 - symbol: FLT_S - name: FLT_S - assembly_mnemonic: flt.s - encoding: 2695140435 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } - num_explicit_defs: 1 - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_ADD - encoding_category: R - assembly_format: RD_FRS1_FRS2 - - - id: 1141 - symbol: FLE_S - name: FLE_S - assembly_mnemonic: fle.s - encoding: 2695136339 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } - num_explicit_defs: 1 - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_ADD - encoding_category: R - assembly_format: RD_FRS1_FRS2 - - - id: 1142 - symbol: FCLASS_S - name: FCLASS_S - assembly_mnemonic: fclass.s - encoding: 3758396499 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: FP_CONVERT - encoding_category: R - assembly_format: RD_FRS1 - - - id: 1143 - symbol: FCVT_S_W - name: FCVT_S_W - assembly_mnemonic: fcvt.s.w - encoding: 3489956947 - operands: - - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_CONVERT - encoding_category: R - assembly_format: FRD_RS1_RM - - - id: 1144 - symbol: FCVT_S_WU - name: FCVT_S_WU - assembly_mnemonic: fcvt.s.wu - encoding: 3491005523 - operands: - - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_CONVERT - encoding_category: R - assembly_format: FRD_RS1_RM - - - id: 1145 - symbol: FCVT_S_L - name: FCVT_S_L - assembly_mnemonic: fcvt.s.l - encoding: 3492054099 - operands: - - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_CONVERT - encoding_category: R - assembly_format: FRD_RS1_RM - - - id: 1146 - symbol: FCVT_S_LU - name: FCVT_S_LU - assembly_mnemonic: fcvt.s.lu - encoding: 3493102675 - operands: - - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_CONVERT - encoding_category: R - assembly_format: FRD_RS1_RM - - - id: 1147 - symbol: FMV_W_X - name: FMV_W_X - assembly_mnemonic: fmv.w.x - encoding: 4026827859 - operands: - - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: FP_CONVERT - encoding_category: R - assembly_format: FRD_RS1 - - - id: 1148 - symbol: FLD - name: FLD - assembly_mnemonic: fld - encoding: 8696839 - operands: - - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, memory_role: value, name: FRD } - - { kinds: [register, frame_index], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, name: IMM, allowed_target_flags: 68 } - num_explicit_defs: 1 - flags: [may_load, produces_code] - scheduling_class: LOAD - encoding_category: I - assembly_format: FRD_OFFSET_RS1 - - - id: 1149 - symbol: FSD - name: FSD - assembly_mnemonic: fsd - encoding: 10794023 - operands: - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, memory_role: value, name: FRS2 } - - { kinds: [register, frame_index], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, name: IMM, allowed_target_flags: 68 } - num_explicit_defs: 0 - flags: [may_store, produces_code] - scheduling_class: STORE - encoding_category: S - assembly_format: FRS2_OFFSET_RS1 - - - id: 1150 - symbol: FMADD_D - name: FMADD_D - assembly_mnemonic: fmadd.d - encoding: 1520731203 - operands: - - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS3 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_MUL - encoding_category: R4 - assembly_format: FRD_FRS1_FRS2_FRS3_RM - - - id: 1151 - symbol: FMSUB_D - name: FMSUB_D - assembly_mnemonic: fmsub.d - encoding: 1520731207 - operands: - - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS3 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_MUL - encoding_category: R4 - assembly_format: FRD_FRS1_FRS2_FRS3_RM - - - id: 1152 - symbol: FNMSUB_D - name: FNMSUB_D - assembly_mnemonic: fnmsub.d - encoding: 1520731211 - operands: - - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS3 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_MUL - encoding_category: R4 - assembly_format: FRD_FRS1_FRS2_FRS3_RM - - - id: 1153 - symbol: FNMADD_D - name: FNMADD_D - assembly_mnemonic: fnmadd.d - encoding: 1520731215 - operands: - - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS3 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_MUL - encoding_category: R4 - assembly_format: FRD_FRS1_FRS2_FRS3_RM - - - id: 1154 - symbol: FADD_D - name: FADD_D - assembly_mnemonic: fadd.d - encoding: 44336211 - operands: - - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_ADD - encoding_category: R - assembly_format: FRD_FRS1_FRS2_RM - - - id: 1155 - symbol: FSUB_D - name: FSUB_D - assembly_mnemonic: fsub.d - encoding: 178553939 - operands: - - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_ADD - encoding_category: R - assembly_format: FRD_FRS1_FRS2_RM - - - id: 1156 - symbol: FMUL_D - name: FMUL_D - assembly_mnemonic: fmul.d - encoding: 312771667 - operands: - - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_MUL - encoding_category: R - assembly_format: FRD_FRS1_FRS2_RM - - - id: 1157 - symbol: FDIV_D - name: FDIV_D - assembly_mnemonic: fdiv.d - encoding: 446989395 - operands: - - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_DIV - encoding_category: R - assembly_format: FRD_FRS1_FRS2_RM - - - id: 1158 - symbol: FSQRT_D - name: FSQRT_D - assembly_mnemonic: fsqrt.d - encoding: 1510245459 - operands: - - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_SQRT - encoding_category: R - assembly_format: FRD_FRS1_RM - - - id: 1159 - symbol: FSGNJ_D - name: FSGNJ_D - assembly_mnemonic: fsgnj.d - encoding: 581207123 - operands: - - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: FP_ADD - encoding_category: R - assembly_format: FRD_FRS1_FRS2 - - - id: 1160 - symbol: FSGNJN_D - name: FSGNJN_D - assembly_mnemonic: fsgnjn.d - encoding: 581211219 - operands: - - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: FP_ADD - encoding_category: R - assembly_format: FRD_FRS1_FRS2 - - - id: 1161 - symbol: FSGNJX_D - name: FSGNJX_D - assembly_mnemonic: fsgnjx.d - encoding: 581215315 - operands: - - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: FP_ADD - encoding_category: R - assembly_format: FRD_FRS1_FRS2 - - - id: 1162 - symbol: FMIN_D - name: FMIN_D - assembly_mnemonic: fmin.d - encoding: 715424851 - operands: - - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } - num_explicit_defs: 1 - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_ADD - encoding_category: R - assembly_format: FRD_FRS1_FRS2 - - - id: 1163 - symbol: FMAX_D - name: FMAX_D - assembly_mnemonic: fmax.d - encoding: 715428947 - operands: - - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } - num_explicit_defs: 1 - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_ADD - encoding_category: R - assembly_format: FRD_FRS1_FRS2 - - - id: 1164 - symbol: FCVT_W_D - name: FCVT_W_D - assembly_mnemonic: fcvt.w.d - encoding: 3255075923 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_CONVERT - encoding_category: R - assembly_format: RD_FRS1_RM - - - id: 1165 - symbol: FCVT_WU_D - name: FCVT_WU_D - assembly_mnemonic: fcvt.wu.d - encoding: 3256124499 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_CONVERT - encoding_category: R - assembly_format: RD_FRS1_RM - - - id: 1166 - symbol: FCVT_L_D - name: FCVT_L_D - assembly_mnemonic: fcvt.l.d - encoding: 3257173075 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_CONVERT - encoding_category: R - assembly_format: RD_FRS1_RM - - - id: 1167 - symbol: FCVT_LU_D - name: FCVT_LU_D - assembly_mnemonic: fcvt.lu.d - encoding: 3258221651 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_CONVERT - encoding_category: R - assembly_format: RD_FRS1_RM - - - id: 1168 - symbol: FMV_X_D - name: FMV_X_D - assembly_mnemonic: fmv.x.d - encoding: 3791946835 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: FP_CONVERT - encoding_category: R - assembly_format: RD_FRS1 - - - id: 1169 - symbol: FEQ_D - name: FEQ_D - assembly_mnemonic: feq.d - encoding: 2728698963 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } - num_explicit_defs: 1 - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_ADD - encoding_category: R - assembly_format: RD_FRS1_FRS2 - - - id: 1170 - symbol: FLT_D - name: FLT_D - assembly_mnemonic: flt.d - encoding: 2728694867 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } - num_explicit_defs: 1 - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_ADD - encoding_category: R - assembly_format: RD_FRS1_FRS2 - - - id: 1171 - symbol: FLE_D - name: FLE_D - assembly_mnemonic: fle.d - encoding: 2728690771 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } - num_explicit_defs: 1 - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_ADD - encoding_category: R - assembly_format: RD_FRS1_FRS2 - - - id: 1172 - symbol: FCLASS_D - name: FCLASS_D - assembly_mnemonic: fclass.d - encoding: 3791950931 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: FP_CONVERT - encoding_category: R - assembly_format: RD_FRS1 - - - id: 1173 - symbol: FCVT_D_W - name: FCVT_D_W - assembly_mnemonic: fcvt.d.w - encoding: 3523511379 - operands: - - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [produces_code] - scheduling_class: FP_CONVERT - encoding_category: R - assembly_format: FRD_RS1_RM - - - id: 1174 - symbol: FCVT_D_WU - name: FCVT_D_WU - assembly_mnemonic: fcvt.d.wu - encoding: 3524559955 - operands: - - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [produces_code] - scheduling_class: FP_CONVERT - encoding_category: R - assembly_format: FRD_RS1_RM - - - id: 1175 - symbol: FCVT_D_L - name: FCVT_D_L - assembly_mnemonic: fcvt.d.l - encoding: 3525608531 - operands: - - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_CONVERT - encoding_category: R - assembly_format: FRD_RS1_RM - - - id: 1176 - symbol: FCVT_D_LU - name: FCVT_D_LU - assembly_mnemonic: fcvt.d.lu - encoding: 3526657107 - operands: - - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_CONVERT - encoding_category: R - assembly_format: FRD_RS1_RM - - - id: 1177 - symbol: FMV_D_X - name: FMV_D_X - assembly_mnemonic: fmv.d.x - encoding: 4060382291 - operands: - - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: FP_CONVERT - encoding_category: R - assembly_format: FRD_RS1 - - - id: 1178 - symbol: FCVT_S_D - name: FCVT_S_D - assembly_mnemonic: fcvt.s.d - encoding: 1075086419 - operands: - - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_CONVERT - encoding_category: R - assembly_format: FRD_FRS1_RM - - - id: 1180 - symbol: C_ADDI4SPN - name: C_ADDI4SPN - assembly_mnemonic: c.addi4spn - encoding: 2048 - operands: - - { kinds: [register], role: def, register_class: GPRC, register_bank: GPR, name: RD } - - { kinds: [immediate], immediate_predicate: C_UIMM10_NZ_A4, name: IMM } - num_explicit_defs: 1 - flags: [produces_code] - implicit_uses: [{ register: X2 }] - scheduling_class: COMPRESSED - encoding_category: C - assembly_format: RD_IMM_SP - - - id: 1181 - symbol: C_FLD - name: C_FLD - assembly_mnemonic: c.fld - encoding: 9344 - operands: - - { kinds: [register], role: def, register_class: FPR64C, register_bank: FPR, memory_role: value, name: FRD } - - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, memory_role: address, name: RS1 } - - { kinds: [immediate], immediate_predicate: C_UIMM8_A8, name: IMM } - num_explicit_defs: 1 - flags: [may_load, produces_code] - scheduling_class: LOAD - encoding_category: C - assembly_format: FRD_OFFSET_RS1 - - - id: 1182 - symbol: C_LW - name: C_LW - assembly_mnemonic: c.lw - encoding: 17536 - operands: - - { kinds: [register], role: def, register_class: GPRC, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, memory_role: address, name: RS1 } - - { kinds: [immediate], immediate_predicate: C_UIMM7_A4, name: IMM } - num_explicit_defs: 1 - flags: [may_load, produces_code] - scheduling_class: LOAD - encoding_category: C - assembly_format: RD_OFFSET_RS1 - - - id: 1183 - symbol: C_LD - name: C_LD - assembly_mnemonic: c.ld - encoding: 25728 - operands: - - { kinds: [register], role: def, register_class: GPRC, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, memory_role: address, name: RS1 } - - { kinds: [immediate], immediate_predicate: C_UIMM8_A8, name: IMM } - num_explicit_defs: 1 - flags: [may_load, produces_code] - scheduling_class: LOAD - encoding_category: C - assembly_format: RD_OFFSET_RS1 - - - id: 1184 - symbol: C_FSD - name: C_FSD - assembly_mnemonic: c.fsd - encoding: 42120 - operands: - - { kinds: [register], role: use, register_class: FPR64C, register_bank: FPR, memory_role: value, name: FRS2 } - - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, memory_role: address, name: RS1 } - - { kinds: [immediate], immediate_predicate: C_UIMM8_A8, name: IMM } - num_explicit_defs: 0 - flags: [may_store, produces_code] - scheduling_class: STORE - encoding_category: C - assembly_format: FRS2_OFFSET_RS1 - - - id: 1185 - symbol: C_SW - name: C_SW - assembly_mnemonic: c.sw - encoding: 50312 - operands: - - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, memory_role: value, name: RS2 } - - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, memory_role: address, name: RS1 } - - { kinds: [immediate], immediate_predicate: C_UIMM7_A4, name: IMM } - num_explicit_defs: 0 - flags: [may_store, produces_code] - scheduling_class: STORE - encoding_category: C - assembly_format: RS2_OFFSET_RS1 - - - id: 1186 - symbol: C_SD - name: C_SD - assembly_mnemonic: c.sd - encoding: 58504 - operands: - - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, memory_role: value, name: RS2 } - - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, memory_role: address, name: RS1 } - - { kinds: [immediate], immediate_predicate: C_UIMM8_A8, name: IMM } - num_explicit_defs: 0 - flags: [may_store, produces_code] - scheduling_class: STORE - encoding_category: C - assembly_format: RS2_OFFSET_RS1 - - - id: 1187 - symbol: C_ADDI - name: C_ADDI - assembly_mnemonic: c.addi - encoding: 1029 - operands: - - { kinds: [register], role: def_use, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [immediate], immediate_predicate: C_SIMM6, name: IMM } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: COMPRESSED - encoding_category: C - assembly_format: RD_IMM - - - id: 1188 - symbol: C_ADDIW - name: C_ADDIW - assembly_mnemonic: c.addiw - encoding: 9221 - operands: - - { kinds: [register], role: def_use, register_class: GPR_NX0, register_bank: GPR, name: RD } - - { kinds: [immediate], immediate_predicate: C_SIMM6, name: IMM } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: COMPRESSED - encoding_category: C - assembly_format: RD_IMM - - - id: 1189 - symbol: C_LI - name: C_LI - assembly_mnemonic: c.li - encoding: 17413 - operands: - - { kinds: [register], role: def, register_class: GPR_NX0, register_bank: GPR, name: RD } - - { kinds: [immediate], immediate_predicate: C_SIMM6, name: IMM } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: COMPRESSED - encoding_category: C - assembly_format: RD_IMM - - - id: 1190 - symbol: C_ADDI16SP - name: C_ADDI16SP - assembly_mnemonic: c.addi16sp - encoding: 24897 - operands: - - { kinds: [immediate], immediate_predicate: C_SIMM10_A16_NZ, name: IMM } - num_explicit_defs: 0 - flags: [produces_code] - implicit_defs: [{ register: X2 }] - implicit_uses: [{ register: X2 }] - scheduling_class: COMPRESSED - encoding_category: C - assembly_format: IMM_SP - - - id: 1191 - symbol: C_LUI - name: C_LUI - assembly_mnemonic: c.lui - encoding: 25605 - operands: - - { kinds: [register], role: def, register_class: GPR_NX0_NX2, register_bank: GPR, name: RD } - - { kinds: [immediate], immediate_predicate: C_SIMM6_NZ, name: IMM } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: COMPRESSED - encoding_category: C - assembly_format: RD_IMM - - - id: 1192 - symbol: C_SRLI - name: C_SRLI - assembly_mnemonic: c.srli - encoding: 32773 - operands: - - { kinds: [register], role: def_use, register_class: GPRC, register_bank: GPR, name: RD } - - { kinds: [immediate], immediate_predicate: UIMM6, name: IMM } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: COMPRESSED - encoding_category: C - assembly_format: RD_IMM - - - id: 1193 - symbol: C_SRAI - name: C_SRAI - assembly_mnemonic: c.srai - encoding: 33797 - operands: - - { kinds: [register], role: def_use, register_class: GPRC, register_bank: GPR, name: RD } - - { kinds: [immediate], immediate_predicate: UIMM6, name: IMM } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: COMPRESSED - encoding_category: C - assembly_format: RD_IMM - - - id: 1194 - symbol: C_ANDI - name: C_ANDI - assembly_mnemonic: c.andi - encoding: 34821 - operands: - - { kinds: [register], role: def_use, register_class: GPRC, register_bank: GPR, name: RD } - - { kinds: [immediate], immediate_predicate: C_SIMM6, name: IMM } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: COMPRESSED - encoding_category: C - assembly_format: RD_IMM - - - id: 1195 - symbol: C_SUB - name: C_SUB - assembly_mnemonic: c.sub - encoding: 35845 - operands: - - { kinds: [register], role: def_use, register_class: GPRC, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: COMPRESSED - encoding_category: C - assembly_format: RD_RS2 - - - id: 1196 - symbol: C_XOR - name: C_XOR - assembly_mnemonic: c.xor - encoding: 35877 - operands: - - { kinds: [register], role: def_use, register_class: GPRC, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: COMPRESSED - encoding_category: C - assembly_format: RD_RS2 - - - id: 1197 - symbol: C_OR - name: C_OR - assembly_mnemonic: c.or - encoding: 35909 - operands: - - { kinds: [register], role: def_use, register_class: GPRC, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: COMPRESSED - encoding_category: C - assembly_format: RD_RS2 - - - id: 1198 - symbol: C_AND - name: C_AND - assembly_mnemonic: c.and - encoding: 35941 - operands: - - { kinds: [register], role: def_use, register_class: GPRC, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: COMPRESSED - encoding_category: C - assembly_format: RD_RS2 - - - id: 1199 - symbol: C_SUBW - name: C_SUBW - assembly_mnemonic: c.subw - encoding: 39941 - operands: - - { kinds: [register], role: def_use, register_class: GPRC, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: COMPRESSED - encoding_category: C - assembly_format: RD_RS2 - - - id: 1200 - symbol: C_ADDW - name: C_ADDW - assembly_mnemonic: c.addw - encoding: 39973 - operands: - - { kinds: [register], role: def_use, register_class: GPRC, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: COMPRESSED - encoding_category: C - assembly_format: RD_RS2 - - - id: 1201 - symbol: C_J - name: C_J - assembly_mnemonic: c.j - encoding: 40961 - operands: - - { kinds: [basic_block], name: TARGET } - num_explicit_defs: 0 - flags: [terminator, branch, produces_code] - scheduling_class: COMPRESSED - encoding_category: C - assembly_format: TARGET - - - id: 1202 - symbol: C_BEQZ - name: C_BEQZ - assembly_mnemonic: c.beqz - encoding: 49153 - operands: - - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, name: RS1 } - - { kinds: [basic_block], name: TARGET } - num_explicit_defs: 0 - flags: [terminator, branch, produces_code] - scheduling_class: COMPRESSED - encoding_category: C - assembly_format: RS1_TARGET - - - id: 1203 - symbol: C_BNEZ - name: C_BNEZ - assembly_mnemonic: c.bnez - encoding: 57345 - operands: - - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, name: RS1 } - - { kinds: [basic_block], name: TARGET } - num_explicit_defs: 0 - flags: [terminator, branch, produces_code] - scheduling_class: COMPRESSED - encoding_category: C - assembly_format: RS1_TARGET - - - id: 1204 - symbol: C_SLLI - name: C_SLLI - assembly_mnemonic: c.slli - encoding: 1030 - operands: - - { kinds: [register], role: def_use, register_class: GPR_NX0, register_bank: GPR, name: RD } - - { kinds: [immediate], immediate_predicate: UIMM6, name: IMM } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: COMPRESSED - encoding_category: C - assembly_format: RD_IMM - - - id: 1205 - symbol: C_FLDSP - name: C_FLDSP - assembly_mnemonic: c.fldsp - encoding: 9250 - operands: - - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, memory_role: value, name: FRD } - - { kinds: [immediate], immediate_predicate: C_UIMM9_A8, name: IMM } - num_explicit_defs: 1 - flags: [may_load, produces_code] - implicit_uses: [{ register: X2 }] - scheduling_class: LOAD - encoding_category: C - assembly_format: FRD_OFFSET_SP - - - id: 1206 - symbol: C_LWSP - name: C_LWSP - assembly_mnemonic: c.lwsp - encoding: 17442 - operands: - - { kinds: [register], role: def, register_class: GPR_NX0, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [immediate], immediate_predicate: C_UIMM8_A4, name: IMM } - num_explicit_defs: 1 - flags: [may_load, produces_code] - implicit_uses: [{ register: X2 }] - scheduling_class: LOAD - encoding_category: C - assembly_format: RD_OFFSET_SP - - - id: 1207 - symbol: C_LDSP - name: C_LDSP - assembly_mnemonic: c.ldsp - encoding: 25634 - operands: - - { kinds: [register], role: def, register_class: GPR_NX0, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [immediate], immediate_predicate: C_UIMM9_A8, name: IMM } - num_explicit_defs: 1 - flags: [may_load, produces_code] - implicit_uses: [{ register: X2 }] - scheduling_class: LOAD - encoding_category: C - assembly_format: RD_OFFSET_SP - - - id: 1208 - symbol: C_JR - name: C_JR - assembly_mnemonic: c.jr - encoding: 33794 - operands: - - { kinds: [register], role: use, register_class: GPR_NX0, register_bank: GPR, name: RS1 } - num_explicit_defs: 0 - flags: [terminator, branch, indirect_branch, produces_code] - scheduling_class: COMPRESSED - encoding_category: C - assembly_format: RS1 - - - id: 1209 - symbol: C_MV - name: C_MV - assembly_mnemonic: c.mv - encoding: 33830 - operands: - - { kinds: [register], role: def, register_class: GPR_NX0, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR_NX0, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: COMPRESSED - encoding_category: C - assembly_format: RD_RS2 - - - id: 1210 - symbol: C_EBREAK - name: C_EBREAK - assembly_mnemonic: c.ebreak - encoding: 36866 - operands: [] - num_explicit_defs: 0 - flags: [has_side_effects, produces_code] - scheduling_class: COMPRESSED - encoding_category: C - assembly_format: NONE - - - id: 1211 - symbol: C_JALR - name: C_JALR - assembly_mnemonic: c.jalr - encoding: 37890 - operands: - - { kinds: [register], role: use, register_class: GPR_NX0, register_bank: GPR, name: RS1 } - num_explicit_defs: 0 - flags: [terminator, branch, indirect_branch, produces_code] - implicit_defs: [{ register: X1 }] - scheduling_class: COMPRESSED - encoding_category: C - assembly_format: RS1 - - - id: 1212 - symbol: C_ADD - name: C_ADD - assembly_mnemonic: c.add - encoding: 37926 - operands: - - { kinds: [register], role: def_use, register_class: GPR_NX0, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR_NX0, register_bank: GPR, name: RS2 } - num_explicit_defs: 1 - flags: [produces_code] - scheduling_class: COMPRESSED - encoding_category: C - assembly_format: RD_RS2 - - - id: 1213 - symbol: C_FSDSP - name: C_FSDSP - assembly_mnemonic: c.fsdsp - encoding: 42018 - operands: - - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, memory_role: value, name: FRS2 } - - { kinds: [immediate], immediate_predicate: C_UIMM9_A8, name: IMM } - num_explicit_defs: 0 - flags: [may_store, produces_code] - implicit_uses: [{ register: X2 }] - scheduling_class: STORE - encoding_category: C - assembly_format: FRS2_OFFSET_SP - - - id: 1214 - symbol: C_SWSP - name: C_SWSP - assembly_mnemonic: c.swsp - encoding: 50210 - operands: - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } - - { kinds: [immediate], immediate_predicate: C_UIMM8_A4, name: IMM } - num_explicit_defs: 0 - flags: [may_store, produces_code] - implicit_uses: [{ register: X2 }] - scheduling_class: STORE - encoding_category: C - assembly_format: RS2_OFFSET_SP - - - id: 1215 - symbol: C_SDSP - name: C_SDSP - assembly_mnemonic: c.sdsp - encoding: 58402 - operands: - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } - - { kinds: [immediate], immediate_predicate: C_UIMM9_A8, name: IMM } - num_explicit_defs: 0 - flags: [may_store, produces_code] - implicit_uses: [{ register: X2 }] - scheduling_class: STORE - encoding_category: C - assembly_format: RS2_OFFSET_SP - - - id: 1179 - symbol: FCVT_D_S - name: FCVT_D_S - assembly_mnemonic: fcvt.d.s - encoding: 1107592275 - operands: - - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } - - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } - - { kinds: [immediate], immediate_predicate: RM, name: RM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [may_raise_fp_exception, produces_code] - scheduling_class: FP_CONVERT - encoding_category: R - assembly_format: FRD_FRS1_RM - - - id: 1099 - symbol: AMOADD_W - name: AMOADD_W - assembly_mnemonic: amoadd.w - encoding: 10789935 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - num_explicit_defs: 1 - flags: [may_load, may_store, produces_code] - scheduling_class: ATOMIC - encoding_category: AMO - assembly_format: RD_RS2_PAREN_RS1 - - - id: 1100 - symbol: AMOXOR_W - name: AMOXOR_W - assembly_mnemonic: amoxor.w - encoding: 547660847 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - num_explicit_defs: 1 - flags: [may_load, may_store, produces_code] - scheduling_class: ATOMIC - encoding_category: AMO - assembly_format: RD_RS2_PAREN_RS1 - - - id: 1101 - symbol: AMOAND_W - name: AMOAND_W - assembly_mnemonic: amoand.w - encoding: 1621402671 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - num_explicit_defs: 1 - flags: [may_load, may_store, produces_code] - scheduling_class: ATOMIC - encoding_category: AMO - assembly_format: RD_RS2_PAREN_RS1 - - - id: 1102 - symbol: AMOOR_W - name: AMOOR_W - assembly_mnemonic: amoor.w - encoding: 1084531759 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - num_explicit_defs: 1 - flags: [may_load, may_store, produces_code] - scheduling_class: ATOMIC - encoding_category: AMO - assembly_format: RD_RS2_PAREN_RS1 - - - id: 1103 - symbol: AMOMIN_W - name: AMOMIN_W - assembly_mnemonic: amomin.w - encoding: 2158273583 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - num_explicit_defs: 1 - flags: [may_load, may_store, produces_code] - scheduling_class: ATOMIC - encoding_category: AMO - assembly_format: RD_RS2_PAREN_RS1 - - - id: 1104 - symbol: AMOMAX_W - name: AMOMAX_W - assembly_mnemonic: amomax.w - encoding: 2695144495 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - num_explicit_defs: 1 - flags: [may_load, may_store, produces_code] - scheduling_class: ATOMIC - encoding_category: AMO - assembly_format: RD_RS2_PAREN_RS1 - - - id: 1105 - symbol: AMOMINU_W - name: AMOMINU_W - assembly_mnemonic: amominu.w - encoding: 3232015407 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - num_explicit_defs: 1 - flags: [may_load, may_store, produces_code] - scheduling_class: ATOMIC - encoding_category: AMO - assembly_format: RD_RS2_PAREN_RS1 - - - id: 1106 - symbol: AMOMAXU_W - name: AMOMAXU_W - assembly_mnemonic: amomaxu.w - encoding: 3768886319 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - num_explicit_defs: 1 - flags: [may_load, may_store, produces_code] - scheduling_class: ATOMIC - encoding_category: AMO - assembly_format: RD_RS2_PAREN_RS1 - - - id: 1107 - symbol: LR_D - name: LR_D - assembly_mnemonic: lr.d - encoding: 268743727 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - num_explicit_defs: 1 - flags: [may_load, produces_code] - scheduling_class: ATOMIC - encoding_category: AMO - assembly_format: RD_PAREN_RS1 - - - id: 1108 - symbol: SC_D - name: SC_D - assembly_mnemonic: sc.d - encoding: 413447215 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - num_explicit_defs: 1 - flags: [may_store, produces_code] - scheduling_class: ATOMIC - encoding_category: AMO - assembly_format: RD_RS2_PAREN_RS1 - - - id: 1109 - symbol: AMOSWAP_D - name: AMOSWAP_D - assembly_mnemonic: amoswap.d - encoding: 145011759 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - num_explicit_defs: 1 - flags: [may_load, may_store, produces_code] - scheduling_class: ATOMIC - encoding_category: AMO - assembly_format: RD_RS2_PAREN_RS1 - - - id: 1110 - symbol: AMOADD_D - name: AMOADD_D - assembly_mnemonic: amoadd.d - encoding: 10794031 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - num_explicit_defs: 1 - flags: [may_load, may_store, produces_code] - scheduling_class: ATOMIC - encoding_category: AMO - assembly_format: RD_RS2_PAREN_RS1 - - - id: 1111 - symbol: AMOXOR_D - name: AMOXOR_D - assembly_mnemonic: amoxor.d - encoding: 547664943 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - num_explicit_defs: 1 - flags: [may_load, may_store, produces_code] - scheduling_class: ATOMIC - encoding_category: AMO - assembly_format: RD_RS2_PAREN_RS1 - - - id: 1112 - symbol: AMOAND_D - name: AMOAND_D - assembly_mnemonic: amoand.d - encoding: 1621406767 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - num_explicit_defs: 1 - flags: [may_load, may_store, produces_code] - scheduling_class: ATOMIC - encoding_category: AMO - assembly_format: RD_RS2_PAREN_RS1 - - - id: 1113 - symbol: AMOOR_D - name: AMOOR_D - assembly_mnemonic: amoor.d - encoding: 1084535855 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - num_explicit_defs: 1 - flags: [may_load, may_store, produces_code] - scheduling_class: ATOMIC - encoding_category: AMO - assembly_format: RD_RS2_PAREN_RS1 - - - id: 1114 - symbol: AMOMIN_D - name: AMOMIN_D - assembly_mnemonic: amomin.d - encoding: 2158277679 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - num_explicit_defs: 1 - flags: [may_load, may_store, produces_code] - scheduling_class: ATOMIC - encoding_category: AMO - assembly_format: RD_RS2_PAREN_RS1 - - - id: 1115 - symbol: AMOMAX_D - name: AMOMAX_D - assembly_mnemonic: amomax.d - encoding: 2695148591 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - num_explicit_defs: 1 - flags: [may_load, may_store, produces_code] - scheduling_class: ATOMIC - encoding_category: AMO - assembly_format: RD_RS2_PAREN_RS1 - - - id: 1116 - symbol: AMOMINU_D - name: AMOMINU_D - assembly_mnemonic: amominu.d - encoding: 3232019503 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - num_explicit_defs: 1 - flags: [may_load, may_store, produces_code] - scheduling_class: ATOMIC - encoding_category: AMO - assembly_format: RD_RS2_PAREN_RS1 - - - id: 1117 - symbol: AMOMAXU_D - name: AMOMAXU_D - assembly_mnemonic: amomaxu.d - encoding: 3768890415 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } - num_explicit_defs: 1 - flags: [may_load, may_store, produces_code] - scheduling_class: ATOMIC - encoding_category: AMO - assembly_format: RD_RS2_PAREN_RS1 - - - id: 1229 - symbol: G_SLLW - name: G_SLLW - operands: - - { kinds: [register], role: def, type_index: 0 } - - { kinds: [register], role: use, type_index: 0 } - - { kinds: [register], role: use, type_index: 0 } - num_explicit_defs: 1 - flags: [generic, pseudo, allowed_pre_legalizer] - owner: instruction_select - deadline: selected - - - id: 1230 - symbol: G_SRAW - name: G_SRAW - operands: - - { kinds: [register], role: def, type_index: 0 } - - { kinds: [register], role: use, type_index: 0 } - - { kinds: [register], role: use, type_index: 0 } - num_explicit_defs: 1 - flags: [generic, pseudo, allowed_pre_legalizer] - owner: instruction_select - deadline: selected - - - id: 1231 - symbol: G_DIVW - name: G_DIVW - operands: - - { kinds: [register], role: def, type_index: 0 } - - { kinds: [register], role: use, type_index: 0 } - - { kinds: [register], role: use, type_index: 0 } - num_explicit_defs: 1 - flags: [generic, pseudo, allowed_pre_legalizer] - owner: instruction_select - deadline: selected - - - id: 1232 - symbol: G_CLZW - name: G_CLZW - operands: - - { kinds: [register], role: def, type_index: 0 } - - { kinds: [register], role: use, type_index: 0 } - num_explicit_defs: 1 - flags: [generic, pseudo, allowed_pre_legalizer] - owner: instruction_select - deadline: selected - - - id: 1233 - symbol: G_CTZW - name: G_CTZW - operands: - - { kinds: [register], role: def, type_index: 0 } - - { kinds: [register], role: use, type_index: 0 } - num_explicit_defs: 1 - flags: [generic, pseudo, allowed_pre_legalizer] - owner: instruction_select - deadline: selected - - - id: 1234 - symbol: G_FCVT_W_RV64 - name: G_FCVT_W_RV64 - operands: - - { kinds: [register], role: def, type_index: 0 } - - { kinds: [register], role: use, type_index: 1 } - - { kinds: [immediate] } - num_explicit_defs: 1 - flags: [generic, pseudo, allowed_pre_legalizer] - owner: instruction_select - deadline: selected - - - id: 1235 - symbol: G_FCLASS - name: G_FCLASS - operands: - - { kinds: [register], role: def, type_index: 0 } - - { kinds: [register], role: use, type_index: 1 } - num_explicit_defs: 1 - flags: [generic, pseudo, allowed_pre_legalizer] - owner: instruction_select - deadline: selected - - - id: 1236 - symbol: G_ROLW - name: G_ROLW - operands: - - { kinds: [register], role: def, type_index: 0 } - - { kinds: [register], role: use, type_index: 0 } - - { kinds: [register], role: use, type_index: 0 } - num_explicit_defs: 1 - flags: [generic, pseudo, allowed_pre_legalizer] - owner: instruction_select - deadline: selected - - - id: 1237 - symbol: G_SRLW - name: G_SRLW - operands: - - { kinds: [register], role: def, type_index: 0 } - - { kinds: [register], role: use, type_index: 0 } - - { kinds: [register], role: use, type_index: 0 } - num_explicit_defs: 1 - flags: [generic, pseudo, allowed_pre_legalizer] - owner: instruction_select - deadline: selected - - - id: 1238 - symbol: G_DIVUW - name: G_DIVUW - operands: - - { kinds: [register], role: def, type_index: 0 } - - { kinds: [register], role: use, type_index: 0 } - - { kinds: [register], role: use, type_index: 0 } - num_explicit_defs: 1 - flags: [generic, pseudo, allowed_pre_legalizer] - owner: instruction_select - deadline: selected - - - id: 1239 - symbol: G_REMUW - name: G_REMUW - operands: - - { kinds: [register], role: def, type_index: 0 } - - { kinds: [register], role: use, type_index: 0 } - - { kinds: [register], role: use, type_index: 0 } - num_explicit_defs: 1 - flags: [generic, pseudo, allowed_pre_legalizer] - owner: instruction_select - deadline: selected - - - id: 1240 - symbol: G_RORW - name: G_RORW - operands: - - { kinds: [register], role: def, type_index: 0 } - - { kinds: [register], role: use, type_index: 0 } - - { kinds: [register], role: use, type_index: 0 } - num_explicit_defs: 1 - flags: [generic, pseudo, allowed_pre_legalizer] - owner: instruction_select - deadline: selected - - - id: 1241 - symbol: G_BREV8 - name: G_BREV8 - operands: - - { kinds: [register], role: def, type_index: 0 } - - { kinds: [register], role: use, type_index: 0 } - num_explicit_defs: 1 - flags: [generic, pseudo, allowed_pre_legalizer] - owner: instruction_select - deadline: selected - - - id: 1242 - symbol: G_FCVT_WU_RV64 - name: G_FCVT_WU_RV64 - operands: - - { kinds: [register], role: def, type_index: 0 } - - { kinds: [register], role: use, type_index: 1 } - - { kinds: [immediate] } - num_explicit_defs: 1 - flags: [generic, pseudo, allowed_pre_legalizer] - owner: instruction_select - deadline: selected - - - id: 1243 - symbol: G_CLSW - name: G_CLSW - operands: - - { kinds: [register], role: def, type_index: 0 } - - { kinds: [register], role: use, type_index: 0 } - num_explicit_defs: 1 - flags: [generic, pseudo, allowed_pre_legalizer] - owner: instruction_select - deadline: selected - - - id: 1244 - symbol: Select_GPR_Using_CC_GPR - name: Select_GPR_Using_CC_GPR - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR } - - { kinds: [immediate] } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR } - num_explicit_defs: 1 - flags: [pseudo, produces_code, allowed_pre_legalizer] - owner: instruction_select - deadline: selected - - - id: 1245 - symbol: ReadFFLAGS - name: ReadFFLAGS - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR } - num_explicit_defs: 1 - implicit_uses: [{ register: FFLAGS }] - flags: [pseudo, produces_code, allowed_pre_legalizer, has_side_effects] - owner: post_ra_expansion - deadline: post_ra_finalized - - - id: 1246 - symbol: WriteFFLAGS - name: WriteFFLAGS - operands: - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR } - num_explicit_defs: 0 - implicit_defs: [{ register: FFLAGS }] - flags: [pseudo, produces_code, allowed_pre_legalizer, has_side_effects] - owner: post_ra_expansion - deadline: post_ra_finalized - - - id: 1217 - symbol: PseudoLOAD_STACK_ARG - name: PseudoLOAD_STACK_ARG - operands: - - { kinds: [register], role: def, memory_role: value } - - { kinds: [frame_index] } - - { kinds: [immediate, integer_immediate] } - - { kinds: [immediate] } - num_explicit_defs: 1 - flags: [pseudo, produces_code, allowed_pre_legalizer, may_load] - owner: instruction_select - deadline: selected - - - id: 1218 - symbol: PseudoSTORE_STACK_ARG - name: PseudoSTORE_STACK_ARG - operands: - - { kinds: [register], role: use, memory_role: value } - - { kinds: [frame_index] } - - { kinds: [immediate, integer_immediate] } - - { kinds: [immediate] } - num_explicit_defs: 0 - flags: [pseudo, produces_code, allowed_pre_legalizer, may_store] - owner: instruction_select - deadline: selected - - - id: 1219 - symbol: PseudoBYVAL_COPY - name: PseudoBYVAL_COPY - operands: - - { kinds: [register], role: def } - - { kinds: [register], role: use, memory_role: address } - - { kinds: [frame_index] } - - { kinds: [immediate, integer_immediate] } - - { kinds: [immediate, integer_immediate] } - num_explicit_defs: 1 - flags: [pseudo, produces_code, allowed_pre_legalizer, may_load, may_store] - owner: instruction_select - deadline: selected - - - id: 1220 - symbol: ADJCALLSTACKDOWN - name: ADJCALLSTACKDOWN - operands: - - { kinds: [immediate, integer_immediate] } - - { kinds: [immediate, integer_immediate] } - num_explicit_defs: 0 - implicit_defs: [{ register: X2 }] - implicit_uses: [{ register: X2 }] - flags: [pseudo, allowed_pre_legalizer, has_side_effects] - owner: prologue_epilogue_insertion - deadline: frame_finalized - - - id: 1221 - symbol: ADJCALLSTACKUP - name: ADJCALLSTACKUP - operands: - - { kinds: [immediate, integer_immediate] } - - { kinds: [immediate, integer_immediate] } - num_explicit_defs: 0 - implicit_defs: [{ register: X2 }] - implicit_uses: [{ register: X2 }] - flags: [pseudo, allowed_pre_legalizer, has_side_effects] - owner: prologue_epilogue_insertion - deadline: frame_finalized - - - id: 1222 - symbol: PseudoCALL - name: PseudoCALL - operands: - - { kinds: [global_symbol, external_symbol, register], role: use, allowed_target_flags: 1 } - - { kinds: [register_mask], optional: true } - num_explicit_defs: 0 - implicit_defs: [{ register: X1 }] - allow_extra_implicit_operands: true - flags: [pseudo, produces_code, allowed_pre_legalizer, call, may_load, may_store, has_side_effects, not_duplicable, unmodeled_side_effects] - size: 8 - owner: post_ra_expansion - deadline: post_ra_finalized - - - id: 1223 - symbol: PseudoTAIL - name: PseudoTAIL - operands: - - { kinds: [global_symbol, external_symbol, register], role: use, allowed_target_flags: 1 } - - { kinds: [register_mask], optional: true } - num_explicit_defs: 0 - allow_extra_implicit_operands: true - flags: [pseudo, produces_code, allowed_pre_legalizer, terminator, branch, call, barrier, may_load, may_store, has_side_effects, not_duplicable, unmodeled_side_effects] - size: 8 - owner: post_ra_expansion - deadline: post_ra_finalized - - - id: 1224 - symbol: PseudoRET - name: PseudoRET - operands: [] - num_explicit_defs: 0 - allow_extra_implicit_operands: true - flags: [pseudo, produces_code, allowed_pre_legalizer, terminator, return, barrier] - size: 4 - owner: post_ra_expansion - deadline: post_ra_finalized - - - id: 1225 - symbol: JALR_CALL - name: JALR_CALL - assembly_mnemonic: jalr - encoding: 1344615 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [immediate, mc_symbol], immediate_predicate: SIMM12, allowed_target_flags: 4, name: IMM } - - { kinds: [register_mask] } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [call, may_load, may_store, has_side_effects, produces_code, not_duplicable, unmodeled_side_effects] - scheduling_class: BRANCH - encoding_category: I - assembly_format: RD_RS1_IMM - - - id: 1226 - symbol: JALR_TAIL - name: JALR_TAIL - assembly_mnemonic: jalr - encoding: 1344615 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [immediate, mc_symbol], immediate_predicate: SIMM12, allowed_target_flags: 4, name: IMM } - - { kinds: [register_mask] } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [terminator, branch, indirect_branch, call, barrier, may_load, may_store, has_side_effects, produces_code, not_duplicable, unmodeled_side_effects] - scheduling_class: BRANCH - encoding_category: I - assembly_format: RD_RS1_IMM - - - id: 1227 - symbol: JALR_RET - name: JALR_RET - assembly_mnemonic: jalr - encoding: 1344615 - operands: - - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } - - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } - - { kinds: [immediate], immediate_predicate: SIMM12, name: IMM } - num_explicit_defs: 1 - allow_extra_implicit_operands: true - flags: [terminator, return, barrier, produces_code] - scheduling_class: BRANCH - encoding_category: I - assembly_format: RD_RS1_IMM - - - id: 1228 - symbol: PseudoBR - name: PseudoBR - operands: - - { kinds: [basic_block], name: TARGET } - num_explicit_defs: 0 - flags: [pseudo, produces_code, allowed_pre_legalizer, terminator, branch, barrier] - size: 4 - owner: post_ra_expansion - deadline: post_ra_finalized diff --git a/backend/lib/Target/RISCV/RISCVCallingConv.rccdesc b/backend/lib/Target/RISCV/RISCVCallingConv.rccdesc new file mode 100644 index 0000000..b222023 --- /dev/null +++ b/backend/lib/Target/RISCV/RISCVCallingConv.rccdesc @@ -0,0 +1,33 @@ +calling_conventions: + - + id: 2 + symbol: LP64 + name: lp64 + integer_register_class: GPR + floating_register_class: FPR64 + integer_argument_registers: [X10, X11, X12, X13, X14, X15, X16, X17] + floating_argument_registers: [] + integer_return_registers: [X10, X11] + floating_return_registers: [] + preserved_mask: CSR_ILP32_LP64 + stack_alignment_bytes: 16 + stack_argument_alignment_bytes: 16 + shadow_space_bytes: 0 + supports_varargs: true + supports_tail_calls: true + - + id: 1 + symbol: LP64D + name: lp64d + integer_register_class: GPR + floating_register_class: FPR64 + integer_argument_registers: [X10, X11, X12, X13, X14, X15, X16, X17] + floating_argument_registers: [F10_D, F11_D, F12_D, F13_D, F14_D, F15_D, F16_D, F17_D] + integer_return_registers: [X10, X11] + floating_return_registers: [F10_D, F11_D] + preserved_mask: CSR_ILP32D_LP64D + stack_alignment_bytes: 16 + stack_argument_alignment_bytes: 16 + shadow_space_bytes: 0 + supports_varargs: true + supports_tail_calls: true diff --git a/backend/lib/Target/RISCV/RISCVGISel.rccdesc b/backend/lib/Target/RISCV/RISCVGISel.rccdesc new file mode 100644 index 0000000..97ed3d6 --- /dev/null +++ b/backend/lib/Target/RISCV/RISCVGISel.rccdesc @@ -0,0 +1,157 @@ +selection_rules: + - + id: select_g_sllw + priority: 100 + match: + opcode: G_SLLW + result_type: { kind: scalar, bits: 64 } + operand_types: + - { index: 1, kind: scalar, bits: 64 } + - { index: 2, kind: scalar, bits: 64 } + operand_banks: + - { index: 0, bank: GPR } + - { index: 1, bank: GPR } + - { index: 2, bank: GPR } + apply: { opcode: SLLW } + - + id: select_g_sraw + priority: 100 + match: + opcode: G_SRAW + result_type: { kind: scalar, bits: 64 } + operand_types: + - { index: 1, kind: scalar, bits: 64 } + - { index: 2, kind: scalar, bits: 64 } + operand_banks: + - { index: 0, bank: GPR } + - { index: 1, bank: GPR } + - { index: 2, bank: GPR } + apply: { opcode: SRAW } + - + id: select_g_srlw + priority: 100 + match: + opcode: G_SRLW + result_type: { kind: scalar, bits: 64 } + operand_types: + - { index: 1, kind: scalar, bits: 64 } + - { index: 2, kind: scalar, bits: 64 } + operand_banks: + - { index: 0, bank: GPR } + - { index: 1, bank: GPR } + - { index: 2, bank: GPR } + apply: { opcode: SRLW } + - + id: select_g_divw + priority: 100 + match: + opcode: G_DIVW + result_type: { kind: scalar, bits: 64 } + operand_types: + - { index: 1, kind: scalar, bits: 64 } + - { index: 2, kind: scalar, bits: 64 } + operand_banks: + - { index: 0, bank: GPR } + - { index: 1, bank: GPR } + - { index: 2, bank: GPR } + apply: { opcode: DIVW } + - + id: select_g_divuw + priority: 100 + match: + opcode: G_DIVUW + result_type: { kind: scalar, bits: 64 } + operand_types: + - { index: 1, kind: scalar, bits: 64 } + - { index: 2, kind: scalar, bits: 64 } + operand_banks: + - { index: 0, bank: GPR } + - { index: 1, bank: GPR } + - { index: 2, bank: GPR } + apply: { opcode: DIVUW } + - + id: select_g_remuw + priority: 100 + match: + opcode: G_REMUW + result_type: { kind: scalar, bits: 64 } + operand_types: + - { index: 1, kind: scalar, bits: 64 } + - { index: 2, kind: scalar, bits: 64 } + operand_banks: + - { index: 0, bank: GPR } + - { index: 1, bank: GPR } + - { index: 2, bank: GPR } + apply: { opcode: REMUW } + - + id: select_g_fcvt_w_rv64_s32 + priority: 100 + match: + opcode: G_FCVT_W_RV64 + result_type: { kind: scalar, bits: 64 } + operand_types: + - { index: 1, kind: scalar, bits: 32 } + operand_banks: + - { index: 0, bank: GPR } + - { index: 1, bank: FPR } + apply: { opcode: FCVT_W_S } + - + id: select_g_fcvt_w_rv64_s64 + priority: 100 + match: + opcode: G_FCVT_W_RV64 + result_type: { kind: scalar, bits: 64 } + operand_types: + - { index: 1, kind: scalar, bits: 64 } + operand_banks: + - { index: 0, bank: GPR } + - { index: 1, bank: FPR } + apply: { opcode: FCVT_W_D } + - + id: select_g_fcvt_wu_rv64_s32 + priority: 100 + match: + opcode: G_FCVT_WU_RV64 + result_type: { kind: scalar, bits: 64 } + operand_types: + - { index: 1, kind: scalar, bits: 32 } + operand_banks: + - { index: 0, bank: GPR } + - { index: 1, bank: FPR } + apply: { opcode: FCVT_WU_S } + - + id: select_g_fcvt_wu_rv64_s64 + priority: 100 + match: + opcode: G_FCVT_WU_RV64 + result_type: { kind: scalar, bits: 64 } + operand_types: + - { index: 1, kind: scalar, bits: 64 } + operand_banks: + - { index: 0, bank: GPR } + - { index: 1, bank: FPR } + apply: { opcode: FCVT_WU_D } + - + id: select_g_fclass_s32 + priority: 100 + match: + opcode: G_FCLASS + result_type: { kind: scalar, bits: 64 } + operand_types: + - { index: 1, kind: scalar, bits: 32 } + operand_banks: + - { index: 0, bank: GPR } + - { index: 1, bank: FPR } + apply: { opcode: FCLASS_S } + - + id: select_g_fclass_s64 + priority: 100 + match: + opcode: G_FCLASS + result_type: { kind: scalar, bits: 64 } + operand_types: + - { index: 1, kind: scalar, bits: 64 } + operand_banks: + - { index: 0, bank: GPR } + - { index: 1, bank: FPR } + apply: { opcode: FCLASS_D } diff --git a/backend/lib/Target/RISCV/RISCVInstrInfoA.rccdesc b/backend/lib/Target/RISCV/RISCVInstrInfoA.rccdesc new file mode 100644 index 0000000..c954f8e --- /dev/null +++ b/backend/lib/Target/RISCV/RISCVInstrInfoA.rccdesc @@ -0,0 +1,329 @@ +instructions: + - + id: 1096 + symbol: LR_W + name: LR_W + assembly_mnemonic: lr.w + encoding: 268739631 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + num_explicit_defs: 1 + flags: [may_load, produces_code] + scheduling_class: ATOMIC + encoding_category: AMO + assembly_format: RD_PAREN_RS1 + - + id: 1097 + symbol: SC_W + name: SC_W + assembly_mnemonic: sc.w + encoding: 413443119 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + num_explicit_defs: 1 + flags: [may_store, produces_code] + scheduling_class: ATOMIC + encoding_category: AMO + assembly_format: RD_RS2_PAREN_RS1 + - + id: 1098 + symbol: AMOSWAP_W + name: AMOSWAP_W + assembly_mnemonic: amoswap.w + encoding: 145007663 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + num_explicit_defs: 1 + flags: [may_load, may_store, produces_code] + scheduling_class: ATOMIC + encoding_category: AMO + assembly_format: RD_RS2_PAREN_RS1 + - + id: 1099 + symbol: AMOADD_W + name: AMOADD_W + assembly_mnemonic: amoadd.w + encoding: 10789935 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + num_explicit_defs: 1 + flags: [may_load, may_store, produces_code] + scheduling_class: ATOMIC + encoding_category: AMO + assembly_format: RD_RS2_PAREN_RS1 + - + id: 1100 + symbol: AMOXOR_W + name: AMOXOR_W + assembly_mnemonic: amoxor.w + encoding: 547660847 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + num_explicit_defs: 1 + flags: [may_load, may_store, produces_code] + scheduling_class: ATOMIC + encoding_category: AMO + assembly_format: RD_RS2_PAREN_RS1 + - + id: 1101 + symbol: AMOAND_W + name: AMOAND_W + assembly_mnemonic: amoand.w + encoding: 1621402671 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + num_explicit_defs: 1 + flags: [may_load, may_store, produces_code] + scheduling_class: ATOMIC + encoding_category: AMO + assembly_format: RD_RS2_PAREN_RS1 + - + id: 1102 + symbol: AMOOR_W + name: AMOOR_W + assembly_mnemonic: amoor.w + encoding: 1084531759 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + num_explicit_defs: 1 + flags: [may_load, may_store, produces_code] + scheduling_class: ATOMIC + encoding_category: AMO + assembly_format: RD_RS2_PAREN_RS1 + - + id: 1103 + symbol: AMOMIN_W + name: AMOMIN_W + assembly_mnemonic: amomin.w + encoding: 2158273583 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + num_explicit_defs: 1 + flags: [may_load, may_store, produces_code] + scheduling_class: ATOMIC + encoding_category: AMO + assembly_format: RD_RS2_PAREN_RS1 + - + id: 1104 + symbol: AMOMAX_W + name: AMOMAX_W + assembly_mnemonic: amomax.w + encoding: 2695144495 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + num_explicit_defs: 1 + flags: [may_load, may_store, produces_code] + scheduling_class: ATOMIC + encoding_category: AMO + assembly_format: RD_RS2_PAREN_RS1 + - + id: 1105 + symbol: AMOMINU_W + name: AMOMINU_W + assembly_mnemonic: amominu.w + encoding: 3232015407 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + num_explicit_defs: 1 + flags: [may_load, may_store, produces_code] + scheduling_class: ATOMIC + encoding_category: AMO + assembly_format: RD_RS2_PAREN_RS1 + - + id: 1106 + symbol: AMOMAXU_W + name: AMOMAXU_W + assembly_mnemonic: amomaxu.w + encoding: 3768886319 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + num_explicit_defs: 1 + flags: [may_load, may_store, produces_code] + scheduling_class: ATOMIC + encoding_category: AMO + assembly_format: RD_RS2_PAREN_RS1 + - + id: 1107 + symbol: LR_D + name: LR_D + assembly_mnemonic: lr.d + encoding: 268743727 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + num_explicit_defs: 1 + flags: [may_load, produces_code] + scheduling_class: ATOMIC + encoding_category: AMO + assembly_format: RD_PAREN_RS1 + - + id: 1108 + symbol: SC_D + name: SC_D + assembly_mnemonic: sc.d + encoding: 413447215 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + num_explicit_defs: 1 + flags: [may_store, produces_code] + scheduling_class: ATOMIC + encoding_category: AMO + assembly_format: RD_RS2_PAREN_RS1 + - + id: 1109 + symbol: AMOSWAP_D + name: AMOSWAP_D + assembly_mnemonic: amoswap.d + encoding: 145011759 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + num_explicit_defs: 1 + flags: [may_load, may_store, produces_code] + scheduling_class: ATOMIC + encoding_category: AMO + assembly_format: RD_RS2_PAREN_RS1 + - + id: 1110 + symbol: AMOADD_D + name: AMOADD_D + assembly_mnemonic: amoadd.d + encoding: 10794031 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + num_explicit_defs: 1 + flags: [may_load, may_store, produces_code] + scheduling_class: ATOMIC + encoding_category: AMO + assembly_format: RD_RS2_PAREN_RS1 + - + id: 1111 + symbol: AMOXOR_D + name: AMOXOR_D + assembly_mnemonic: amoxor.d + encoding: 547664943 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + num_explicit_defs: 1 + flags: [may_load, may_store, produces_code] + scheduling_class: ATOMIC + encoding_category: AMO + assembly_format: RD_RS2_PAREN_RS1 + - + id: 1112 + symbol: AMOAND_D + name: AMOAND_D + assembly_mnemonic: amoand.d + encoding: 1621406767 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + num_explicit_defs: 1 + flags: [may_load, may_store, produces_code] + scheduling_class: ATOMIC + encoding_category: AMO + assembly_format: RD_RS2_PAREN_RS1 + - + id: 1113 + symbol: AMOOR_D + name: AMOOR_D + assembly_mnemonic: amoor.d + encoding: 1084535855 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + num_explicit_defs: 1 + flags: [may_load, may_store, produces_code] + scheduling_class: ATOMIC + encoding_category: AMO + assembly_format: RD_RS2_PAREN_RS1 + - + id: 1114 + symbol: AMOMIN_D + name: AMOMIN_D + assembly_mnemonic: amomin.d + encoding: 2158277679 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + num_explicit_defs: 1 + flags: [may_load, may_store, produces_code] + scheduling_class: ATOMIC + encoding_category: AMO + assembly_format: RD_RS2_PAREN_RS1 + - + id: 1115 + symbol: AMOMAX_D + name: AMOMAX_D + assembly_mnemonic: amomax.d + encoding: 2695148591 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + num_explicit_defs: 1 + flags: [may_load, may_store, produces_code] + scheduling_class: ATOMIC + encoding_category: AMO + assembly_format: RD_RS2_PAREN_RS1 + - + id: 1116 + symbol: AMOMINU_D + name: AMOMINU_D + assembly_mnemonic: amominu.d + encoding: 3232019503 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + num_explicit_defs: 1 + flags: [may_load, may_store, produces_code] + scheduling_class: ATOMIC + encoding_category: AMO + assembly_format: RD_RS2_PAREN_RS1 + - + id: 1117 + symbol: AMOMAXU_D + name: AMOMAXU_D + assembly_mnemonic: amomaxu.d + encoding: 3768890415 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + num_explicit_defs: 1 + flags: [may_load, may_store, produces_code] + scheduling_class: ATOMIC + encoding_category: AMO + assembly_format: RD_RS2_PAREN_RS1 diff --git a/backend/lib/Target/RISCV/RISCVInstrInfoBase.rccdesc b/backend/lib/Target/RISCV/RISCVInstrInfoBase.rccdesc new file mode 100644 index 0000000..e1e84d0 --- /dev/null +++ b/backend/lib/Target/RISCV/RISCVInstrInfoBase.rccdesc @@ -0,0 +1,100 @@ +named_operands: + - { id: 1, symbol: RD, name: rd } + - { id: 2, symbol: RS1, name: rs1 } + - { id: 3, symbol: RS2, name: rs2 } + - { id: 4, symbol: IMM, name: imm } + - { id: 5, symbol: TARGET, name: target } + - { id: 6, symbol: CSR, name: csr } + - { id: 7, symbol: ZIMM, name: zimm } + - { id: 8, symbol: PRED, name: pred } + - { id: 9, symbol: SUCC, name: succ } + - { id: 10, symbol: FRD, name: frd } + - { id: 11, symbol: FRS1, name: frs1 } + - { id: 12, symbol: FRS2, name: frs2 } + - { id: 13, symbol: FRS3, name: frs3 } + - { id: 14, symbol: RM, name: rm } + +immediate_predicates: + - { id: 1, symbol: SIMM12, name: simm12, kind: signed, bits: 12 } + - { id: 2, symbol: UIMM20, name: uimm20, kind: unsigned, bits: 20 } + - { id: 3, symbol: UIMM5, name: uimm5, kind: unsigned, bits: 5 } + - { id: 4, symbol: UIMM6, name: uimm6, kind: unsigned, bits: 6 } + - { id: 5, symbol: UIMM12, name: uimm12, kind: unsigned, bits: 12 } + - { id: 6, symbol: UIMM4, name: uimm4, kind: unsigned, bits: 4 } + - { id: 7, symbol: RM, name: rm, kind: unsigned, bits: 3, allowed_values: [0, 1, 2, 3, 4, 7] } + - { id: 8, symbol: C_UIMM10_NZ_A4, name: c-uimm10-nz-a4, kind: unsigned, bits: 10, alignment: 4, nonzero: true } + - { id: 9, symbol: C_UIMM7_A4, name: c-uimm7-a4, kind: unsigned, bits: 7, alignment: 4 } + - { id: 10, symbol: C_UIMM8_A8, name: c-uimm8-a8, kind: unsigned, bits: 8, alignment: 8 } + - { id: 11, symbol: C_UIMM8_A4, name: c-uimm8-a4, kind: unsigned, bits: 8, alignment: 4 } + - { id: 12, symbol: C_UIMM9_A8, name: c-uimm9-a8, kind: unsigned, bits: 9, alignment: 8 } + - { id: 13, symbol: C_SIMM6, name: c-simm6, kind: signed, bits: 6 } + - { id: 14, symbol: C_SIMM6_NZ, name: c-simm6-nz, kind: signed, bits: 6, nonzero: true } + - { id: 15, symbol: C_SIMM9_A2, name: c-simm9-a2, kind: signed, bits: 9, alignment: 2 } + - { id: 16, symbol: C_SIMM12_A2, name: c-simm12-a2, kind: signed, bits: 12, alignment: 2 } + - { id: 17, symbol: C_SIMM10_A16_NZ, name: c-simm10-a16-nz, kind: signed, bits: 10, alignment: 16, nonzero: true } + +scheduling_classes: + - { id: 1, symbol: ALU, name: alu, micro_ops: 1, latency: 1 } + - { id: 2, symbol: LOAD, name: load, micro_ops: 1, latency: 3 } + - { id: 3, symbol: STORE, name: store, micro_ops: 1, latency: 1 } + - { id: 4, symbol: BRANCH, name: branch, micro_ops: 1, latency: 1 } + - { id: 5, symbol: SYSTEM, name: system, micro_ops: 1, latency: 1 } + - { id: 6, symbol: MUL, name: mul, micro_ops: 1, latency: 3 } + - { id: 7, symbol: DIV, name: div, micro_ops: 1, latency: 20 } + - { id: 8, symbol: FENCE, name: fence, micro_ops: 1, latency: 1 } + - { id: 9, symbol: ATOMIC, name: atomic, micro_ops: 1, latency: 4 } + - { id: 10, symbol: FP_ADD, name: fp-add, micro_ops: 1, latency: 4 } + - { id: 11, symbol: FP_MUL, name: fp-mul, micro_ops: 1, latency: 4 } + - { id: 12, symbol: FP_DIV, name: fp-div, micro_ops: 1, latency: 20 } + - { id: 13, symbol: FP_SQRT, name: fp-sqrt, micro_ops: 1, latency: 20 } + - { id: 14, symbol: FP_CONVERT, name: fp-convert, micro_ops: 1, latency: 4 } + - { id: 15, symbol: COMPRESSED, name: compressed, micro_ops: 1, latency: 1 } + +encoding_categories: + - { id: 1, symbol: R, name: r, size_bytes: 4 } + - { id: 2, symbol: I, name: i, size_bytes: 4 } + - { id: 3, symbol: S, name: s, size_bytes: 4 } + - { id: 4, symbol: B, name: b, size_bytes: 4 } + - { id: 5, symbol: U, name: u, size_bytes: 4 } + - { id: 6, symbol: J, name: j, size_bytes: 4 } + - { id: 7, symbol: SYSTEM, name: system, size_bytes: 4 } + - { id: 8, symbol: AMO, name: amo, size_bytes: 4 } + - { id: 9, symbol: R4, name: r4, size_bytes: 4 } + - { id: 10, symbol: C, name: c, size_bytes: 2 } + +assembly_formats: + - { id: 1, symbol: RD_IMM, name: rd-imm } + - { id: 2, symbol: RD_RS1_IMM, name: rd-rs1-imm } + - { id: 3, symbol: RD_RS1_RS2, name: rd-rs1-rs2 } + - { id: 4, symbol: RD_OFFSET_RS1, name: rd-offset-rs1 } + - { id: 5, symbol: RS2_OFFSET_RS1, name: rs2-offset-rs1 } + - { id: 6, symbol: RS1_RS2_TARGET, name: rs1-rs2-target } + - { id: 7, symbol: RD_TARGET, name: rd-target } + - { id: 8, symbol: NONE, name: none } + - { id: 9, symbol: IMM_IMM, name: imm-imm } + - { id: 10, symbol: RD_CSR_RS1, name: rd-csr-rs1 } + - { id: 11, symbol: RD_CSR_IMM, name: rd-csr-imm } + - { id: 12, symbol: RD_PAREN_RS1, name: rd-paren-rs1 } + - { id: 13, symbol: RD_RS2_PAREN_RS1, name: rd-rs2-paren-rs1 } + - { id: 14, symbol: FRD_OFFSET_RS1, name: frd-offset-rs1 } + - { id: 15, symbol: FRS2_OFFSET_RS1, name: frs2-offset-rs1 } + - { id: 16, symbol: FRD_FRS1_FRS2_RM, name: frd-frs1-frs2-rm } + - { id: 17, symbol: FRD_FRS1_FRS2_FRS3_RM, name: frd-frs1-frs2-frs3-rm } + - { id: 18, symbol: FRD_FRS1_RM, name: frd-frs1-rm } + - { id: 19, symbol: FRD_FRS1_FRS2, name: frd-frs1-frs2 } + - { id: 20, symbol: RD_FRS1_RM, name: rd-frs1-rm } + - { id: 21, symbol: RD_FRS1, name: rd-frs1 } + - { id: 22, symbol: RD_FRS1_FRS2, name: rd-frs1-frs2 } + - { id: 23, symbol: FRD_RS1_RM, name: frd-rs1-rm } + - { id: 24, symbol: FRD_RS1, name: frd-rs1 } + - { id: 25, symbol: TARGET, name: target } + - { id: 26, symbol: RS1_TARGET, name: rs1-target } + - { id: 27, symbol: RS1, name: rs1 } + - { id: 28, symbol: RD_RS2, name: rd-rs2 } + - { id: 29, symbol: IMM_SP, name: imm-sp } + - { id: 30, symbol: RD_IMM_SP, name: rd-imm-sp } + - { id: 31, symbol: RD_OFFSET_SP, name: rd-offset-sp } + - { id: 32, symbol: RS2_OFFSET_SP, name: rs2-offset-sp } + - { id: 33, symbol: FRD_OFFSET_SP, name: frd-offset-sp } + - { id: 34, symbol: FRS2_OFFSET_SP, name: frs2-offset-sp } + - { id: 35, symbol: RD_RS1, name: rd-rs1 } diff --git a/backend/lib/Target/RISCV/RISCVInstrInfoC.rccdesc b/backend/lib/Target/RISCV/RISCVInstrInfoC.rccdesc new file mode 100644 index 0000000..fa1b75a --- /dev/null +++ b/backend/lib/Target/RISCV/RISCVInstrInfoC.rccdesc @@ -0,0 +1,515 @@ +instructions: + - + id: 1180 + symbol: C_ADDI4SPN + name: C_ADDI4SPN + assembly_mnemonic: c.addi4spn + encoding: 2048 + operands: + - { kinds: [register], role: def, register_class: GPRC, register_bank: GPR, name: RD } + - { kinds: [immediate], immediate_predicate: C_UIMM10_NZ_A4, name: IMM } + num_explicit_defs: 1 + flags: [produces_code] + implicit_uses: [{ register: X2 }] + scheduling_class: COMPRESSED + encoding_category: C + assembly_format: RD_IMM_SP + - + id: 1181 + symbol: C_FLD + name: C_FLD + assembly_mnemonic: c.fld + encoding: 9344 + operands: + - { kinds: [register], role: def, register_class: FPR64C, register_bank: FPR, memory_role: value, name: FRD } + - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, memory_role: address, name: RS1 } + - { kinds: [immediate], immediate_predicate: C_UIMM8_A8, name: IMM } + num_explicit_defs: 1 + flags: [may_load, produces_code] + scheduling_class: LOAD + encoding_category: C + assembly_format: FRD_OFFSET_RS1 + - + id: 1182 + symbol: C_LW + name: C_LW + assembly_mnemonic: c.lw + encoding: 17536 + operands: + - { kinds: [register], role: def, register_class: GPRC, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, memory_role: address, name: RS1 } + - { kinds: [immediate], immediate_predicate: C_UIMM7_A4, name: IMM } + num_explicit_defs: 1 + flags: [may_load, produces_code] + scheduling_class: LOAD + encoding_category: C + assembly_format: RD_OFFSET_RS1 + - + id: 1183 + symbol: C_LD + name: C_LD + assembly_mnemonic: c.ld + encoding: 25728 + operands: + - { kinds: [register], role: def, register_class: GPRC, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, memory_role: address, name: RS1 } + - { kinds: [immediate], immediate_predicate: C_UIMM8_A8, name: IMM } + num_explicit_defs: 1 + flags: [may_load, produces_code] + scheduling_class: LOAD + encoding_category: C + assembly_format: RD_OFFSET_RS1 + - + id: 1184 + symbol: C_FSD + name: C_FSD + assembly_mnemonic: c.fsd + encoding: 42120 + operands: + - { kinds: [register], role: use, register_class: FPR64C, register_bank: FPR, memory_role: value, name: FRS2 } + - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, memory_role: address, name: RS1 } + - { kinds: [immediate], immediate_predicate: C_UIMM8_A8, name: IMM } + num_explicit_defs: 0 + flags: [may_store, produces_code] + scheduling_class: STORE + encoding_category: C + assembly_format: FRS2_OFFSET_RS1 + - + id: 1185 + symbol: C_SW + name: C_SW + assembly_mnemonic: c.sw + encoding: 50312 + operands: + - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, memory_role: value, name: RS2 } + - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, memory_role: address, name: RS1 } + - { kinds: [immediate], immediate_predicate: C_UIMM7_A4, name: IMM } + num_explicit_defs: 0 + flags: [may_store, produces_code] + scheduling_class: STORE + encoding_category: C + assembly_format: RS2_OFFSET_RS1 + - + id: 1186 + symbol: C_SD + name: C_SD + assembly_mnemonic: c.sd + encoding: 58504 + operands: + - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, memory_role: value, name: RS2 } + - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, memory_role: address, name: RS1 } + - { kinds: [immediate], immediate_predicate: C_UIMM8_A8, name: IMM } + num_explicit_defs: 0 + flags: [may_store, produces_code] + scheduling_class: STORE + encoding_category: C + assembly_format: RS2_OFFSET_RS1 + - + id: 1187 + symbol: C_ADDI + name: C_ADDI + assembly_mnemonic: c.addi + encoding: 1029 + operands: + - { kinds: [register], role: def_use, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [immediate], immediate_predicate: C_SIMM6, name: IMM } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: COMPRESSED + encoding_category: C + assembly_format: RD_IMM + - + id: 1188 + symbol: C_ADDIW + name: C_ADDIW + assembly_mnemonic: c.addiw + encoding: 9221 + operands: + - { kinds: [register], role: def_use, register_class: GPR_NX0, register_bank: GPR, name: RD } + - { kinds: [immediate], immediate_predicate: C_SIMM6, name: IMM } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: COMPRESSED + encoding_category: C + assembly_format: RD_IMM + - + id: 1189 + symbol: C_LI + name: C_LI + assembly_mnemonic: c.li + encoding: 17413 + operands: + - { kinds: [register], role: def, register_class: GPR_NX0, register_bank: GPR, name: RD } + - { kinds: [immediate], immediate_predicate: C_SIMM6, name: IMM } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: COMPRESSED + encoding_category: C + assembly_format: RD_IMM + - + id: 1190 + symbol: C_ADDI16SP + name: C_ADDI16SP + assembly_mnemonic: c.addi16sp + encoding: 24897 + operands: + - { kinds: [immediate], immediate_predicate: C_SIMM10_A16_NZ, name: IMM } + num_explicit_defs: 0 + flags: [produces_code] + implicit_defs: [{ register: X2 }] + implicit_uses: [{ register: X2 }] + scheduling_class: COMPRESSED + encoding_category: C + assembly_format: IMM_SP + - + id: 1191 + symbol: C_LUI + name: C_LUI + assembly_mnemonic: c.lui + encoding: 25605 + operands: + - { kinds: [register], role: def, register_class: GPR_NX0_NX2, register_bank: GPR, name: RD } + - { kinds: [immediate], immediate_predicate: C_SIMM6_NZ, name: IMM } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: COMPRESSED + encoding_category: C + assembly_format: RD_IMM + - + id: 1192 + symbol: C_SRLI + name: C_SRLI + assembly_mnemonic: c.srli + encoding: 32773 + operands: + - { kinds: [register], role: def_use, register_class: GPRC, register_bank: GPR, name: RD } + - { kinds: [immediate], immediate_predicate: UIMM6, name: IMM } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: COMPRESSED + encoding_category: C + assembly_format: RD_IMM + - + id: 1193 + symbol: C_SRAI + name: C_SRAI + assembly_mnemonic: c.srai + encoding: 33797 + operands: + - { kinds: [register], role: def_use, register_class: GPRC, register_bank: GPR, name: RD } + - { kinds: [immediate], immediate_predicate: UIMM6, name: IMM } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: COMPRESSED + encoding_category: C + assembly_format: RD_IMM + - + id: 1194 + symbol: C_ANDI + name: C_ANDI + assembly_mnemonic: c.andi + encoding: 34821 + operands: + - { kinds: [register], role: def_use, register_class: GPRC, register_bank: GPR, name: RD } + - { kinds: [immediate], immediate_predicate: C_SIMM6, name: IMM } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: COMPRESSED + encoding_category: C + assembly_format: RD_IMM + - + id: 1195 + symbol: C_SUB + name: C_SUB + assembly_mnemonic: c.sub + encoding: 35845 + operands: + - { kinds: [register], role: def_use, register_class: GPRC, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: COMPRESSED + encoding_category: C + assembly_format: RD_RS2 + - + id: 1196 + symbol: C_XOR + name: C_XOR + assembly_mnemonic: c.xor + encoding: 35877 + operands: + - { kinds: [register], role: def_use, register_class: GPRC, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: COMPRESSED + encoding_category: C + assembly_format: RD_RS2 + - + id: 1197 + symbol: C_OR + name: C_OR + assembly_mnemonic: c.or + encoding: 35909 + operands: + - { kinds: [register], role: def_use, register_class: GPRC, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: COMPRESSED + encoding_category: C + assembly_format: RD_RS2 + - + id: 1198 + symbol: C_AND + name: C_AND + assembly_mnemonic: c.and + encoding: 35941 + operands: + - { kinds: [register], role: def_use, register_class: GPRC, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: COMPRESSED + encoding_category: C + assembly_format: RD_RS2 + - + id: 1199 + symbol: C_SUBW + name: C_SUBW + assembly_mnemonic: c.subw + encoding: 39941 + operands: + - { kinds: [register], role: def_use, register_class: GPRC, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: COMPRESSED + encoding_category: C + assembly_format: RD_RS2 + - + id: 1200 + symbol: C_ADDW + name: C_ADDW + assembly_mnemonic: c.addw + encoding: 39973 + operands: + - { kinds: [register], role: def_use, register_class: GPRC, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: COMPRESSED + encoding_category: C + assembly_format: RD_RS2 + - + id: 1201 + symbol: C_J + name: C_J + assembly_mnemonic: c.j + encoding: 40961 + operands: + - { kinds: [basic_block], name: TARGET } + num_explicit_defs: 0 + flags: [terminator, branch, produces_code] + scheduling_class: COMPRESSED + encoding_category: C + assembly_format: TARGET + - + id: 1202 + symbol: C_BEQZ + name: C_BEQZ + assembly_mnemonic: c.beqz + encoding: 49153 + operands: + - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, name: RS1 } + - { kinds: [basic_block], name: TARGET } + num_explicit_defs: 0 + flags: [terminator, branch, produces_code] + scheduling_class: COMPRESSED + encoding_category: C + assembly_format: RS1_TARGET + - + id: 1203 + symbol: C_BNEZ + name: C_BNEZ + assembly_mnemonic: c.bnez + encoding: 57345 + operands: + - { kinds: [register], role: use, register_class: GPRC, register_bank: GPR, name: RS1 } + - { kinds: [basic_block], name: TARGET } + num_explicit_defs: 0 + flags: [terminator, branch, produces_code] + scheduling_class: COMPRESSED + encoding_category: C + assembly_format: RS1_TARGET + - + id: 1204 + symbol: C_SLLI + name: C_SLLI + assembly_mnemonic: c.slli + encoding: 1030 + operands: + - { kinds: [register], role: def_use, register_class: GPR_NX0, register_bank: GPR, name: RD } + - { kinds: [immediate], immediate_predicate: UIMM6, name: IMM } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: COMPRESSED + encoding_category: C + assembly_format: RD_IMM + - + id: 1205 + symbol: C_FLDSP + name: C_FLDSP + assembly_mnemonic: c.fldsp + encoding: 9250 + operands: + - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, memory_role: value, name: FRD } + - { kinds: [immediate], immediate_predicate: C_UIMM9_A8, name: IMM } + num_explicit_defs: 1 + flags: [may_load, produces_code] + implicit_uses: [{ register: X2 }] + scheduling_class: LOAD + encoding_category: C + assembly_format: FRD_OFFSET_SP + - + id: 1206 + symbol: C_LWSP + name: C_LWSP + assembly_mnemonic: c.lwsp + encoding: 17442 + operands: + - { kinds: [register], role: def, register_class: GPR_NX0, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [immediate], immediate_predicate: C_UIMM8_A4, name: IMM } + num_explicit_defs: 1 + flags: [may_load, produces_code] + implicit_uses: [{ register: X2 }] + scheduling_class: LOAD + encoding_category: C + assembly_format: RD_OFFSET_SP + - + id: 1207 + symbol: C_LDSP + name: C_LDSP + assembly_mnemonic: c.ldsp + encoding: 25634 + operands: + - { kinds: [register], role: def, register_class: GPR_NX0, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [immediate], immediate_predicate: C_UIMM9_A8, name: IMM } + num_explicit_defs: 1 + flags: [may_load, produces_code] + implicit_uses: [{ register: X2 }] + scheduling_class: LOAD + encoding_category: C + assembly_format: RD_OFFSET_SP + - + id: 1208 + symbol: C_JR + name: C_JR + assembly_mnemonic: c.jr + encoding: 33794 + operands: + - { kinds: [register], role: use, register_class: GPR_NX0, register_bank: GPR, name: RS1 } + num_explicit_defs: 0 + flags: [terminator, branch, indirect_branch, produces_code] + scheduling_class: COMPRESSED + encoding_category: C + assembly_format: RS1 + - + id: 1209 + symbol: C_MV + name: C_MV + assembly_mnemonic: c.mv + encoding: 33830 + operands: + - { kinds: [register], role: def, register_class: GPR_NX0, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR_NX0, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: COMPRESSED + encoding_category: C + assembly_format: RD_RS2 + - + id: 1210 + symbol: C_EBREAK + name: C_EBREAK + assembly_mnemonic: c.ebreak + encoding: 36866 + operands: [] + num_explicit_defs: 0 + flags: [has_side_effects, produces_code] + scheduling_class: COMPRESSED + encoding_category: C + assembly_format: NONE + - + id: 1211 + symbol: C_JALR + name: C_JALR + assembly_mnemonic: c.jalr + encoding: 37890 + operands: + - { kinds: [register], role: use, register_class: GPR_NX0, register_bank: GPR, name: RS1 } + num_explicit_defs: 0 + flags: [terminator, branch, indirect_branch, produces_code] + implicit_defs: [{ register: X1 }] + scheduling_class: COMPRESSED + encoding_category: C + assembly_format: RS1 + - + id: 1212 + symbol: C_ADD + name: C_ADD + assembly_mnemonic: c.add + encoding: 37926 + operands: + - { kinds: [register], role: def_use, register_class: GPR_NX0, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR_NX0, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: COMPRESSED + encoding_category: C + assembly_format: RD_RS2 + - + id: 1213 + symbol: C_FSDSP + name: C_FSDSP + assembly_mnemonic: c.fsdsp + encoding: 42018 + operands: + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, memory_role: value, name: FRS2 } + - { kinds: [immediate], immediate_predicate: C_UIMM9_A8, name: IMM } + num_explicit_defs: 0 + flags: [may_store, produces_code] + implicit_uses: [{ register: X2 }] + scheduling_class: STORE + encoding_category: C + assembly_format: FRS2_OFFSET_SP + - + id: 1214 + symbol: C_SWSP + name: C_SWSP + assembly_mnemonic: c.swsp + encoding: 50210 + operands: + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } + - { kinds: [immediate], immediate_predicate: C_UIMM8_A4, name: IMM } + num_explicit_defs: 0 + flags: [may_store, produces_code] + implicit_uses: [{ register: X2 }] + scheduling_class: STORE + encoding_category: C + assembly_format: RS2_OFFSET_SP + - + id: 1215 + symbol: C_SDSP + name: C_SDSP + assembly_mnemonic: c.sdsp + encoding: 58402 + operands: + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } + - { kinds: [immediate], immediate_predicate: C_UIMM9_A8, name: IMM } + num_explicit_defs: 0 + flags: [may_store, produces_code] + implicit_uses: [{ register: X2 }] + scheduling_class: STORE + encoding_category: C + assembly_format: RS2_OFFSET_SP diff --git a/backend/lib/Target/RISCV/RISCVInstrInfoD.rccdesc b/backend/lib/Target/RISCV/RISCVInstrInfoD.rccdesc new file mode 100644 index 0000000..15e4ab1 --- /dev/null +++ b/backend/lib/Target/RISCV/RISCVInstrInfoD.rccdesc @@ -0,0 +1,509 @@ +instructions: + - + id: 1148 + symbol: FLD + name: FLD + assembly_mnemonic: fld + encoding: 8696839 + operands: + - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, memory_role: value, name: FRD } + - { kinds: [register, frame_index], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, name: IMM, allowed_target_flags: 68 } + num_explicit_defs: 1 + flags: [may_load, produces_code] + scheduling_class: LOAD + encoding_category: I + assembly_format: FRD_OFFSET_RS1 + - + id: 1149 + symbol: FSD + name: FSD + assembly_mnemonic: fsd + encoding: 10794023 + operands: + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, memory_role: value, name: FRS2 } + - { kinds: [register, frame_index], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, name: IMM, allowed_target_flags: 68 } + num_explicit_defs: 0 + flags: [may_store, produces_code] + scheduling_class: STORE + encoding_category: S + assembly_format: FRS2_OFFSET_RS1 + - + id: 1150 + symbol: FMADD_D + name: FMADD_D + assembly_mnemonic: fmadd.d + encoding: 1520731203 + operands: + - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS3 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_MUL + encoding_category: R4 + assembly_format: FRD_FRS1_FRS2_FRS3_RM + - + id: 1151 + symbol: FMSUB_D + name: FMSUB_D + assembly_mnemonic: fmsub.d + encoding: 1520731207 + operands: + - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS3 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_MUL + encoding_category: R4 + assembly_format: FRD_FRS1_FRS2_FRS3_RM + - + id: 1152 + symbol: FNMSUB_D + name: FNMSUB_D + assembly_mnemonic: fnmsub.d + encoding: 1520731211 + operands: + - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS3 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_MUL + encoding_category: R4 + assembly_format: FRD_FRS1_FRS2_FRS3_RM + - + id: 1153 + symbol: FNMADD_D + name: FNMADD_D + assembly_mnemonic: fnmadd.d + encoding: 1520731215 + operands: + - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS3 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_MUL + encoding_category: R4 + assembly_format: FRD_FRS1_FRS2_FRS3_RM + - + id: 1154 + symbol: FADD_D + name: FADD_D + assembly_mnemonic: fadd.d + encoding: 44336211 + operands: + - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_ADD + encoding_category: R + assembly_format: FRD_FRS1_FRS2_RM + - + id: 1155 + symbol: FSUB_D + name: FSUB_D + assembly_mnemonic: fsub.d + encoding: 178553939 + operands: + - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_ADD + encoding_category: R + assembly_format: FRD_FRS1_FRS2_RM + - + id: 1156 + symbol: FMUL_D + name: FMUL_D + assembly_mnemonic: fmul.d + encoding: 312771667 + operands: + - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_MUL + encoding_category: R + assembly_format: FRD_FRS1_FRS2_RM + - + id: 1157 + symbol: FDIV_D + name: FDIV_D + assembly_mnemonic: fdiv.d + encoding: 446989395 + operands: + - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_DIV + encoding_category: R + assembly_format: FRD_FRS1_FRS2_RM + - + id: 1158 + symbol: FSQRT_D + name: FSQRT_D + assembly_mnemonic: fsqrt.d + encoding: 1510245459 + operands: + - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_SQRT + encoding_category: R + assembly_format: FRD_FRS1_RM + - + id: 1159 + symbol: FSGNJ_D + name: FSGNJ_D + assembly_mnemonic: fsgnj.d + encoding: 581207123 + operands: + - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: FP_ADD + encoding_category: R + assembly_format: FRD_FRS1_FRS2 + - + id: 1160 + symbol: FSGNJN_D + name: FSGNJN_D + assembly_mnemonic: fsgnjn.d + encoding: 581211219 + operands: + - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: FP_ADD + encoding_category: R + assembly_format: FRD_FRS1_FRS2 + - + id: 1161 + symbol: FSGNJX_D + name: FSGNJX_D + assembly_mnemonic: fsgnjx.d + encoding: 581215315 + operands: + - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: FP_ADD + encoding_category: R + assembly_format: FRD_FRS1_FRS2 + - + id: 1162 + symbol: FMIN_D + name: FMIN_D + assembly_mnemonic: fmin.d + encoding: 715424851 + operands: + - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } + num_explicit_defs: 1 + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_ADD + encoding_category: R + assembly_format: FRD_FRS1_FRS2 + - + id: 1163 + symbol: FMAX_D + name: FMAX_D + assembly_mnemonic: fmax.d + encoding: 715428947 + operands: + - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } + num_explicit_defs: 1 + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_ADD + encoding_category: R + assembly_format: FRD_FRS1_FRS2 + - + id: 1164 + symbol: FCVT_W_D + name: FCVT_W_D + assembly_mnemonic: fcvt.w.d + encoding: 3255075923 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_CONVERT + encoding_category: R + assembly_format: RD_FRS1_RM + - + id: 1165 + symbol: FCVT_WU_D + name: FCVT_WU_D + assembly_mnemonic: fcvt.wu.d + encoding: 3256124499 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_CONVERT + encoding_category: R + assembly_format: RD_FRS1_RM + - + id: 1166 + symbol: FCVT_L_D + name: FCVT_L_D + assembly_mnemonic: fcvt.l.d + encoding: 3257173075 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_CONVERT + encoding_category: R + assembly_format: RD_FRS1_RM + - + id: 1167 + symbol: FCVT_LU_D + name: FCVT_LU_D + assembly_mnemonic: fcvt.lu.d + encoding: 3258221651 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_CONVERT + encoding_category: R + assembly_format: RD_FRS1_RM + - + id: 1168 + symbol: FMV_X_D + name: FMV_X_D + assembly_mnemonic: fmv.x.d + encoding: 3791946835 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: FP_CONVERT + encoding_category: R + assembly_format: RD_FRS1 + - + id: 1169 + symbol: FEQ_D + name: FEQ_D + assembly_mnemonic: feq.d + encoding: 2728698963 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } + num_explicit_defs: 1 + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_ADD + encoding_category: R + assembly_format: RD_FRS1_FRS2 + - + id: 1170 + symbol: FLT_D + name: FLT_D + assembly_mnemonic: flt.d + encoding: 2728694867 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } + num_explicit_defs: 1 + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_ADD + encoding_category: R + assembly_format: RD_FRS1_FRS2 + - + id: 1171 + symbol: FLE_D + name: FLE_D + assembly_mnemonic: fle.d + encoding: 2728690771 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS2 } + num_explicit_defs: 1 + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_ADD + encoding_category: R + assembly_format: RD_FRS1_FRS2 + - + id: 1172 + symbol: FCLASS_D + name: FCLASS_D + assembly_mnemonic: fclass.d + encoding: 3791950931 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: FP_CONVERT + encoding_category: R + assembly_format: RD_FRS1 + - + id: 1173 + symbol: FCVT_D_W + name: FCVT_D_W + assembly_mnemonic: fcvt.d.w + encoding: 3523511379 + operands: + - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [produces_code] + scheduling_class: FP_CONVERT + encoding_category: R + assembly_format: FRD_RS1_RM + - + id: 1174 + symbol: FCVT_D_WU + name: FCVT_D_WU + assembly_mnemonic: fcvt.d.wu + encoding: 3524559955 + operands: + - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [produces_code] + scheduling_class: FP_CONVERT + encoding_category: R + assembly_format: FRD_RS1_RM + - + id: 1175 + symbol: FCVT_D_L + name: FCVT_D_L + assembly_mnemonic: fcvt.d.l + encoding: 3525608531 + operands: + - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_CONVERT + encoding_category: R + assembly_format: FRD_RS1_RM + - + id: 1176 + symbol: FCVT_D_LU + name: FCVT_D_LU + assembly_mnemonic: fcvt.d.lu + encoding: 3526657107 + operands: + - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_CONVERT + encoding_category: R + assembly_format: FRD_RS1_RM + - + id: 1177 + symbol: FMV_D_X + name: FMV_D_X + assembly_mnemonic: fmv.d.x + encoding: 4060382291 + operands: + - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: FP_CONVERT + encoding_category: R + assembly_format: FRD_RS1 + - + id: 1178 + symbol: FCVT_S_D + name: FCVT_S_D + assembly_mnemonic: fcvt.s.d + encoding: 1075086419 + operands: + - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: FPR64, register_bank: FPR, name: FRS1 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_CONVERT + encoding_category: R + assembly_format: FRD_FRS1_RM + - + id: 1179 + symbol: FCVT_D_S + name: FCVT_D_S + assembly_mnemonic: fcvt.d.s + encoding: 1107592275 + operands: + - { kinds: [register], role: def, register_class: FPR64, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_CONVERT + encoding_category: R + assembly_format: FRD_FRS1_RM diff --git a/backend/lib/Target/RISCV/RISCVInstrInfoF.rccdesc b/backend/lib/Target/RISCV/RISCVInstrInfoF.rccdesc new file mode 100644 index 0000000..3149207 --- /dev/null +++ b/backend/lib/Target/RISCV/RISCVInstrInfoF.rccdesc @@ -0,0 +1,477 @@ +instructions: + - + id: 1118 + symbol: FLW + name: FLW + assembly_mnemonic: flw + encoding: 8692743 + operands: + - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, memory_role: value, name: FRD } + - { kinds: [register, frame_index], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, name: IMM, allowed_target_flags: 68 } + num_explicit_defs: 1 + flags: [may_load, produces_code] + scheduling_class: LOAD + encoding_category: I + assembly_format: FRD_OFFSET_RS1 + - + id: 1119 + symbol: FSW + name: FSW + assembly_mnemonic: fsw + encoding: 10789927 + operands: + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, memory_role: value, name: FRS2 } + - { kinds: [register, frame_index], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, name: IMM, allowed_target_flags: 68 } + num_explicit_defs: 0 + flags: [may_store, produces_code] + scheduling_class: STORE + encoding_category: S + assembly_format: FRS2_OFFSET_RS1 + - + id: 1120 + symbol: FMADD_S + name: FMADD_S + assembly_mnemonic: fmadd.s + encoding: 1487176771 + operands: + - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS3 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_MUL + encoding_category: R4 + assembly_format: FRD_FRS1_FRS2_FRS3_RM + - + id: 1121 + symbol: FMSUB_S + name: FMSUB_S + assembly_mnemonic: fmsub.s + encoding: 1487176775 + operands: + - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS3 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_MUL + encoding_category: R4 + assembly_format: FRD_FRS1_FRS2_FRS3_RM + - + id: 1122 + symbol: FNMSUB_S + name: FNMSUB_S + assembly_mnemonic: fnmsub.s + encoding: 1487176779 + operands: + - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS3 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_MUL + encoding_category: R4 + assembly_format: FRD_FRS1_FRS2_FRS3_RM + - + id: 1123 + symbol: FNMADD_S + name: FNMADD_S + assembly_mnemonic: fnmadd.s + encoding: 1487176783 + operands: + - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS3 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_MUL + encoding_category: R4 + assembly_format: FRD_FRS1_FRS2_FRS3_RM + - + id: 1124 + symbol: FADD_S + name: FADD_S + assembly_mnemonic: fadd.s + encoding: 10781779 + operands: + - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_ADD + encoding_category: R + assembly_format: FRD_FRS1_FRS2_RM + - + id: 1125 + symbol: FSUB_S + name: FSUB_S + assembly_mnemonic: fsub.s + encoding: 144999507 + operands: + - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_ADD + encoding_category: R + assembly_format: FRD_FRS1_FRS2_RM + - + id: 1126 + symbol: FMUL_S + name: FMUL_S + assembly_mnemonic: fmul.s + encoding: 279217235 + operands: + - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_MUL + encoding_category: R + assembly_format: FRD_FRS1_FRS2_RM + - + id: 1127 + symbol: FDIV_S + name: FDIV_S + assembly_mnemonic: fdiv.s + encoding: 413434963 + operands: + - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_DIV + encoding_category: R + assembly_format: FRD_FRS1_FRS2_RM + - + id: 1128 + symbol: FSQRT_S + name: FSQRT_S + assembly_mnemonic: fsqrt.s + encoding: 1476691027 + operands: + - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_SQRT + encoding_category: R + assembly_format: FRD_FRS1_RM + - + id: 1129 + symbol: FSGNJ_S + name: FSGNJ_S + assembly_mnemonic: fsgnj.s + encoding: 547652691 + operands: + - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: FP_ADD + encoding_category: R + assembly_format: FRD_FRS1_FRS2 + - + id: 1130 + symbol: FSGNJN_S + name: FSGNJN_S + assembly_mnemonic: fsgnjn.s + encoding: 547656787 + operands: + - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: FP_ADD + encoding_category: R + assembly_format: FRD_FRS1_FRS2 + - + id: 1131 + symbol: FSGNJX_S + name: FSGNJX_S + assembly_mnemonic: fsgnjx.s + encoding: 547660883 + operands: + - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: FP_ADD + encoding_category: R + assembly_format: FRD_FRS1_FRS2 + - + id: 1132 + symbol: FMIN_S + name: FMIN_S + assembly_mnemonic: fmin.s + encoding: 681870419 + operands: + - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } + num_explicit_defs: 1 + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_ADD + encoding_category: R + assembly_format: FRD_FRS1_FRS2 + - + id: 1133 + symbol: FMAX_S + name: FMAX_S + assembly_mnemonic: fmax.s + encoding: 681874515 + operands: + - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } + num_explicit_defs: 1 + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_ADD + encoding_category: R + assembly_format: FRD_FRS1_FRS2 + - + id: 1134 + symbol: FCVT_W_S + name: FCVT_W_S + assembly_mnemonic: fcvt.w.s + encoding: 3221521491 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_CONVERT + encoding_category: R + assembly_format: RD_FRS1_RM + - + id: 1135 + symbol: FCVT_WU_S + name: FCVT_WU_S + assembly_mnemonic: fcvt.wu.s + encoding: 3222570067 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_CONVERT + encoding_category: R + assembly_format: RD_FRS1_RM + - + id: 1136 + symbol: FCVT_L_S + name: FCVT_L_S + assembly_mnemonic: fcvt.l.s + encoding: 3223618643 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_CONVERT + encoding_category: R + assembly_format: RD_FRS1_RM + - + id: 1137 + symbol: FCVT_LU_S + name: FCVT_LU_S + assembly_mnemonic: fcvt.lu.s + encoding: 3224667219 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_CONVERT + encoding_category: R + assembly_format: RD_FRS1_RM + - + id: 1138 + symbol: FMV_X_W + name: FMV_X_W + assembly_mnemonic: fmv.x.w + encoding: 3758392403 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: FP_CONVERT + encoding_category: R + assembly_format: RD_FRS1 + - + id: 1139 + symbol: FEQ_S + name: FEQ_S + assembly_mnemonic: feq.s + encoding: 2695144531 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } + num_explicit_defs: 1 + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_ADD + encoding_category: R + assembly_format: RD_FRS1_FRS2 + - + id: 1140 + symbol: FLT_S + name: FLT_S + assembly_mnemonic: flt.s + encoding: 2695140435 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } + num_explicit_defs: 1 + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_ADD + encoding_category: R + assembly_format: RD_FRS1_FRS2 + - + id: 1141 + symbol: FLE_S + name: FLE_S + assembly_mnemonic: fle.s + encoding: 2695136339 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS2 } + num_explicit_defs: 1 + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_ADD + encoding_category: R + assembly_format: RD_FRS1_FRS2 + - + id: 1142 + symbol: FCLASS_S + name: FCLASS_S + assembly_mnemonic: fclass.s + encoding: 3758396499 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: FPR32, register_bank: FPR, name: FRS1 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: FP_CONVERT + encoding_category: R + assembly_format: RD_FRS1 + - + id: 1143 + symbol: FCVT_S_W + name: FCVT_S_W + assembly_mnemonic: fcvt.s.w + encoding: 3489956947 + operands: + - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_CONVERT + encoding_category: R + assembly_format: FRD_RS1_RM + - + id: 1144 + symbol: FCVT_S_WU + name: FCVT_S_WU + assembly_mnemonic: fcvt.s.wu + encoding: 3491005523 + operands: + - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_CONVERT + encoding_category: R + assembly_format: FRD_RS1_RM + - + id: 1145 + symbol: FCVT_S_L + name: FCVT_S_L + assembly_mnemonic: fcvt.s.l + encoding: 3492054099 + operands: + - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_CONVERT + encoding_category: R + assembly_format: FRD_RS1_RM + - + id: 1146 + symbol: FCVT_S_LU + name: FCVT_S_LU + assembly_mnemonic: fcvt.s.lu + encoding: 3493102675 + operands: + - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [immediate], immediate_predicate: RM, name: RM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [may_raise_fp_exception, produces_code] + scheduling_class: FP_CONVERT + encoding_category: R + assembly_format: FRD_RS1_RM + - + id: 1147 + symbol: FMV_W_X + name: FMV_W_X + assembly_mnemonic: fmv.w.x + encoding: 4026827859 + operands: + - { kinds: [register], role: def, register_class: FPR32, register_bank: FPR, name: FRD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: FP_CONVERT + encoding_category: R + assembly_format: FRD_RS1 diff --git a/backend/lib/Target/RISCV/RISCVInstrInfoI.rccdesc b/backend/lib/Target/RISCV/RISCVInstrInfoI.rccdesc new file mode 100644 index 0000000..3c5711c --- /dev/null +++ b/backend/lib/Target/RISCV/RISCVInstrInfoI.rccdesc @@ -0,0 +1,875 @@ +instructions: + - + id: 1024 + symbol: LUI + name: LUI + assembly_mnemonic: lui + encoding: 5175 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: UIMM20, allowed_target_flags: 32, name: IMM } + num_explicit_defs: 1 + flags: [produces_code, rematerializable] + scheduling_class: ALU + encoding_category: U + assembly_format: RD_IMM + - + id: 1025 + symbol: AUIPC + name: AUIPC + assembly_mnemonic: auipc + encoding: 5143 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [immediate, basic_block, global_symbol, external_symbol, mc_symbol], immediate_predicate: UIMM20, allowed_target_flags: 3, name: IMM } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: U + assembly_format: RD_IMM + - + id: 1026 + symbol: ADDI + name: ADDI + assembly_mnemonic: addi + encoding: 1344531 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register, frame_index], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, allowed_target_flags: 68, name: IMM } + num_explicit_defs: 1 + flags: [produces_code, rematerializable] + scheduling_class: ALU + encoding_category: I + assembly_format: RD_RS1_IMM + - + id: 1042 + symbol: SRLI + name: SRLI + assembly_mnemonic: srli + encoding: 1365011 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [immediate], immediate_predicate: UIMM6, name: IMM } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: I + assembly_format: RD_RS1_IMM + - + id: 1043 + symbol: SRAI + name: SRAI + assembly_mnemonic: srai + encoding: 1075106835 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [immediate], immediate_predicate: UIMM6, name: IMM } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: I + assembly_format: RD_RS1_IMM + - + id: 1044 + symbol: ADDIW + name: ADDIW + assembly_mnemonic: addiw + encoding: 1344539 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [immediate], immediate_predicate: SIMM12, name: IMM } + num_explicit_defs: 1 + flags: [produces_code, rematerializable] + scheduling_class: ALU + encoding_category: I + assembly_format: RD_RS1_IMM + - + id: 1045 + symbol: SLLIW + name: SLLIW + assembly_mnemonic: slliw + encoding: 1348635 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [immediate], immediate_predicate: UIMM5, name: IMM } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: I + assembly_format: RD_RS1_IMM + - + id: 1046 + symbol: SRLIW + name: SRLIW + assembly_mnemonic: srliw + encoding: 1365019 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [immediate], immediate_predicate: UIMM5, name: IMM } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: I + assembly_format: RD_RS1_IMM + - + id: 1047 + symbol: SRAIW + name: SRAIW + assembly_mnemonic: sraiw + encoding: 1075106843 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [immediate], immediate_predicate: UIMM5, name: IMM } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: I + assembly_format: RD_RS1_IMM + - + id: 1048 + symbol: SLL + name: SLL + assembly_mnemonic: sll + encoding: 10785843 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1049 + symbol: SLT + name: SLT + assembly_mnemonic: slt + encoding: 10789939 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1050 + symbol: SLTU + name: SLTU + assembly_mnemonic: sltu + encoding: 10794035 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1051 + symbol: XOR + name: XOR + assembly_mnemonic: xor + encoding: 10798131 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1052 + symbol: SRL + name: SRL + assembly_mnemonic: srl + encoding: 10802227 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1053 + symbol: SRA + name: SRA + assembly_mnemonic: sra + encoding: 1084544051 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1054 + symbol: OR + name: OR + assembly_mnemonic: or + encoding: 10806323 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1055 + symbol: AND + name: AND + assembly_mnemonic: and + encoding: 10810419 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1056 + symbol: ADDW + name: ADDW + assembly_mnemonic: addw + encoding: 10781755 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1057 + symbol: SUBW + name: SUBW + assembly_mnemonic: subw + encoding: 1084523579 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1058 + symbol: SLLW + name: SLLW + assembly_mnemonic: sllw + encoding: 10785851 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1059 + symbol: SRLW + name: SRLW + assembly_mnemonic: srlw + encoding: 10802235 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1060 + symbol: SRAW + name: SRAW + assembly_mnemonic: sraw + encoding: 1084544059 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1061 + symbol: LB + name: LB + assembly_mnemonic: lb + encoding: 8684547 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, name: IMM, allowed_target_flags: 68 } + num_explicit_defs: 1 + flags: [may_load, produces_code] + scheduling_class: LOAD + encoding_category: I + assembly_format: RD_OFFSET_RS1 + - + id: 1062 + symbol: LH + name: LH + assembly_mnemonic: lh + encoding: 8688643 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, name: IMM, allowed_target_flags: 68 } + num_explicit_defs: 1 + flags: [may_load, produces_code] + scheduling_class: LOAD + encoding_category: I + assembly_format: RD_OFFSET_RS1 + - + id: 1063 + symbol: LW + name: LW + assembly_mnemonic: lw + encoding: 8692739 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [register, frame_index], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, name: IMM, allowed_target_flags: 68 } + num_explicit_defs: 1 + flags: [may_load, produces_code] + scheduling_class: LOAD + encoding_category: I + assembly_format: RD_OFFSET_RS1 + - + id: 1064 + symbol: LBU + name: LBU + assembly_mnemonic: lbu + encoding: 8700931 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, name: IMM, allowed_target_flags: 68 } + num_explicit_defs: 1 + flags: [may_load, produces_code] + scheduling_class: LOAD + encoding_category: I + assembly_format: RD_OFFSET_RS1 + - + id: 1065 + symbol: LHU + name: LHU + assembly_mnemonic: lhu + encoding: 8705027 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, name: IMM, allowed_target_flags: 68 } + num_explicit_defs: 1 + flags: [may_load, produces_code] + scheduling_class: LOAD + encoding_category: I + assembly_format: RD_OFFSET_RS1 + - + id: 1066 + symbol: LWU + name: LWU + assembly_mnemonic: lwu + encoding: 8709123 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, name: IMM, allowed_target_flags: 68 } + num_explicit_defs: 1 + flags: [may_load, produces_code] + scheduling_class: LOAD + encoding_category: I + assembly_format: RD_OFFSET_RS1 + - + id: 1067 + symbol: SB + name: SB + assembly_mnemonic: sb + encoding: 10781731 + operands: + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, name: IMM, allowed_target_flags: 68 } + num_explicit_defs: 0 + flags: [may_store, produces_code] + scheduling_class: STORE + encoding_category: S + assembly_format: RS2_OFFSET_RS1 + - + id: 1068 + symbol: SH + name: SH + assembly_mnemonic: sh + encoding: 10785827 + operands: + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, name: IMM, allowed_target_flags: 68 } + num_explicit_defs: 0 + flags: [may_store, produces_code] + scheduling_class: STORE + encoding_category: S + assembly_format: RS2_OFFSET_RS1 + - + id: 1069 + symbol: SW + name: SW + assembly_mnemonic: sw + encoding: 10789923 + operands: + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } + - { kinds: [register, frame_index], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, name: IMM, allowed_target_flags: 68 } + num_explicit_defs: 0 + flags: [may_store, produces_code] + scheduling_class: STORE + encoding_category: S + assembly_format: RS2_OFFSET_RS1 + - + id: 1070 + symbol: BLT + name: BLT + assembly_mnemonic: blt + encoding: 9715811 + operands: + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + - { kinds: [basic_block], name: TARGET } + num_explicit_defs: 0 + flags: [terminator, branch, produces_code] + scheduling_class: BRANCH + encoding_category: B + assembly_format: RS1_RS2_TARGET + - + id: 1071 + symbol: BGE + name: BGE + assembly_mnemonic: bge + encoding: 9719907 + operands: + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + - { kinds: [basic_block], name: TARGET } + num_explicit_defs: 0 + flags: [terminator, branch, produces_code] + scheduling_class: BRANCH + encoding_category: B + assembly_format: RS1_RS2_TARGET + - + id: 1072 + symbol: BLTU + name: BLTU + assembly_mnemonic: bltu + encoding: 9724003 + operands: + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + - { kinds: [basic_block], name: TARGET } + num_explicit_defs: 0 + flags: [terminator, branch, produces_code] + scheduling_class: BRANCH + encoding_category: B + assembly_format: RS1_RS2_TARGET + - + id: 1073 + symbol: BGEU + name: BGEU + assembly_mnemonic: bgeu + encoding: 9728099 + operands: + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + - { kinds: [basic_block], name: TARGET } + num_explicit_defs: 0 + flags: [terminator, branch, produces_code] + scheduling_class: BRANCH + encoding_category: B + assembly_format: RS1_RS2_TARGET + - + id: 1074 + symbol: JALR + name: JALR + assembly_mnemonic: jalr + encoding: 1344615 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [immediate, basic_block, global_symbol, external_symbol, mc_symbol], immediate_predicate: SIMM12, allowed_target_flags: 4, name: IMM } + num_explicit_defs: 1 + flags: [terminator, branch, indirect_branch, produces_code] + scheduling_class: BRANCH + encoding_category: I + assembly_format: RD_RS1_IMM + - + id: 1075 + symbol: FENCE + name: FENCE + assembly_mnemonic: fence + encoding: 15 + operands: + - { kinds: [immediate], immediate_predicate: UIMM4, name: PRED } + - { kinds: [immediate], immediate_predicate: UIMM4, name: SUCC } + num_explicit_defs: 0 + flags: [has_side_effects, produces_code] + scheduling_class: FENCE + encoding_category: I + assembly_format: IMM_IMM + - + id: 1076 + symbol: FENCE_I + name: FENCE_I + assembly_mnemonic: fence.i + encoding: 4111 + operands: [] + num_explicit_defs: 0 + flags: [has_side_effects, produces_code] + scheduling_class: FENCE + encoding_category: I + assembly_format: NONE + - + id: 1077 + symbol: CSRRW + name: CSRRW + assembly_mnemonic: csrrw + encoding: 1348723 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [immediate], immediate_predicate: UIMM12, name: CSR } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [has_side_effects, produces_code] + scheduling_class: SYSTEM + encoding_category: SYSTEM + assembly_format: RD_CSR_RS1 + - + id: 1078 + symbol: CSRRS + name: CSRRS + assembly_mnemonic: csrrs + encoding: 1352819 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [immediate], immediate_predicate: UIMM12, name: CSR } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [has_side_effects, produces_code] + scheduling_class: SYSTEM + encoding_category: SYSTEM + assembly_format: RD_CSR_RS1 + - + id: 1079 + symbol: CSRRC + name: CSRRC + assembly_mnemonic: csrrc + encoding: 1356915 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [immediate], immediate_predicate: UIMM12, name: CSR } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + num_explicit_defs: 1 + flags: [has_side_effects, produces_code] + scheduling_class: SYSTEM + encoding_category: SYSTEM + assembly_format: RD_CSR_RS1 + - + id: 1080 + symbol: CSRRWI + name: CSRRWI + assembly_mnemonic: csrrwi + encoding: 1102963 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [immediate], immediate_predicate: UIMM12, name: CSR } + - { kinds: [immediate], immediate_predicate: UIMM5, name: ZIMM } + num_explicit_defs: 1 + flags: [has_side_effects, produces_code] + scheduling_class: SYSTEM + encoding_category: SYSTEM + assembly_format: RD_CSR_IMM + - + id: 1081 + symbol: CSRRSI + name: CSRRSI + assembly_mnemonic: csrrsi + encoding: 1107059 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [immediate], immediate_predicate: UIMM12, name: CSR } + - { kinds: [immediate], immediate_predicate: UIMM5, name: ZIMM } + num_explicit_defs: 1 + flags: [has_side_effects, produces_code] + scheduling_class: SYSTEM + encoding_category: SYSTEM + assembly_format: RD_CSR_IMM + - + id: 1082 + symbol: CSRRCI + name: CSRRCI + assembly_mnemonic: csrrci + encoding: 1111155 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [immediate], immediate_predicate: UIMM12, name: CSR } + - { kinds: [immediate], immediate_predicate: UIMM5, name: ZIMM } + num_explicit_defs: 1 + flags: [has_side_effects, produces_code] + scheduling_class: SYSTEM + encoding_category: SYSTEM + assembly_format: RD_CSR_IMM + - + id: 1027 + symbol: ADD + name: ADD + assembly_mnemonic: add + encoding: 10781747 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1028 + symbol: SUB + name: SUB + assembly_mnemonic: sub + encoding: 1084523571 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1029 + symbol: LD + name: LD + assembly_mnemonic: ld + encoding: 8696835 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, memory_role: value, name: RD } + - { kinds: [register, frame_index], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, name: IMM, allowed_target_flags: 68 } + num_explicit_defs: 1 + flags: [may_load, produces_code] + scheduling_class: LOAD + encoding_category: I + assembly_format: RD_OFFSET_RS1 + - + id: 1030 + symbol: SD + name: SD + assembly_mnemonic: sd + encoding: 10794019 + operands: + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, memory_role: value, name: RS2 } + - { kinds: [register, frame_index], role: use, register_class: GPR, register_bank: GPR, memory_role: address, name: RS1 } + - { kinds: [immediate, constant_pool_index, jump_table_index, global_symbol, external_symbol, block_address, mc_symbol], immediate_predicate: SIMM12, name: IMM, allowed_target_flags: 68 } + num_explicit_defs: 0 + flags: [may_store, produces_code] + scheduling_class: STORE + encoding_category: S + assembly_format: RS2_OFFSET_RS1 + - + id: 1031 + symbol: BEQ + name: BEQ + assembly_mnemonic: beq + encoding: 9699427 + operands: + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + - { kinds: [basic_block], name: TARGET } + num_explicit_defs: 0 + flags: [terminator, branch, produces_code] + scheduling_class: BRANCH + encoding_category: B + assembly_format: RS1_RS2_TARGET + - + id: 1032 + symbol: BNE + name: BNE + assembly_mnemonic: bne + encoding: 9703523 + operands: + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + - { kinds: [basic_block], name: TARGET } + num_explicit_defs: 0 + flags: [terminator, branch, produces_code] + scheduling_class: BRANCH + encoding_category: B + assembly_format: RS1_RS2_TARGET + - + id: 1033 + symbol: JAL + name: JAL + assembly_mnemonic: jal + encoding: 1135 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [basic_block], name: TARGET } + num_explicit_defs: 1 + flags: [terminator, branch, produces_code] + scheduling_class: BRANCH + encoding_category: J + assembly_format: RD_TARGET + - + id: 1034 + symbol: ECALL + name: ECALL + assembly_mnemonic: ecall + encoding: 115 + operands: [] + num_explicit_defs: 0 + flags: [has_side_effects, produces_code] + scheduling_class: SYSTEM + encoding_category: SYSTEM + assembly_format: NONE + - + id: 1035 + symbol: EBREAK + name: EBREAK + assembly_mnemonic: ebreak + encoding: 1048691 + operands: [] + num_explicit_defs: 0 + flags: [has_side_effects, produces_code] + scheduling_class: SYSTEM + encoding_category: SYSTEM + assembly_format: NONE + - + id: 1036 + symbol: SLTI + name: SLTI + assembly_mnemonic: slti + encoding: 1352723 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [immediate], immediate_predicate: SIMM12, name: IMM } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: I + assembly_format: RD_RS1_IMM + - + id: 1037 + symbol: SLTIU + name: SLTIU + assembly_mnemonic: sltiu + encoding: 1356819 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [immediate], immediate_predicate: SIMM12, name: IMM } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: I + assembly_format: RD_RS1_IMM + - + id: 1038 + symbol: XORI + name: XORI + assembly_mnemonic: xori + encoding: 1360915 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [immediate], immediate_predicate: SIMM12, name: IMM } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: I + assembly_format: RD_RS1_IMM + - + id: 1039 + symbol: ORI + name: ORI + assembly_mnemonic: ori + encoding: 1369107 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [immediate], immediate_predicate: SIMM12, name: IMM } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: I + assembly_format: RD_RS1_IMM + - + id: 1040 + symbol: ANDI + name: ANDI + assembly_mnemonic: andi + encoding: 1373203 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [immediate], immediate_predicate: SIMM12, name: IMM } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: I + assembly_format: RD_RS1_IMM + - + id: 1041 + symbol: SLLI + name: SLLI + assembly_mnemonic: slli + encoding: 1348627 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [immediate], immediate_predicate: UIMM6, name: IMM } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: I + assembly_format: RD_RS1_IMM diff --git a/backend/lib/Target/RISCV/RISCVInstrInfoM.rccdesc b/backend/lib/Target/RISCV/RISCVInstrInfoM.rccdesc new file mode 100644 index 0000000..62e8e6c --- /dev/null +++ b/backend/lib/Target/RISCV/RISCVInstrInfoM.rccdesc @@ -0,0 +1,196 @@ +instructions: + - + id: 1083 + symbol: MUL + name: MUL + assembly_mnemonic: mul + encoding: 44336179 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code, commutable] + scheduling_class: MUL + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1084 + symbol: MULH + name: MULH + assembly_mnemonic: mulh + encoding: 44340275 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code, commutable] + scheduling_class: MUL + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1085 + symbol: MULHSU + name: MULHSU + assembly_mnemonic: mulhsu + encoding: 44344371 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: MUL + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1086 + symbol: MULHU + name: MULHU + assembly_mnemonic: mulhu + encoding: 44348467 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code, commutable] + scheduling_class: MUL + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1087 + symbol: DIV + name: DIV + assembly_mnemonic: div + encoding: 44352563 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: DIV + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1088 + symbol: DIVU + name: DIVU + assembly_mnemonic: divu + encoding: 44356659 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: DIV + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1089 + symbol: REM + name: REM + assembly_mnemonic: rem + encoding: 44360755 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: DIV + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1090 + symbol: REMU + name: REMU + assembly_mnemonic: remu + encoding: 44364851 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: DIV + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1091 + symbol: MULW + name: MULW + assembly_mnemonic: mulw + encoding: 44336187 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code, commutable] + scheduling_class: MUL + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1092 + symbol: DIVW + name: DIVW + assembly_mnemonic: divw + encoding: 44352571 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: DIV + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1093 + symbol: DIVUW + name: DIVUW + assembly_mnemonic: divuw + encoding: 44356667 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: DIV + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1094 + symbol: REMW + name: REMW + assembly_mnemonic: remw + encoding: 44360763 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: DIV + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1095 + symbol: REMUW + name: REMUW + assembly_mnemonic: remuw + encoding: 44364859 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: DIV + encoding_category: R + assembly_format: RD_RS1_RS2 diff --git a/backend/lib/Target/RISCV/RISCVInstrInfoPseudo.rccdesc b/backend/lib/Target/RISCV/RISCVInstrInfoPseudo.rccdesc new file mode 100644 index 0000000..4f16ec6 --- /dev/null +++ b/backend/lib/Target/RISCV/RISCVInstrInfoPseudo.rccdesc @@ -0,0 +1,380 @@ +instructions: + - + id: 1229 + symbol: G_SLLW + name: G_SLLW + operands: + - { kinds: [register], role: def, type_index: 0 } + - { kinds: [register], role: use, type_index: 0 } + - { kinds: [register], role: use, type_index: 0 } + num_explicit_defs: 1 + flags: [generic, pseudo, allowed_pre_legalizer] + owner: instruction_select + deadline: selected + - + id: 1230 + symbol: G_SRAW + name: G_SRAW + operands: + - { kinds: [register], role: def, type_index: 0 } + - { kinds: [register], role: use, type_index: 0 } + - { kinds: [register], role: use, type_index: 0 } + num_explicit_defs: 1 + flags: [generic, pseudo, allowed_pre_legalizer] + owner: instruction_select + deadline: selected + - + id: 1231 + symbol: G_DIVW + name: G_DIVW + operands: + - { kinds: [register], role: def, type_index: 0 } + - { kinds: [register], role: use, type_index: 0 } + - { kinds: [register], role: use, type_index: 0 } + num_explicit_defs: 1 + flags: [generic, pseudo, allowed_pre_legalizer] + owner: instruction_select + deadline: selected + - + id: 1232 + symbol: G_CLZW + name: G_CLZW + operands: + - { kinds: [register], role: def, type_index: 0 } + - { kinds: [register], role: use, type_index: 0 } + num_explicit_defs: 1 + flags: [generic, pseudo, allowed_pre_legalizer] + owner: instruction_select + deadline: selected + - + id: 1233 + symbol: G_CTZW + name: G_CTZW + operands: + - { kinds: [register], role: def, type_index: 0 } + - { kinds: [register], role: use, type_index: 0 } + num_explicit_defs: 1 + flags: [generic, pseudo, allowed_pre_legalizer] + owner: instruction_select + deadline: selected + - + id: 1234 + symbol: G_FCVT_W_RV64 + name: G_FCVT_W_RV64 + operands: + - { kinds: [register], role: def, type_index: 0 } + - { kinds: [register], role: use, type_index: 1 } + - { kinds: [immediate] } + num_explicit_defs: 1 + flags: [generic, pseudo, allowed_pre_legalizer] + owner: instruction_select + deadline: selected + - + id: 1235 + symbol: G_FCLASS + name: G_FCLASS + operands: + - { kinds: [register], role: def, type_index: 0 } + - { kinds: [register], role: use, type_index: 1 } + num_explicit_defs: 1 + flags: [generic, pseudo, allowed_pre_legalizer] + owner: instruction_select + deadline: selected + - + id: 1236 + symbol: G_ROLW + name: G_ROLW + operands: + - { kinds: [register], role: def, type_index: 0 } + - { kinds: [register], role: use, type_index: 0 } + - { kinds: [register], role: use, type_index: 0 } + num_explicit_defs: 1 + flags: [generic, pseudo, allowed_pre_legalizer] + owner: instruction_select + deadline: selected + - + id: 1237 + symbol: G_SRLW + name: G_SRLW + operands: + - { kinds: [register], role: def, type_index: 0 } + - { kinds: [register], role: use, type_index: 0 } + - { kinds: [register], role: use, type_index: 0 } + num_explicit_defs: 1 + flags: [generic, pseudo, allowed_pre_legalizer] + owner: instruction_select + deadline: selected + - + id: 1238 + symbol: G_DIVUW + name: G_DIVUW + operands: + - { kinds: [register], role: def, type_index: 0 } + - { kinds: [register], role: use, type_index: 0 } + - { kinds: [register], role: use, type_index: 0 } + num_explicit_defs: 1 + flags: [generic, pseudo, allowed_pre_legalizer] + owner: instruction_select + deadline: selected + - + id: 1239 + symbol: G_REMUW + name: G_REMUW + operands: + - { kinds: [register], role: def, type_index: 0 } + - { kinds: [register], role: use, type_index: 0 } + - { kinds: [register], role: use, type_index: 0 } + num_explicit_defs: 1 + flags: [generic, pseudo, allowed_pre_legalizer] + owner: instruction_select + deadline: selected + - + id: 1240 + symbol: G_RORW + name: G_RORW + operands: + - { kinds: [register], role: def, type_index: 0 } + - { kinds: [register], role: use, type_index: 0 } + - { kinds: [register], role: use, type_index: 0 } + num_explicit_defs: 1 + flags: [generic, pseudo, allowed_pre_legalizer] + owner: instruction_select + deadline: selected + - + id: 1241 + symbol: G_BREV8 + name: G_BREV8 + operands: + - { kinds: [register], role: def, type_index: 0 } + - { kinds: [register], role: use, type_index: 0 } + num_explicit_defs: 1 + flags: [generic, pseudo, allowed_pre_legalizer] + owner: instruction_select + deadline: selected + - + id: 1242 + symbol: G_FCVT_WU_RV64 + name: G_FCVT_WU_RV64 + operands: + - { kinds: [register], role: def, type_index: 0 } + - { kinds: [register], role: use, type_index: 1 } + - { kinds: [immediate] } + num_explicit_defs: 1 + flags: [generic, pseudo, allowed_pre_legalizer] + owner: instruction_select + deadline: selected + - + id: 1243 + symbol: G_CLSW + name: G_CLSW + operands: + - { kinds: [register], role: def, type_index: 0 } + - { kinds: [register], role: use, type_index: 0 } + num_explicit_defs: 1 + flags: [generic, pseudo, allowed_pre_legalizer] + owner: instruction_select + deadline: selected + - + id: 1244 + symbol: Select_GPR_Using_CC_GPR + name: Select_GPR_Using_CC_GPR + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR } + - { kinds: [immediate] } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR } + num_explicit_defs: 1 + flags: [pseudo, produces_code, allowed_pre_legalizer] + owner: instruction_select + deadline: selected + - + id: 1245 + symbol: ReadFFLAGS + name: ReadFFLAGS + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR } + num_explicit_defs: 1 + implicit_uses: [{ register: FFLAGS }] + flags: [pseudo, produces_code, allowed_pre_legalizer, has_side_effects] + owner: post_ra_expansion + deadline: post_ra_finalized + + - + id: 1246 + symbol: WriteFFLAGS + name: WriteFFLAGS + operands: + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR } + num_explicit_defs: 0 + implicit_defs: [{ register: FFLAGS }] + flags: [pseudo, produces_code, allowed_pre_legalizer, has_side_effects] + owner: post_ra_expansion + deadline: post_ra_finalized + - + id: 1217 + symbol: PseudoLOAD_STACK_ARG + name: PseudoLOAD_STACK_ARG + operands: + - { kinds: [register], role: def, memory_role: value } + - { kinds: [frame_index] } + - { kinds: [immediate, integer_immediate] } + - { kinds: [immediate] } + num_explicit_defs: 1 + flags: [pseudo, produces_code, allowed_pre_legalizer, may_load] + owner: instruction_select + deadline: selected + - + id: 1218 + symbol: PseudoSTORE_STACK_ARG + name: PseudoSTORE_STACK_ARG + operands: + - { kinds: [register], role: use, memory_role: value } + - { kinds: [frame_index] } + - { kinds: [immediate, integer_immediate] } + - { kinds: [immediate] } + num_explicit_defs: 0 + flags: [pseudo, produces_code, allowed_pre_legalizer, may_store] + owner: instruction_select + deadline: selected + - + id: 1219 + symbol: PseudoBYVAL_COPY + name: PseudoBYVAL_COPY + operands: + - { kinds: [register], role: def } + - { kinds: [register], role: use, memory_role: address } + - { kinds: [frame_index] } + - { kinds: [immediate, integer_immediate] } + - { kinds: [immediate, integer_immediate] } + num_explicit_defs: 1 + flags: [pseudo, produces_code, allowed_pre_legalizer, may_load, may_store] + owner: instruction_select + deadline: selected + - + id: 1220 + symbol: ADJCALLSTACKDOWN + name: ADJCALLSTACKDOWN + operands: + - { kinds: [immediate, integer_immediate] } + - { kinds: [immediate, integer_immediate] } + num_explicit_defs: 0 + implicit_defs: [{ register: X2 }] + implicit_uses: [{ register: X2 }] + flags: [pseudo, allowed_pre_legalizer, has_side_effects] + owner: prologue_epilogue_insertion + deadline: frame_finalized + - + id: 1221 + symbol: ADJCALLSTACKUP + name: ADJCALLSTACKUP + operands: + - { kinds: [immediate, integer_immediate] } + - { kinds: [immediate, integer_immediate] } + num_explicit_defs: 0 + implicit_defs: [{ register: X2 }] + implicit_uses: [{ register: X2 }] + flags: [pseudo, allowed_pre_legalizer, has_side_effects] + owner: prologue_epilogue_insertion + deadline: frame_finalized + - + id: 1222 + symbol: PseudoCALL + name: PseudoCALL + operands: + - { kinds: [global_symbol, external_symbol, register], role: use, allowed_target_flags: 1 } + - { kinds: [register_mask], optional: true } + num_explicit_defs: 0 + implicit_defs: [{ register: X1 }] + allow_extra_implicit_operands: true + flags: [pseudo, produces_code, allowed_pre_legalizer, call, may_load, may_store, has_side_effects, not_duplicable, unmodeled_side_effects] + size: 8 + owner: post_ra_expansion + deadline: post_ra_finalized + - + id: 1223 + symbol: PseudoTAIL + name: PseudoTAIL + operands: + - { kinds: [global_symbol, external_symbol, register], role: use, allowed_target_flags: 1 } + - { kinds: [register_mask], optional: true } + num_explicit_defs: 0 + allow_extra_implicit_operands: true + flags: [pseudo, produces_code, allowed_pre_legalizer, terminator, branch, call, barrier, may_load, may_store, has_side_effects, not_duplicable, unmodeled_side_effects] + size: 8 + owner: post_ra_expansion + deadline: post_ra_finalized + - + id: 1224 + symbol: PseudoRET + name: PseudoRET + operands: [] + num_explicit_defs: 0 + allow_extra_implicit_operands: true + flags: [pseudo, produces_code, allowed_pre_legalizer, terminator, return, barrier] + size: 4 + owner: post_ra_expansion + deadline: post_ra_finalized + + - + id: 1225 + symbol: JALR_CALL + name: JALR_CALL + assembly_mnemonic: jalr + encoding: 1344615 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [immediate, mc_symbol], immediate_predicate: SIMM12, allowed_target_flags: 4, name: IMM } + - { kinds: [register_mask] } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [call, may_load, may_store, has_side_effects, produces_code, not_duplicable, unmodeled_side_effects] + scheduling_class: BRANCH + encoding_category: I + assembly_format: RD_RS1_IMM + - + id: 1226 + symbol: JALR_TAIL + name: JALR_TAIL + assembly_mnemonic: jalr + encoding: 1344615 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [immediate, mc_symbol], immediate_predicate: SIMM12, allowed_target_flags: 4, name: IMM } + - { kinds: [register_mask] } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [terminator, branch, indirect_branch, call, barrier, may_load, may_store, has_side_effects, produces_code, not_duplicable, unmodeled_side_effects] + scheduling_class: BRANCH + encoding_category: I + assembly_format: RD_RS1_IMM + - + id: 1227 + symbol: JALR_RET + name: JALR_RET + assembly_mnemonic: jalr + encoding: 1344615 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [immediate], immediate_predicate: SIMM12, name: IMM } + num_explicit_defs: 1 + allow_extra_implicit_operands: true + flags: [terminator, return, barrier, produces_code] + scheduling_class: BRANCH + encoding_category: I + assembly_format: RD_RS1_IMM + - + id: 1228 + symbol: PseudoBR + name: PseudoBR + operands: + - { kinds: [basic_block], name: TARGET } + num_explicit_defs: 0 + flags: [pseudo, produces_code, allowed_pre_legalizer, terminator, branch, barrier] + size: 4 + owner: post_ra_expansion + deadline: post_ra_finalized diff --git a/backend/lib/Target/RISCV/RISCVInstrInfoZb.rccdesc b/backend/lib/Target/RISCV/RISCVInstrInfoZb.rccdesc new file mode 100644 index 0000000..103c3ab --- /dev/null +++ b/backend/lib/Target/RISCV/RISCVInstrInfoZb.rccdesc @@ -0,0 +1,237 @@ +instructions: + - + id: 1247 + symbol: SH1ADD + name: SH1ADD + assembly_mnemonic: sh1add + encoding: 547660851 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1248 + symbol: SH2ADD + name: SH2ADD + assembly_mnemonic: sh2add + encoding: 547669043 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1249 + symbol: SH3ADD + name: SH3ADD + assembly_mnemonic: sh3add + encoding: 547677235 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1250 + symbol: SH1ADD_UW + name: SH1ADD_UW + assembly_mnemonic: sh1add.uw + encoding: 547660859 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1251 + symbol: SH2ADD_UW + name: SH2ADD_UW + assembly_mnemonic: sh2add.uw + encoding: 547669051 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1252 + symbol: SH3ADD_UW + name: SH3ADD_UW + assembly_mnemonic: sh3add.uw + encoding: 547677243 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1253 + symbol: SLLI_UW + name: SLLI_UW + assembly_mnemonic: slli.uw + encoding: 135566363 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [immediate], immediate_predicate: UIMM6, name: IMM } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: I + assembly_format: RD_RS1_IMM + - + id: 1254 + symbol: ADD_UW + name: ADD_UW + assembly_mnemonic: add.uw + encoding: 144999483 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1255 + symbol: SEXT_B + name: SEXT_B + assembly_mnemonic: sext.b + encoding: 1615107091 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: I + assembly_format: RD_RS1 + - + id: 1256 + symbol: SEXT_H + name: SEXT_H + assembly_mnemonic: sext.h + encoding: 1616155667 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: I + assembly_format: RD_RS1 + - + id: 1257 + symbol: ZEXT_H_RV32 + name: ZEXT_H_RV32 + assembly_mnemonic: zext.h + encoding: 134530099 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: R + assembly_format: RD_RS1 + - + id: 1258 + symbol: ZEXT_H_RV64 + name: ZEXT_H_RV64 + assembly_mnemonic: zext.h + encoding: 134530107 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + num_explicit_defs: 1 + flags: [produces_code] + scheduling_class: ALU + encoding_category: R + assembly_format: RD_RS1 + - + id: 1259 + symbol: MIN + name: MIN + assembly_mnemonic: min + encoding: 178570291 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code, commutable] + scheduling_class: ALU + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1260 + symbol: MINU + name: MINU + assembly_mnemonic: minu + encoding: 178574387 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code, commutable] + scheduling_class: ALU + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1261 + symbol: MAX + name: MAX + assembly_mnemonic: max + encoding: 178578483 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code, commutable] + scheduling_class: ALU + encoding_category: R + assembly_format: RD_RS1_RS2 + - + id: 1262 + symbol: MAXU + name: MAXU + assembly_mnemonic: maxu + encoding: 178582579 + operands: + - { kinds: [register], role: def, register_class: GPR, register_bank: GPR, name: RD } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS1 } + - { kinds: [register], role: use, register_class: GPR, register_bank: GPR, name: RS2 } + num_explicit_defs: 1 + flags: [produces_code, commutable] + scheduling_class: ALU + encoding_category: R + assembly_format: RD_RS1_RS2 diff --git a/backend/lib/Target/RISCV/RISCVRegisterInfo.rccdesc b/backend/lib/Target/RISCV/RISCVRegisterInfo.rccdesc new file mode 100644 index 0000000..7a63dc0 --- /dev/null +++ b/backend/lib/Target/RISCV/RISCVRegisterInfo.rccdesc @@ -0,0 +1,383 @@ +register_units: + - { id: 1, symbol: U_X0, name: x0.unit } + - { id: 2, symbol: U_X1, name: x1.unit } + - { id: 3, symbol: U_X2, name: x2.unit } + - { id: 4, symbol: U_X3, name: x3.unit } + - { id: 5, symbol: U_X4, name: x4.unit } + - { id: 6, symbol: U_X5, name: x5.unit } + - { id: 7, symbol: U_X6, name: x6.unit } + - { id: 8, symbol: U_X7, name: x7.unit } + - { id: 9, symbol: U_X8, name: x8.unit } + - { id: 10, symbol: U_X9, name: x9.unit } + - { id: 11, symbol: U_X10, name: x10.unit } + - { id: 12, symbol: U_X11, name: x11.unit } + - { id: 13, symbol: U_X12, name: x12.unit } + - { id: 14, symbol: U_X13, name: x13.unit } + - { id: 15, symbol: U_X14, name: x14.unit } + - { id: 16, symbol: U_X15, name: x15.unit } + - { id: 17, symbol: U_X16, name: x16.unit } + - { id: 18, symbol: U_X17, name: x17.unit } + - { id: 19, symbol: U_X18, name: x18.unit } + - { id: 20, symbol: U_X19, name: x19.unit } + - { id: 21, symbol: U_X20, name: x20.unit } + - { id: 22, symbol: U_X21, name: x21.unit } + - { id: 23, symbol: U_X22, name: x22.unit } + - { id: 24, symbol: U_X23, name: x23.unit } + - { id: 25, symbol: U_X24, name: x24.unit } + - { id: 26, symbol: U_X25, name: x25.unit } + - { id: 27, symbol: U_X26, name: x26.unit } + - { id: 28, symbol: U_X27, name: x27.unit } + - { id: 29, symbol: U_X28, name: x28.unit } + - { id: 30, symbol: U_X29, name: x29.unit } + - { id: 31, symbol: U_X30, name: x30.unit } + - { id: 32, symbol: U_X31, name: x31.unit } + - { id: 33, symbol: U_F0, name: f0.unit } + - { id: 34, symbol: U_F1, name: f1.unit } + - { id: 35, symbol: U_F2, name: f2.unit } + - { id: 36, symbol: U_F3, name: f3.unit } + - { id: 37, symbol: U_F4, name: f4.unit } + - { id: 38, symbol: U_F5, name: f5.unit } + - { id: 39, symbol: U_F6, name: f6.unit } + - { id: 40, symbol: U_F7, name: f7.unit } + - { id: 41, symbol: U_F8, name: f8.unit } + - { id: 42, symbol: U_F9, name: f9.unit } + - { id: 43, symbol: U_F10, name: f10.unit } + - { id: 44, symbol: U_F11, name: f11.unit } + - { id: 45, symbol: U_F12, name: f12.unit } + - { id: 46, symbol: U_F13, name: f13.unit } + - { id: 47, symbol: U_F14, name: f14.unit } + - { id: 48, symbol: U_F15, name: f15.unit } + - { id: 49, symbol: U_F16, name: f16.unit } + - { id: 50, symbol: U_F17, name: f17.unit } + - { id: 51, symbol: U_F18, name: f18.unit } + - { id: 52, symbol: U_F19, name: f19.unit } + - { id: 53, symbol: U_F20, name: f20.unit } + - { id: 54, symbol: U_F21, name: f21.unit } + - { id: 55, symbol: U_F22, name: f22.unit } + - { id: 56, symbol: U_F23, name: f23.unit } + - { id: 57, symbol: U_F24, name: f24.unit } + - { id: 58, symbol: U_F25, name: f25.unit } + - { id: 59, symbol: U_F26, name: f26.unit } + - { id: 60, symbol: U_F27, name: f27.unit } + - { id: 61, symbol: U_F28, name: f28.unit } + - { id: 62, symbol: U_F29, name: f29.unit } + - { id: 63, symbol: U_F30, name: f30.unit } + - { id: 64, symbol: U_F31, name: f31.unit } + - { id: 65, symbol: U_FFLAGS, name: fflags.unit } + - { id: 66, symbol: U_FRM, name: frm.unit } + - { id: 67, symbol: U_V0, name: v0.unit } + - { id: 68, symbol: U_V1, name: v1.unit } + - { id: 69, symbol: U_V2, name: v2.unit } + - { id: 70, symbol: U_V3, name: v3.unit } + - { id: 71, symbol: U_V4, name: v4.unit } + - { id: 72, symbol: U_V5, name: v5.unit } + - { id: 73, symbol: U_V6, name: v6.unit } + - { id: 74, symbol: U_V7, name: v7.unit } + - { id: 75, symbol: U_V8, name: v8.unit } + - { id: 76, symbol: U_V9, name: v9.unit } + - { id: 77, symbol: U_V10, name: v10.unit } + - { id: 78, symbol: U_V11, name: v11.unit } + - { id: 79, symbol: U_V12, name: v12.unit } + - { id: 80, symbol: U_V13, name: v13.unit } + - { id: 81, symbol: U_V14, name: v14.unit } + - { id: 82, symbol: U_V15, name: v15.unit } + - { id: 83, symbol: U_V16, name: v16.unit } + - { id: 84, symbol: U_V17, name: v17.unit } + - { id: 85, symbol: U_V18, name: v18.unit } + - { id: 86, symbol: U_V19, name: v19.unit } + - { id: 87, symbol: U_V20, name: v20.unit } + - { id: 88, symbol: U_V21, name: v21.unit } + - { id: 89, symbol: U_V22, name: v22.unit } + - { id: 90, symbol: U_V23, name: v23.unit } + - { id: 91, symbol: U_V24, name: v24.unit } + - { id: 92, symbol: U_V25, name: v25.unit } + - { id: 93, symbol: U_V26, name: v26.unit } + - { id: 94, symbol: U_V27, name: v27.unit } + - { id: 95, symbol: U_V28, name: v28.unit } + - { id: 96, symbol: U_V29, name: v29.unit } + - { id: 97, symbol: U_V30, name: v30.unit } + - { id: 98, symbol: U_V31, name: v31.unit } + +registers: + - { id: 1, symbol: X0, name: x0, encoding: 0, dwarf_register: 0, units: [{ unit: U_X0, lanes: 1 }], constant: true, reserved: true, aliases: [zero] } + - { id: 2, symbol: X1, name: x1, encoding: 1, dwarf_register: 1, units: [{ unit: U_X1, lanes: 1 }], aliases: [ra] } + - { id: 3, symbol: X2, name: x2, encoding: 2, dwarf_register: 2, units: [{ unit: U_X2, lanes: 1 }], reserved: true, aliases: [sp] } + - { id: 4, symbol: X3, name: x3, encoding: 3, dwarf_register: 3, units: [{ unit: U_X3, lanes: 1 }], reserved: true, aliases: [gp] } + - { id: 5, symbol: X4, name: x4, encoding: 4, dwarf_register: 4, units: [{ unit: U_X4, lanes: 1 }], reserved: true, aliases: [tp] } + - { id: 6, symbol: X5, name: x5, encoding: 5, dwarf_register: 5, units: [{ unit: U_X5, lanes: 1 }], aliases: [t0] } + - { id: 7, symbol: X6, name: x6, encoding: 6, dwarf_register: 6, units: [{ unit: U_X6, lanes: 1 }], aliases: [t1] } + - { id: 8, symbol: X7, name: x7, encoding: 7, dwarf_register: 7, units: [{ unit: U_X7, lanes: 1 }], aliases: [t2] } + - { id: 9, symbol: X8, name: x8, encoding: 8, dwarf_register: 8, units: [{ unit: U_X8, lanes: 1 }], aliases: [s0, fp] } + - { id: 10, symbol: X9, name: x9, encoding: 9, dwarf_register: 9, units: [{ unit: U_X9, lanes: 1 }], aliases: [s1] } + - { id: 11, symbol: X10, name: x10, encoding: 10, dwarf_register: 10, units: [{ unit: U_X10, lanes: 1 }], aliases: [a0] } + - { id: 12, symbol: X11, name: x11, encoding: 11, dwarf_register: 11, units: [{ unit: U_X11, lanes: 1 }], aliases: [a1] } + - { id: 13, symbol: X12, name: x12, encoding: 12, dwarf_register: 12, units: [{ unit: U_X12, lanes: 1 }], aliases: [a2] } + - { id: 14, symbol: X13, name: x13, encoding: 13, dwarf_register: 13, units: [{ unit: U_X13, lanes: 1 }], aliases: [a3] } + - { id: 15, symbol: X14, name: x14, encoding: 14, dwarf_register: 14, units: [{ unit: U_X14, lanes: 1 }], aliases: [a4] } + - { id: 16, symbol: X15, name: x15, encoding: 15, dwarf_register: 15, units: [{ unit: U_X15, lanes: 1 }], aliases: [a5] } + - { id: 17, symbol: X16, name: x16, encoding: 16, dwarf_register: 16, units: [{ unit: U_X16, lanes: 1 }], aliases: [a6] } + - { id: 18, symbol: X17, name: x17, encoding: 17, dwarf_register: 17, units: [{ unit: U_X17, lanes: 1 }], aliases: [a7] } + - { id: 19, symbol: X18, name: x18, encoding: 18, dwarf_register: 18, units: [{ unit: U_X18, lanes: 1 }], aliases: [s2] } + - { id: 20, symbol: X19, name: x19, encoding: 19, dwarf_register: 19, units: [{ unit: U_X19, lanes: 1 }], aliases: [s3] } + - { id: 21, symbol: X20, name: x20, encoding: 20, dwarf_register: 20, units: [{ unit: U_X20, lanes: 1 }], aliases: [s4] } + - { id: 22, symbol: X21, name: x21, encoding: 21, dwarf_register: 21, units: [{ unit: U_X21, lanes: 1 }], aliases: [s5] } + - { id: 23, symbol: X22, name: x22, encoding: 22, dwarf_register: 22, units: [{ unit: U_X22, lanes: 1 }], aliases: [s6] } + - { id: 24, symbol: X23, name: x23, encoding: 23, dwarf_register: 23, units: [{ unit: U_X23, lanes: 1 }], aliases: [s7] } + - { id: 25, symbol: X24, name: x24, encoding: 24, dwarf_register: 24, units: [{ unit: U_X24, lanes: 1 }], aliases: [s8] } + - { id: 26, symbol: X25, name: x25, encoding: 25, dwarf_register: 25, units: [{ unit: U_X25, lanes: 1 }], aliases: [s9] } + - { id: 27, symbol: X26, name: x26, encoding: 26, dwarf_register: 26, units: [{ unit: U_X26, lanes: 1 }], aliases: [s10] } + - { id: 28, symbol: X27, name: x27, encoding: 27, dwarf_register: 27, units: [{ unit: U_X27, lanes: 1 }], aliases: [s11] } + - { id: 29, symbol: X28, name: x28, encoding: 28, dwarf_register: 28, units: [{ unit: U_X28, lanes: 1 }], aliases: [t3] } + - { id: 30, symbol: X29, name: x29, encoding: 29, dwarf_register: 29, units: [{ unit: U_X29, lanes: 1 }], aliases: [t4] } + - { id: 31, symbol: X30, name: x30, encoding: 30, dwarf_register: 30, units: [{ unit: U_X30, lanes: 1 }], aliases: [t5] } + - { id: 32, symbol: X31, name: x31, encoding: 31, dwarf_register: 31, units: [{ unit: U_X31, lanes: 1 }], aliases: [t6] } + - { id: 33, symbol: F0_D, name: f0_d, encoding: 0, dwarf_register: 32, units: [{ unit: U_F0, lanes: 1 }], aliases: [ft0] } + - { id: 34, symbol: F1_D, name: f1_d, encoding: 1, dwarf_register: 33, units: [{ unit: U_F1, lanes: 1 }], aliases: [ft1] } + - { id: 35, symbol: F2_D, name: f2_d, encoding: 2, dwarf_register: 34, units: [{ unit: U_F2, lanes: 1 }], aliases: [ft2] } + - { id: 36, symbol: F3_D, name: f3_d, encoding: 3, dwarf_register: 35, units: [{ unit: U_F3, lanes: 1 }], aliases: [ft3] } + - { id: 37, symbol: F4_D, name: f4_d, encoding: 4, dwarf_register: 36, units: [{ unit: U_F4, lanes: 1 }], aliases: [ft4] } + - { id: 38, symbol: F5_D, name: f5_d, encoding: 5, dwarf_register: 37, units: [{ unit: U_F5, lanes: 1 }], aliases: [ft5] } + - { id: 39, symbol: F6_D, name: f6_d, encoding: 6, dwarf_register: 38, units: [{ unit: U_F6, lanes: 1 }], aliases: [ft6] } + - { id: 40, symbol: F7_D, name: f7_d, encoding: 7, dwarf_register: 39, units: [{ unit: U_F7, lanes: 1 }], aliases: [ft7] } + - { id: 41, symbol: F8_D, name: f8_d, encoding: 8, dwarf_register: 40, units: [{ unit: U_F8, lanes: 1 }], aliases: [fs0] } + - { id: 42, symbol: F9_D, name: f9_d, encoding: 9, dwarf_register: 41, units: [{ unit: U_F9, lanes: 1 }], aliases: [fs1] } + - { id: 43, symbol: F10_D, name: f10_d, encoding: 10, dwarf_register: 42, units: [{ unit: U_F10, lanes: 1 }], aliases: [fa0] } + - { id: 44, symbol: F11_D, name: f11_d, encoding: 11, dwarf_register: 43, units: [{ unit: U_F11, lanes: 1 }], aliases: [fa1] } + - { id: 45, symbol: F12_D, name: f12_d, encoding: 12, dwarf_register: 44, units: [{ unit: U_F12, lanes: 1 }], aliases: [fa2] } + - { id: 46, symbol: F13_D, name: f13_d, encoding: 13, dwarf_register: 45, units: [{ unit: U_F13, lanes: 1 }], aliases: [fa3] } + - { id: 47, symbol: F14_D, name: f14_d, encoding: 14, dwarf_register: 46, units: [{ unit: U_F14, lanes: 1 }], aliases: [fa4] } + - { id: 48, symbol: F15_D, name: f15_d, encoding: 15, dwarf_register: 47, units: [{ unit: U_F15, lanes: 1 }], aliases: [fa5] } + - { id: 49, symbol: F16_D, name: f16_d, encoding: 16, dwarf_register: 48, units: [{ unit: U_F16, lanes: 1 }], aliases: [fa6] } + - { id: 50, symbol: F17_D, name: f17_d, encoding: 17, dwarf_register: 49, units: [{ unit: U_F17, lanes: 1 }], aliases: [fa7] } + - { id: 51, symbol: F18_D, name: f18_d, encoding: 18, dwarf_register: 50, units: [{ unit: U_F18, lanes: 1 }], aliases: [fs2] } + - { id: 52, symbol: F19_D, name: f19_d, encoding: 19, dwarf_register: 51, units: [{ unit: U_F19, lanes: 1 }], aliases: [fs3] } + - { id: 53, symbol: F20_D, name: f20_d, encoding: 20, dwarf_register: 52, units: [{ unit: U_F20, lanes: 1 }], aliases: [fs4] } + - { id: 54, symbol: F21_D, name: f21_d, encoding: 21, dwarf_register: 53, units: [{ unit: U_F21, lanes: 1 }], aliases: [fs5] } + - { id: 55, symbol: F22_D, name: f22_d, encoding: 22, dwarf_register: 54, units: [{ unit: U_F22, lanes: 1 }], aliases: [fs6] } + - { id: 56, symbol: F23_D, name: f23_d, encoding: 23, dwarf_register: 55, units: [{ unit: U_F23, lanes: 1 }], aliases: [fs7] } + - { id: 57, symbol: F24_D, name: f24_d, encoding: 24, dwarf_register: 56, units: [{ unit: U_F24, lanes: 1 }], aliases: [fs8] } + - { id: 58, symbol: F25_D, name: f25_d, encoding: 25, dwarf_register: 57, units: [{ unit: U_F25, lanes: 1 }], aliases: [fs9] } + - { id: 59, symbol: F26_D, name: f26_d, encoding: 26, dwarf_register: 58, units: [{ unit: U_F26, lanes: 1 }], aliases: [fs10] } + - { id: 60, symbol: F27_D, name: f27_d, encoding: 27, dwarf_register: 59, units: [{ unit: U_F27, lanes: 1 }], aliases: [fs11] } + - { id: 61, symbol: F28_D, name: f28_d, encoding: 28, dwarf_register: 60, units: [{ unit: U_F28, lanes: 1 }], aliases: [ft8] } + - { id: 62, symbol: F29_D, name: f29_d, encoding: 29, dwarf_register: 61, units: [{ unit: U_F29, lanes: 1 }], aliases: [ft9] } + - { id: 63, symbol: F30_D, name: f30_d, encoding: 30, dwarf_register: 62, units: [{ unit: U_F30, lanes: 1 }], aliases: [ft10] } + - { id: 64, symbol: F31_D, name: f31_d, encoding: 31, dwarf_register: 63, units: [{ unit: U_F31, lanes: 1 }], aliases: [ft11] } + - { id: 65, symbol: F0_F, name: f0_f, encoding: 0, dwarf_register: 32, units: [{ unit: U_F0, lanes: 1 }] } + - { id: 66, symbol: F1_F, name: f1_f, encoding: 1, dwarf_register: 33, units: [{ unit: U_F1, lanes: 1 }] } + - { id: 67, symbol: F2_F, name: f2_f, encoding: 2, dwarf_register: 34, units: [{ unit: U_F2, lanes: 1 }] } + - { id: 68, symbol: F3_F, name: f3_f, encoding: 3, dwarf_register: 35, units: [{ unit: U_F3, lanes: 1 }] } + - { id: 69, symbol: F4_F, name: f4_f, encoding: 4, dwarf_register: 36, units: [{ unit: U_F4, lanes: 1 }] } + - { id: 70, symbol: F5_F, name: f5_f, encoding: 5, dwarf_register: 37, units: [{ unit: U_F5, lanes: 1 }] } + - { id: 71, symbol: F6_F, name: f6_f, encoding: 6, dwarf_register: 38, units: [{ unit: U_F6, lanes: 1 }] } + - { id: 72, symbol: F7_F, name: f7_f, encoding: 7, dwarf_register: 39, units: [{ unit: U_F7, lanes: 1 }] } + - { id: 73, symbol: F8_F, name: f8_f, encoding: 8, dwarf_register: 40, units: [{ unit: U_F8, lanes: 1 }] } + - { id: 74, symbol: F9_F, name: f9_f, encoding: 9, dwarf_register: 41, units: [{ unit: U_F9, lanes: 1 }] } + - { id: 75, symbol: F10_F, name: f10_f, encoding: 10, dwarf_register: 42, units: [{ unit: U_F10, lanes: 1 }] } + - { id: 76, symbol: F11_F, name: f11_f, encoding: 11, dwarf_register: 43, units: [{ unit: U_F11, lanes: 1 }] } + - { id: 77, symbol: F12_F, name: f12_f, encoding: 12, dwarf_register: 44, units: [{ unit: U_F12, lanes: 1 }] } + - { id: 78, symbol: F13_F, name: f13_f, encoding: 13, dwarf_register: 45, units: [{ unit: U_F13, lanes: 1 }] } + - { id: 79, symbol: F14_F, name: f14_f, encoding: 14, dwarf_register: 46, units: [{ unit: U_F14, lanes: 1 }] } + - { id: 80, symbol: F15_F, name: f15_f, encoding: 15, dwarf_register: 47, units: [{ unit: U_F15, lanes: 1 }] } + - { id: 81, symbol: F16_F, name: f16_f, encoding: 16, dwarf_register: 48, units: [{ unit: U_F16, lanes: 1 }] } + - { id: 82, symbol: F17_F, name: f17_f, encoding: 17, dwarf_register: 49, units: [{ unit: U_F17, lanes: 1 }] } + - { id: 83, symbol: F18_F, name: f18_f, encoding: 18, dwarf_register: 50, units: [{ unit: U_F18, lanes: 1 }] } + - { id: 84, symbol: F19_F, name: f19_f, encoding: 19, dwarf_register: 51, units: [{ unit: U_F19, lanes: 1 }] } + - { id: 85, symbol: F20_F, name: f20_f, encoding: 20, dwarf_register: 52, units: [{ unit: U_F20, lanes: 1 }] } + - { id: 86, symbol: F21_F, name: f21_f, encoding: 21, dwarf_register: 53, units: [{ unit: U_F21, lanes: 1 }] } + - { id: 87, symbol: F22_F, name: f22_f, encoding: 22, dwarf_register: 54, units: [{ unit: U_F22, lanes: 1 }] } + - { id: 88, symbol: F23_F, name: f23_f, encoding: 23, dwarf_register: 55, units: [{ unit: U_F23, lanes: 1 }] } + - { id: 89, symbol: F24_F, name: f24_f, encoding: 24, dwarf_register: 56, units: [{ unit: U_F24, lanes: 1 }] } + - { id: 90, symbol: F25_F, name: f25_f, encoding: 25, dwarf_register: 57, units: [{ unit: U_F25, lanes: 1 }] } + - { id: 91, symbol: F26_F, name: f26_f, encoding: 26, dwarf_register: 58, units: [{ unit: U_F26, lanes: 1 }] } + - { id: 92, symbol: F27_F, name: f27_f, encoding: 27, dwarf_register: 59, units: [{ unit: U_F27, lanes: 1 }] } + - { id: 93, symbol: F28_F, name: f28_f, encoding: 28, dwarf_register: 60, units: [{ unit: U_F28, lanes: 1 }] } + - { id: 94, symbol: F29_F, name: f29_f, encoding: 29, dwarf_register: 61, units: [{ unit: U_F29, lanes: 1 }] } + - { id: 95, symbol: F30_F, name: f30_f, encoding: 30, dwarf_register: 62, units: [{ unit: U_F30, lanes: 1 }] } + - { id: 96, symbol: F31_F, name: f31_f, encoding: 31, dwarf_register: 63, units: [{ unit: U_F31, lanes: 1 }] } + - { id: 97, symbol: FFLAGS, name: fflags, encoding: 0, dwarf_register: 65, units: [{ unit: U_FFLAGS, lanes: 1 }], artificial: true, reserved: true } + - { id: 98, symbol: FRM, name: frm, encoding: 0, dwarf_register: 66, units: [{ unit: U_FRM, lanes: 1 }], artificial: true, reserved: true } + - { id: 99, symbol: V0, name: v0, encoding: 0, dwarf_register: 96, units: [{ unit: U_V0, lanes: 1 }] } + - { id: 100, symbol: V1, name: v1, encoding: 1, dwarf_register: 97, units: [{ unit: U_V1, lanes: 1 }] } + - { id: 101, symbol: V2, name: v2, encoding: 2, dwarf_register: 98, units: [{ unit: U_V2, lanes: 1 }] } + - { id: 102, symbol: V3, name: v3, encoding: 3, dwarf_register: 99, units: [{ unit: U_V3, lanes: 1 }] } + - { id: 103, symbol: V4, name: v4, encoding: 4, dwarf_register: 100, units: [{ unit: U_V4, lanes: 1 }] } + - { id: 104, symbol: V5, name: v5, encoding: 5, dwarf_register: 101, units: [{ unit: U_V5, lanes: 1 }] } + - { id: 105, symbol: V6, name: v6, encoding: 6, dwarf_register: 102, units: [{ unit: U_V6, lanes: 1 }] } + - { id: 106, symbol: V7, name: v7, encoding: 7, dwarf_register: 103, units: [{ unit: U_V7, lanes: 1 }] } + - { id: 107, symbol: V8, name: v8, encoding: 8, dwarf_register: 104, units: [{ unit: U_V8, lanes: 1 }] } + - { id: 108, symbol: V9, name: v9, encoding: 9, dwarf_register: 105, units: [{ unit: U_V9, lanes: 1 }] } + - { id: 109, symbol: V10, name: v10, encoding: 10, dwarf_register: 106, units: [{ unit: U_V10, lanes: 1 }] } + - { id: 110, symbol: V11, name: v11, encoding: 11, dwarf_register: 107, units: [{ unit: U_V11, lanes: 1 }] } + - { id: 111, symbol: V12, name: v12, encoding: 12, dwarf_register: 108, units: [{ unit: U_V12, lanes: 1 }] } + - { id: 112, symbol: V13, name: v13, encoding: 13, dwarf_register: 109, units: [{ unit: U_V13, lanes: 1 }] } + - { id: 113, symbol: V14, name: v14, encoding: 14, dwarf_register: 110, units: [{ unit: U_V14, lanes: 1 }] } + - { id: 114, symbol: V15, name: v15, encoding: 15, dwarf_register: 111, units: [{ unit: U_V15, lanes: 1 }] } + - { id: 115, symbol: V16, name: v16, encoding: 16, dwarf_register: 112, units: [{ unit: U_V16, lanes: 1 }] } + - { id: 116, symbol: V17, name: v17, encoding: 17, dwarf_register: 113, units: [{ unit: U_V17, lanes: 1 }] } + - { id: 117, symbol: V18, name: v18, encoding: 18, dwarf_register: 114, units: [{ unit: U_V18, lanes: 1 }] } + - { id: 118, symbol: V19, name: v19, encoding: 19, dwarf_register: 115, units: [{ unit: U_V19, lanes: 1 }] } + - { id: 119, symbol: V20, name: v20, encoding: 20, dwarf_register: 116, units: [{ unit: U_V20, lanes: 1 }] } + - { id: 120, symbol: V21, name: v21, encoding: 21, dwarf_register: 117, units: [{ unit: U_V21, lanes: 1 }] } + - { id: 121, symbol: V22, name: v22, encoding: 22, dwarf_register: 118, units: [{ unit: U_V22, lanes: 1 }] } + - { id: 122, symbol: V23, name: v23, encoding: 23, dwarf_register: 119, units: [{ unit: U_V23, lanes: 1 }] } + - { id: 123, symbol: V24, name: v24, encoding: 24, dwarf_register: 120, units: [{ unit: U_V24, lanes: 1 }] } + - { id: 124, symbol: V25, name: v25, encoding: 25, dwarf_register: 121, units: [{ unit: U_V25, lanes: 1 }] } + - { id: 125, symbol: V26, name: v26, encoding: 26, dwarf_register: 122, units: [{ unit: U_V26, lanes: 1 }] } + - { id: 126, symbol: V27, name: v27, encoding: 27, dwarf_register: 123, units: [{ unit: U_V27, lanes: 1 }] } + - { id: 127, symbol: V28, name: v28, encoding: 28, dwarf_register: 124, units: [{ unit: U_V28, lanes: 1 }] } + - { id: 128, symbol: V29, name: v29, encoding: 29, dwarf_register: 125, units: [{ unit: U_V29, lanes: 1 }] } + - { id: 129, symbol: V30, name: v30, encoding: 30, dwarf_register: 126, units: [{ unit: U_V30, lanes: 1 }] } + - { id: 130, symbol: V31, name: v31, encoding: 31, dwarf_register: 127, units: [{ unit: U_V31, lanes: 1 }] } + +register_banks: + - { id: 1, symbol: GPR, name: GPRB, maximum_size_bits: 64 } + - { id: 2, symbol: FPR, name: FPRB, maximum_size_bits: 64 } + - { id: 3, symbol: CSR, name: CSRB, maximum_size_bits: 32 } + - { id: 4, symbol: VR, name: VRB, maximum_size_bits: 512 } + +register_classes: + - + id: 1 + symbol: GPR + name: GPR + bank: GPR + size_bits: 64 + spill_size_bits: 64 + spill_alignment_bits: 64 + lanes: 1 + registers: [X0, X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31] + allocation_order: [X5, X6, X7, X28, X29, X30, X31, X10, X11, X12, X13, X14, X15, X16, X17, X8, X9, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X1] + - + id: 2 + symbol: GPRC + name: GPRC + bank: GPR + size_bits: 64 + spill_size_bits: 64 + spill_alignment_bits: 64 + lanes: 1 + registers: [X8, X9, X10, X11, X12, X13, X14, X15] + allocation_order: [X10, X11, X12, X13, X14, X15, X8, X9] + - + id: 3 + symbol: FPR64 + name: FPR64 + bank: FPR + size_bits: 64 + spill_size_bits: 64 + spill_alignment_bits: 64 + lanes: 1 + registers: [F0_D, F1_D, F2_D, F3_D, F4_D, F5_D, F6_D, F7_D, F8_D, F9_D, F10_D, F11_D, F12_D, F13_D, F14_D, F15_D, F16_D, F17_D, F18_D, F19_D, F20_D, F21_D, F22_D, F23_D, F24_D, F25_D, F26_D, F27_D, F28_D, F29_D, F30_D, F31_D] + allocation_order: [F10_D, F11_D, F12_D, F13_D, F14_D, F15_D, F16_D, F17_D, F0_D, F1_D, F2_D, F3_D, F4_D, F5_D, F6_D, F7_D, F28_D, F29_D, F30_D, F31_D, F8_D, F9_D, F18_D, F19_D, F20_D, F21_D, F22_D, F23_D, F24_D, F25_D, F26_D, F27_D] + - + id: 4 + symbol: FPR64C + name: FPR64C + bank: FPR + size_bits: 64 + spill_size_bits: 64 + spill_alignment_bits: 64 + lanes: 1 + registers: [F8_D, F9_D, F10_D, F11_D, F12_D, F13_D, F14_D, F15_D] + allocation_order: [F10_D, F11_D, F12_D, F13_D, F14_D, F15_D, F8_D, F9_D] + - + id: 5 + symbol: FPR32 + name: FPR32 + bank: FPR + size_bits: 32 + spill_size_bits: 32 + spill_alignment_bits: 32 + lanes: 1 + registers: [F0_F, F1_F, F2_F, F3_F, F4_F, F5_F, F6_F, F7_F, F8_F, F9_F, F10_F, F11_F, F12_F, F13_F, F14_F, F15_F, F16_F, F17_F, F18_F, F19_F, F20_F, F21_F, F22_F, F23_F, F24_F, F25_F, F26_F, F27_F, F28_F, F29_F, F30_F, F31_F] + allocation_order: [F10_F, F11_F, F12_F, F13_F, F14_F, F15_F, F16_F, F17_F, F0_F, F1_F, F2_F, F3_F, F4_F, F5_F, F6_F, F7_F, F28_F, F29_F, F30_F, F31_F, F8_F, F9_F, F18_F, F19_F, F20_F, F21_F, F22_F, F23_F, F24_F, F25_F, F26_F, F27_F] + - + id: 6 + symbol: FPR32C + name: FPR32C + bank: FPR + size_bits: 32 + spill_size_bits: 32 + spill_alignment_bits: 32 + lanes: 1 + registers: [F8_F, F9_F, F10_F, F11_F, F12_F, F13_F, F14_F, F15_F] + allocation_order: [F10_F, F11_F, F12_F, F13_F, F14_F, F15_F, F8_F, F9_F] + - + id: 7 + symbol: GPR_NX0 + name: GPR_NX0 + bank: GPR + size_bits: 64 + spill_size_bits: 64 + spill_alignment_bits: 64 + lanes: 1 + registers: [X1, X2, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31] + allocation_order: [X5, X6, X7, X28, X29, X30, X31, X10, X11, X12, X13, X14, X15, X16, X17, X8, X9, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X1] + - + id: 8 + symbol: GPR_NX0_NX2 + name: GPR_NX0_NX2 + bank: GPR + size_bits: 64 + spill_size_bits: 64 + spill_alignment_bits: 64 + lanes: 1 + registers: [X1, X3, X4, X5, X6, X7, X8, X9, X10, X11, X12, X13, X14, X15, X16, X17, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X28, X29, X30, X31] + allocation_order: [X5, X6, X7, X28, X29, X30, X31, X10, X11, X12, X13, X14, X15, X16, X17, X8, X9, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, X1] + - + id: 9 + symbol: FFLAGS + name: FFLAGS + bank: CSR + size_bits: 32 + spill_size_bits: 32 + spill_alignment_bits: 32 + lanes: 1 + registers: [FFLAGS] + allocation_order: [] + allocatable: false + - + id: 10 + symbol: FRM + name: FRM + bank: CSR + size_bits: 32 + spill_size_bits: 32 + spill_alignment_bits: 32 + lanes: 1 + registers: [FRM] + allocation_order: [] + allocatable: false + - + id: 11 + symbol: VR + name: VR + bank: VR + size_bits: 64 + spill_size_bits: 64 + spill_alignment_bits: 64 + lanes: 1 + registers: [V0, V1, V2, V3, V4, V5, V6, V7, V8, V9, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24, V25, V26, V27, V28, V29, V30, V31] + allocation_order: [] + allocatable: false + +register_masks: + - + name: CSR_ILP32_LP64 + preserved: [X1, X8, X9, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27] + - + name: CSR_ILP32D_LP64D + preserved: [X1, X8, X9, X18, X19, X20, X21, X22, X23, X24, X25, X26, X27, F8_D, F9_D, F18_D, F19_D, F20_D, F21_D, F22_D, F23_D, F24_D, F25_D, F26_D, F27_D, F8_F, F9_F, F18_F, F19_F, F20_F, F21_F, F22_F, F23_F, F24_F, F25_F, F26_F, F27_F] + +mir_operand_flags: + direct_mask: 127 + direct: + - { name: riscv-call, value: 1 } + - { name: riscv-pcrel-hi, value: 2 } + - { name: riscv-pcrel-lo, value: 4 } + - { name: riscv-copy-f32, value: 8 } + - { name: riscv-copy-f64, value: 16 } + - { name: riscv-hi, value: 32 } + - { name: riscv-lo, value: 64 } + bitmask: [] diff --git a/backend/utils/TableGen/CMakeLists.txt b/backend/utils/TableGen/CMakeLists.txt index 45b4bff..60fc769 100644 --- a/backend/utils/TableGen/CMakeLists.txt +++ b/backend/utils/TableGen/CMakeLists.txt @@ -5,9 +5,11 @@ set( AsmWriterEmitter.cpp CallingConvEmitter.cpp CodeEmitterGen.cpp + GlobalISelEmitter.cpp Common/CodeGenInstruction.cpp Common/CodeGenRegisters.cpp Common/CodeGenSchedule.cpp + Common/CodeGenSelection.cpp Common/CodeGenTarget.cpp InstrInfoEmitter.cpp RegisterBankEmitter.cpp diff --git a/backend/utils/TableGen/Common/CodeGenSelection.cpp b/backend/utils/TableGen/Common/CodeGenSelection.cpp new file mode 100644 index 0000000..0216136 --- /dev/null +++ b/backend/utils/TableGen/Common/CodeGenSelection.cpp @@ -0,0 +1,183 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "CodeGenTarget.h" +#include "rcc/CodeGen/GenericOpcodes.h" +#include "rcc/CodeGen/LowLevelType.h" + +#include <algorithm> +#include <cstdint> +#include <optional> +#include <ranges> +#include <string_view> +#include <unordered_set> +#include <utility> + +namespace rcc::targetgen { +namespace { + +[[nodiscard]] std::optional<std::uint32_t> genericOpcodeValue(std::string_view Symbol) { +#define RCC_CORE_OPCODE(Name) \ + if (Symbol == #Name) \ + return static_cast<std::uint32_t>(GenericOpcode::Name); +#define RCC_GENERIC_OPCODE(Name) RCC_CORE_OPCODE(Name) +#include "rcc/CodeGen/GenericOpcode.def" +#undef RCC_GENERIC_OPCODE +#undef RCC_CORE_OPCODE + return std::nullopt; +} + +[[nodiscard]] const NormalizedInstruction * +findInstructionBySymbol(const NormalizedTargetModel &Model, std::string_view Symbol) { + const auto Position = + std::ranges::find(Model.Instructions, Symbol, &NormalizedInstruction::Symbol); + return Position == Model.Instructions.end() ? nullptr : &*Position; +} + +[[nodiscard]] std::optional<std::uint32_t> resolveOpcode(const NormalizedTargetModel &Model, + std::string_view Symbol) { + if (const NormalizedInstruction *Instruction = findInstructionBySymbol(Model, Symbol)) + return Instruction->ID; + return genericOpcodeValue(Symbol); +} + +[[nodiscard]] bool isRegisterOperand(const NormalizedInstruction &Instruction, + std::uint32_t Index) { + return Index < Instruction.Operands.size() && + std::ranges::contains(Instruction.Operands[Index].Kinds, "Register"); +} + +} // namespace + +bool CodeGenTarget::normalizeSelectionRules(NormalizedTargetModel &Result) { + std::unordered_set<std::string> Symbols; + for (const SourceSelectionRule &Rule : Input.SelectionRules) { + const auto MatchOpcode = resolveOpcode(Result, Rule.MatchOpcodeSymbol); + const auto ResultOpcode = resolveOpcode(Result, Rule.ResultOpcodeSymbol); + const NormalizedInstruction *MatchInstruction = + findInstructionBySymbol(Result, Rule.MatchOpcodeSymbol); + const NormalizedInstruction *ResultInstruction = + findInstructionBySymbol(Result, Rule.ResultOpcodeSymbol); + if (!isIdentifier(Rule.Symbol) || !Symbols.insert(Rule.Symbol).second || !MatchOpcode || + !ResultOpcode) { + fail(Rule.Range, + "selection rules require a unique identifier and declared match/result opcodes"); + return false; + } + if (MatchInstruction != nullptr && !std::ranges::contains(MatchInstruction->Flags, "Generic")) { + fail(Rule.Range, "selection rule match opcode must be generic"); + return false; + } + if (isGenericOpcode(Opcode::fromValue(*ResultOpcode)) || + (ResultInstruction != nullptr && + std::ranges::contains(ResultInstruction->Flags, "Generic"))) { + fail(Rule.Range, "selection rule result opcode must not be generic"); + return false; + } + if (MatchInstruction != nullptr && ResultInstruction != nullptr && + ResultInstruction->Operands.size() != + MatchInstruction->Operands.size() + Rule.AppendedImmediates.size()) { + fail(Rule.Range, "selection rule result opcode has an incompatible operand count"); + return false; + } + + const auto NormalizeType = [this](const SourceSelectionTypePredicate &Source) + -> std::optional<NormalizedSelectionTypePredicate> { + NormalizedSelectionTypeKind Kind = NormalizedSelectionTypeKind::Any; + if (Source.Kind == "scalar") + Kind = NormalizedSelectionTypeKind::Scalar; + else if (Source.Kind == "pointer") + Kind = NormalizedSelectionTypeKind::Pointer; + else if (Source.Kind != "any") { + fail(Source.Range, "selection type kind must be 'any', 'scalar', or 'pointer'"); + return std::nullopt; + } + if (Source.Bits > LowLevelType::MaxBitWidth || + (Kind != NormalizedSelectionTypeKind::Any && Source.Bits == 0)) { + fail(Source.Range, "selection type bit width is invalid for its kind"); + return std::nullopt; + } + return NormalizedSelectionTypePredicate{.Kind = Kind, .Bits = Source.Bits}; + }; + + NormalizedSelectionRule Normalized; + Normalized.Symbol = Rule.Symbol; + Normalized.Priority = Rule.Priority; + Normalized.Specificity = 1; + Normalized.MatchOpcode = *MatchOpcode; + Normalized.ResultOpcode = *ResultOpcode; + Normalized.AppendedImmediates = Rule.AppendedImmediates; + if (Rule.ResultType) { + auto Type = NormalizeType(*Rule.ResultType); + if (!Type) + return false; + if (MatchInstruction != nullptr && !isRegisterOperand(*MatchInstruction, 0)) { + fail(Rule.ResultType->Range, + "selection result type predicate requires register operand zero"); + return false; + } + Normalized.ResultType = *Type; + ++Normalized.Specificity; + } + + std::unordered_set<std::uint32_t> TypeOperands; + for (const SourceSelectionOperandTypePredicate &Predicate : Rule.OperandTypes) { + auto Type = NormalizeType(Predicate.Type); + if (!Type) + return false; + if (!TypeOperands.insert(Predicate.OperandIndex).second || + (MatchInstruction != nullptr && + !isRegisterOperand(*MatchInstruction, Predicate.OperandIndex))) { + fail(Predicate.Range, + "selection operand type predicates require distinct register operands"); + return false; + } + Normalized.OperandTypes.push_back({.OperandIndex = Predicate.OperandIndex, .Type = *Type}); + ++Normalized.Specificity; + } + + std::unordered_set<std::uint32_t> BankOperands; + for (const SourceSelectionOperandBankPredicate &Predicate : Rule.OperandBanks) { + const auto Bank = BankBySymbol.find(Predicate.BankSymbol); + if (!BankOperands.insert(Predicate.OperandIndex).second || Bank == BankBySymbol.end() || + (MatchInstruction != nullptr && + !isRegisterOperand(*MatchInstruction, Predicate.OperandIndex))) { + fail(Predicate.Range, + "selection operand bank predicates require distinct register operands and declared " + "banks"); + return false; + } + Normalized.OperandBanks.push_back( + {.OperandIndex = Predicate.OperandIndex, .Bank = Bank->second}); + ++Normalized.Specificity; + } + + std::unordered_set<std::uint32_t> ClassOperands; + for (const SourceSelectionOperandClassPredicate &Predicate : Rule.OperandClasses) { + const auto RegClass = ClassBySymbol.find(Predicate.ClassSymbol); + if (!ClassOperands.insert(Predicate.OperandIndex).second || RegClass == ClassBySymbol.end() || + (MatchInstruction != nullptr && + !isRegisterOperand(*MatchInstruction, Predicate.OperandIndex))) { + fail(Predicate.Range, + "selection operand class predicates require distinct register operands and declared " + "classes"); + return false; + } + Normalized.OperandClasses.push_back( + {.OperandIndex = Predicate.OperandIndex, .RegClass = RegClass->second}); + ++Normalized.Specificity; + } + Result.SelectionRules.push_back(std::move(Normalized)); + } + + std::ranges::sort(Result.SelectionRules, + [](const NormalizedSelectionRule &Left, const NormalizedSelectionRule &Right) { + if (Left.Priority != Right.Priority) + return Left.Priority > Right.Priority; + if (Left.Specificity != Right.Specificity) + return Left.Specificity > Right.Specificity; + return Left.Symbol < Right.Symbol; + }); + return true; +} + +} // namespace rcc::targetgen diff --git a/backend/utils/TableGen/Common/CodeGenTarget.cpp b/backend/utils/TableGen/Common/CodeGenTarget.cpp index 89fea08..6d2e47e 100644 --- a/backend/utils/TableGen/Common/CodeGenTarget.cpp +++ b/backend/utils/TableGen/Common/CodeGenTarget.cpp @@ -35,7 +35,8 @@ CodeGenTarget::CodeGenTarget(const DescriptionAST &Input, std::string SourceName !normalizeMIROperandFlags(Result) || !normalizeCallingConventions(Result) || !normalizeNamedOperands(Result) || !normalizeImmediatePredicates(Result) || !normalizeSchedulingClasses(Result) || !normalizeEncodingCategories(Result) || - !normalizeAssemblyFormats(Result) || !normalizeInstructions(Result)) { + !normalizeAssemblyFormats(Result) || !normalizeInstructions(Result) || + !normalizeSelectionRules(Result)) { return std::nullopt; } std::ranges::sort(Result.RegisterUnits, {}, &SourceRegisterUnit::ID); @@ -214,6 +215,7 @@ DescriptionGenerationResult generateDescription(const std::string &SourceName, emitSubtarget(*Model) + emitCodeEmitter(*Model) + emitAssemblyWriter(*Model) + emitSearchableTables(*Model) + emitCallingConventions(*Model), + .GlobalISel = emitGlobalISel(*Model, DisplayName), }, .Diagnostics = {}, }; diff --git a/backend/utils/TableGen/Common/CodeGenTarget.h b/backend/utils/TableGen/Common/CodeGenTarget.h index cbddd4a..929d3e7 100644 --- a/backend/utils/TableGen/Common/CodeGenTarget.h +++ b/backend/utils/TableGen/Common/CodeGenTarget.h @@ -163,6 +163,45 @@ struct NormalizedInstruction final { std::string Deadline; }; +enum class NormalizedSelectionTypeKind : std::uint8_t { + Any, + Scalar, + Pointer, +}; + +struct NormalizedSelectionTypePredicate final { + NormalizedSelectionTypeKind Kind = NormalizedSelectionTypeKind::Any; + std::uint32_t Bits = 0; +}; + +struct NormalizedSelectionOperandTypePredicate final { + std::uint32_t OperandIndex = 0; + NormalizedSelectionTypePredicate Type; +}; + +struct NormalizedSelectionOperandBankPredicate final { + std::uint32_t OperandIndex = 0; + std::uint32_t Bank = 0; +}; + +struct NormalizedSelectionOperandClassPredicate final { + std::uint32_t OperandIndex = 0; + std::uint32_t RegClass = 0; +}; + +struct NormalizedSelectionRule final { + std::string Symbol; + std::uint32_t Priority = 0; + std::uint32_t Specificity = 0; + std::uint32_t MatchOpcode = 0; + std::optional<NormalizedSelectionTypePredicate> ResultType; + std::vector<NormalizedSelectionOperandTypePredicate> OperandTypes; + std::vector<NormalizedSelectionOperandBankPredicate> OperandBanks; + std::vector<NormalizedSelectionOperandClassPredicate> OperandClasses; + std::uint32_t ResultOpcode = 0; + std::vector<std::int64_t> AppendedImmediates; +}; + struct NormalizedTargetModel final { SourceTarget Target; std::vector<SourceRegisterUnit> RegisterUnits; @@ -178,6 +217,7 @@ struct NormalizedTargetModel final { std::vector<NormalizedEncodingCategory> EncodingCategories; std::vector<NormalizedAssemblyFormat> AssemblyFormats; std::vector<NormalizedInstruction> Instructions; + std::vector<NormalizedSelectionRule> SelectionRules; }; [[nodiscard]] std::optional<std::string_view> @@ -219,6 +259,7 @@ private: normalizeImplicitRegisters(const std::vector<SourceImplicitRegister> &InputRegisters, bool IsDef, std::vector<NormalizedImplicitRegister> &Result); [[nodiscard]] bool normalizeInstructions(NormalizedTargetModel &Result); + [[nodiscard]] bool normalizeSelectionRules(NormalizedTargetModel &Result); const DescriptionAST &Input; std::string SourceName; diff --git a/backend/utils/TableGen/GlobalISelEmitter.cpp b/backend/utils/TableGen/GlobalISelEmitter.cpp new file mode 100644 index 0000000..1634eb3 --- /dev/null +++ b/backend/utils/TableGen/GlobalISelEmitter.cpp @@ -0,0 +1,96 @@ +// SPDX-License-Identifier: GPL-3.0-or-later + +#include "TableGenBackends.h" + +#include <cstddef> +#include <cstdint> +#include <ostream> +#include <sstream> +#include <string> +#include <string_view> + +namespace rcc::targetgen { +namespace { + +[[nodiscard]] std::string_view typeKindName(NormalizedSelectionTypeKind Kind) noexcept { + switch (Kind) { + case NormalizedSelectionTypeKind::Any: + return "Any"; + case NormalizedSelectionTypeKind::Scalar: + return "Scalar"; + case NormalizedSelectionTypeKind::Pointer: + return "Pointer"; + } + return "Any"; +} + +void emitInstruction(std::ostream &Output, std::string_view Opcode, std::uint32_t OperandIndex, + std::uint32_t Value = 0, std::string_view Auxiliary = "0", + std::int64_t Immediate = 0) { + Output << " {GIMatchTableOpcode::" << Opcode << ", " << OperandIndex << ", " << Value << ", " + << Auxiliary << ", " << Immediate << "},\n"; +} + +void emitTypePredicate(std::ostream &Output, std::uint32_t OperandIndex, + const NormalizedSelectionTypePredicate &Predicate) { + emitInstruction(Output, "CheckOperandType", OperandIndex, Predicate.Bits, + "static_cast<std::uint32_t>(GIMatchTypeKind::" + + std::string(typeKindName(Predicate.Kind)) + ")"); +} + +[[nodiscard]] std::size_t instructionCount(const NormalizedSelectionRule &Rule) noexcept { + return 3U + (Rule.ResultType ? 1U : 0U) + Rule.OperandTypes.size() + Rule.OperandBanks.size() + + Rule.OperandClasses.size() + Rule.AppendedImmediates.size(); +} + +} // namespace + +std::string emitGlobalISel(const NormalizedTargetModel &Model, std::string_view SourceName) { + std::size_t InstructionCount = 0; + for (const NormalizedSelectionRule &Rule : Model.SelectionRules) + InstructionCount += instructionCount(Rule); + + std::ostringstream Output; + Output << "// SPDX-License-Identifier: GPL-3.0-or-later\n\n"; + Output << "// This file is generated by rcc-tblgen from "; + appendQuoted(Output, SourceName); + Output << ". Do not edit it manually.\n\n"; + Output << "#ifdef GET_GLOBALISEL_MATCH_TABLE\n\n"; + Output << "constexpr std::array<GIMatchTableInstruction, " << InstructionCount + << "> GeneratedGlobalISelInstructions = {{\n"; + for (const NormalizedSelectionRule &Rule : Model.SelectionRules) { + emitInstruction(Output, "CheckOpcode", 0, Rule.MatchOpcode); + if (Rule.ResultType) + emitTypePredicate(Output, 0, *Rule.ResultType); + for (const NormalizedSelectionOperandTypePredicate &Predicate : Rule.OperandTypes) + emitTypePredicate(Output, Predicate.OperandIndex, Predicate.Type); + for (const NormalizedSelectionOperandBankPredicate &Predicate : Rule.OperandBanks) + emitInstruction(Output, "CheckOperandBank", Predicate.OperandIndex, Predicate.Bank); + for (const NormalizedSelectionOperandClassPredicate &Predicate : Rule.OperandClasses) + emitInstruction(Output, "CheckOperandClass", Predicate.OperandIndex, Predicate.RegClass); + emitInstruction(Output, "MutateOpcode", 0, Rule.ResultOpcode); + for (const std::int64_t Immediate : Rule.AppendedImmediates) + emitInstruction(Output, "AppendImmediate", 0, 0, "0", Immediate); + emitInstruction(Output, "Complete", 0); + } + Output << "}};\n\n"; + + Output << "constexpr std::array<GIMatchTableRule, " << Model.SelectionRules.size() + << "> GeneratedGlobalISelRules = {{\n"; + std::size_t FirstInstruction = 0; + for (const NormalizedSelectionRule &Rule : Model.SelectionRules) { + const std::size_t Count = instructionCount(Rule); + Output << " {"; + appendQuoted(Output, Rule.Symbol); + Output << ", " << Rule.Priority << ", " << FirstInstruction << ", " << Count << "},\n"; + FirstInstruction += Count; + } + Output << "}};\n\n"; + Output << "[[nodiscard]] constexpr GIMatchTable generatedGlobalISelMatchTable() noexcept {\n" + " return {GeneratedGlobalISelInstructions, GeneratedGlobalISelRules};\n" + "}\n\n"; + Output << "#endif // GET_GLOBALISEL_MATCH_TABLE\n"; + return Output.str(); +} + +} // namespace rcc::targetgen diff --git a/backend/utils/TableGen/TableGenBackends.h b/backend/utils/TableGen/TableGenBackends.h index 7835efb..a5f283e 100644 --- a/backend/utils/TableGen/TableGenBackends.h +++ b/backend/utils/TableGen/TableGenBackends.h @@ -17,6 +17,7 @@ struct GeneratedDescription final { std::string RegisterHeader; std::string InstructionHeader; std::string TargetTables; + std::string GlobalISel; }; struct DescriptionGenerationResult final { @@ -41,6 +42,8 @@ struct DescriptionGenerationResult final { [[nodiscard]] std::string emitAssemblyWriter(const NormalizedTargetModel &Model); [[nodiscard]] std::string emitSubtarget(const NormalizedTargetModel &Model); [[nodiscard]] std::string emitSearchableTables(const NormalizedTargetModel &Model); +[[nodiscard]] std::string emitGlobalISel(const NormalizedTargetModel &Model, + std::string_view SourceName); [[nodiscard]] DescriptionGenerationResult generateDescription(const std::string &SourceName, std::string SourceText); diff --git a/backend/utils/TableGen/rcc-tblgen.cpp b/backend/utils/TableGen/rcc-tblgen.cpp index 3e4e093..45690ee 100644 --- a/backend/utils/TableGen/rcc-tblgen.cpp +++ b/backend/utils/TableGen/rcc-tblgen.cpp @@ -3,38 +3,51 @@ #include "TableGenBackends.h" #include "rcc/Support/TextDiagnostic.h" +#include <cctype> #include <filesystem> #include <fstream> #include <iostream> #include <iterator> +#include <optional> #include <string> #include <string_view> +#include <unordered_map> +#include <vector> namespace { struct CommandLine final { - std::string InputPath; + std::vector<std::string> InputPaths; std::string RegisterHeaderPath; std::string InstructionHeaderPath; std::string TablesPath; + std::string GlobalISelPath; }; [[nodiscard]] bool parseCommandLine(int ArgumentCount, char *Arguments[], CommandLine &Result) { for (int Index = 1; Index < ArgumentCount; ++Index) { const std::string_view Argument(Arguments[Index]); - if (Argument == "--input" || Argument == "--register-header" || - Argument == "--instruction-header" || Argument == "--tables") { + if (Argument == "--input") { + if (Index + 1 >= ArgumentCount) { + std::cerr << "rcc-tblgen: missing value for " << Argument << '\n'; + return false; + } + Result.InputPaths.emplace_back(Arguments[++Index]); + continue; + } + if (Argument == "--register-header" || Argument == "--instruction-header" || + Argument == "--tables" || Argument == "--global-isel") { if (Index + 1 >= ArgumentCount) { std::cerr << "rcc-tblgen: missing value for " << Argument << '\n'; return false; } std::string *Destination = nullptr; - if (Argument == "--input") - Destination = &Result.InputPath; - else if (Argument == "--register-header") + if (Argument == "--register-header") Destination = &Result.RegisterHeaderPath; else if (Argument == "--instruction-header") Destination = &Result.InstructionHeaderPath; + else if (Argument == "--global-isel") + Destination = &Result.GlobalISelPath; else Destination = &Result.TablesPath; *Destination = Arguments[++Index]; @@ -43,12 +56,13 @@ struct CommandLine final { std::cerr << "rcc-tblgen: unknown argument '" << Argument << "'\n"; return false; } - if (!Result.InputPath.empty() && !Result.RegisterHeaderPath.empty() && - !Result.InstructionHeaderPath.empty() && !Result.TablesPath.empty()) { + if (!Result.InputPaths.empty() && !Result.RegisterHeaderPath.empty() && + !Result.InstructionHeaderPath.empty() && !Result.TablesPath.empty() && + !Result.GlobalISelPath.empty()) { return true; } - std::cerr << "usage: rcc-tblgen --input <file> --register-header <file> " - "--instruction-header <file> --tables <file>\n"; + std::cerr << "usage: rcc-tblgen --input <file> [--input <fragment>]... --register-header <file> " + "--instruction-header <file> --tables <file> --global-isel <file>\n"; return false; } @@ -74,6 +88,107 @@ struct CommandLine final { return false; } +struct SourceSection final { + std::string Name; + std::string Contents; + std::size_t HeaderSize = 0; +}; + +[[nodiscard]] bool isIdentifierCharacter(char Character) noexcept { + return std::isalnum(static_cast<unsigned char>(Character)) != 0 || Character == '_'; +} + +[[nodiscard]] std::optional<std::string_view> topLevelKey(std::string_view Line) noexcept { + if (Line.empty() || Line.front() == '#' || + (!std::isalpha(static_cast<unsigned char>(Line.front())) && Line.front() != '_')) { + return std::nullopt; + } + std::size_t End = 1; + while (End < Line.size() && isIdentifierCharacter(Line[End])) + ++End; + if (End == Line.size() || Line[End] != ':') + return std::nullopt; + return Line.substr(0, End); +} + +[[nodiscard]] std::vector<SourceSection> splitSections(std::string_view SourceText) { + std::vector<SourceSection> Result; + std::size_t SectionStart = 0; + std::size_t HeaderEnd = 0; + std::optional<std::string> SectionName; + std::size_t LineStart = 0; + while (LineStart < SourceText.size()) { + const std::size_t LineEnd = SourceText.find('\n', LineStart); + const std::size_t ContentEnd = LineEnd == std::string_view::npos ? SourceText.size() : LineEnd; + const std::string_view Line = SourceText.substr(LineStart, ContentEnd - LineStart); + if (const auto Key = topLevelKey(Line)) { + if (SectionName) { + Result.push_back({ + .Name = std::move(*SectionName), + .Contents = std::string(SourceText.substr(SectionStart, LineStart - SectionStart)), + .HeaderSize = HeaderEnd - SectionStart, + }); + } + SectionStart = LineStart; + HeaderEnd = LineEnd == std::string_view::npos ? SourceText.size() : LineEnd + 1U; + SectionName = std::string(*Key); + } + if (LineEnd == std::string_view::npos) + break; + LineStart = LineEnd + 1U; + } + if (SectionName) { + Result.push_back({ + .Name = std::move(*SectionName), + .Contents = std::string(SourceText.substr(SectionStart)), + .HeaderSize = HeaderEnd - SectionStart, + }); + } + return Result; +} + +[[nodiscard]] std::optional<std::string> +combineDescriptionSources(const std::vector<std::string> &Paths, + const std::vector<std::string> &Sources) { + std::vector<SourceSection> Result; + std::unordered_map<std::string, std::size_t> SectionIndex; + for (std::size_t Index = 0; Index < Sources.size(); ++Index) { + const std::vector<SourceSection> Sections = splitSections(Sources[Index]); + if (Sections.empty()) { + std::cerr << "rcc-tblgen: input '" << Paths[Index] + << "' does not contain a top-level description section\n"; + return std::nullopt; + } + for (const SourceSection &Section : Sections) { + const auto Position = SectionIndex.find(Section.Name); + if (Position == SectionIndex.end()) { + SectionIndex.emplace(Section.Name, Result.size()); + Result.push_back(Section); + continue; + } + if (Section.Name != "instructions" && Section.Name != "selection_rules") { + std::cerr << "rcc-tblgen: duplicate description section '" << Section.Name << "' in '" + << Paths[Index] << "'\n"; + return std::nullopt; + } + SourceSection &Existing = Result[Position->second]; + const std::string_view Body(Section.Contents.data() + Section.HeaderSize, + Section.Contents.size() - Section.HeaderSize); + if (!Existing.Contents.empty() && Existing.Contents.back() != '\n') + Existing.Contents.push_back('\n'); + Existing.Contents.append(Body); + } + } + + std::string Combined; + for (const SourceSection &Section : Result) { + if (!Combined.empty() && Combined.back() != '\n') + Combined.push_back('\n'); + Combined.append(Section.Contents); + } + return Combined; +} + } // namespace int main(int ArgumentCount, char *Arguments[]) { @@ -81,17 +196,23 @@ int main(int ArgumentCount, char *Arguments[]) { if (!parseCommandLine(ArgumentCount, Arguments, Command)) return 1; - std::ifstream Input(Command.InputPath, std::ios::binary); - if (!Input) { - std::cerr << "rcc-tblgen: cannot open input '" << Command.InputPath << "'\n"; - return 1; + std::vector<std::string> Sources; + Sources.reserve(Command.InputPaths.size()); + for (const std::string &InputPath : Command.InputPaths) { + std::ifstream Input(InputPath, std::ios::binary); + if (!Input) { + std::cerr << "rcc-tblgen: cannot open input '" << InputPath << "'\n"; + return 1; + } + Sources.emplace_back(std::istreambuf_iterator<char>(Input), std::istreambuf_iterator<char>()); } - const std::string SourceText{std::istreambuf_iterator<char>(Input), - std::istreambuf_iterator<char>()}; + const auto SourceText = combineDescriptionSources(Command.InputPaths, Sources); + if (!SourceText) + return 1; const rcc::targetgen::DescriptionGenerationResult Result = - rcc::targetgen::generateDescription(Command.InputPath, SourceText); + rcc::targetgen::generateDescription(Command.InputPaths.front(), *SourceText); if (!Result.succeeded()) { - const rcc::TextSource Source(Command.InputPath, SourceText); + const rcc::TextSource Source(Command.InputPaths.front(), *SourceText); for (const rcc::TextDiagnostic &Diagnostic : Result.Diagnostics) std::cerr << rcc::formatTextDiagnostic(Diagnostic, Source) << '\n'; return 1; @@ -104,7 +225,8 @@ int main(int ArgumentCount, char *Arguments[]) { const rcc::targetgen::GeneratedDescription &Output = Result.Output.value(); return writeFile(Command.RegisterHeaderPath, Output.RegisterHeader) && writeFile(Command.InstructionHeaderPath, Output.InstructionHeader) && - writeFile(Command.TablesPath, Output.TargetTables) + writeFile(Command.TablesPath, Output.TargetTables) && + writeFile(Command.GlobalISelPath, Output.GlobalISel) ? 0 : 1; } |
