diff options
| author | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-09 22:05:14 +0800 |
|---|---|---|
| committer | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-09 22:05:14 +0800 |
| commit | 3a57627e59ba18b6f9f9aae7bb60c390c0d3575a (patch) | |
| tree | 736ca062bfffbd68177a512dfe145b06c16d11b1 /backend/lib/Target/Description | |
| parent | 379ff50dcc7ccf977379aee68fa9d10f69065d23 (diff) | |
| download | rcc-project-3a57627e59ba18b6f9f9aae7bb60c390c0d3575a.tar.gz rcc-project-3a57627e59ba18b6f9f9aae7bb60c390c0d3575a.tar.xz | |
[MC] Implement RV64GC object emission
Diffstat (limited to 'backend/lib/Target/Description')
| -rw-r--r-- | backend/lib/Target/Description/TargetDescriptionGenerator.cpp | 30 |
1 files changed, 21 insertions, 9 deletions
diff --git a/backend/lib/Target/Description/TargetDescriptionGenerator.cpp b/backend/lib/Target/Description/TargetDescriptionGenerator.cpp index cd5ba97..dd3545b 100644 --- a/backend/lib/Target/Description/TargetDescriptionGenerator.cpp +++ b/backend/lib/Target/Description/TargetDescriptionGenerator.cpp @@ -198,6 +198,7 @@ struct SourceInstruction final { std::string Symbol; std::string Name; std::string AssemblyMnemonic; + std::optional<std::uint32_t> BinaryEncoding; std::vector<SourceOperand> Operands; std::uint32_t NumExplicitDefs = 0; bool Variadic = false; @@ -360,6 +361,7 @@ struct NormalizedInstruction final { std::string Symbol; std::string Name; std::string AssemblyMnemonic; + std::uint32_t BinaryEncoding = 0; std::vector<NormalizedOperand> Operands; std::uint32_t NumExplicitDefs = 0; bool Variadic = false; @@ -1476,10 +1478,11 @@ private: if (!requireMapping(Element, "instruction")) return false; if (!checkKeys(*Element, - {"id", "symbol", "name", "assembly_mnemonic", "operands", "num_explicit_defs", - "variadic", "implicit_defs", "implicit_uses", "allow_extra_implicit_operands", - "flags", "scheduling_class", "encoding_category", "assembly_format", - "requires_memory_operands", "owner", "deadline"}, + {"id", "symbol", "name", "assembly_mnemonic", "encoding", "operands", + "num_explicit_defs", "variadic", "implicit_defs", "implicit_uses", + "allow_extra_implicit_operands", "flags", "scheduling_class", + "encoding_category", "assembly_format", "requires_memory_operands", "owner", + "deadline"}, "instruction")) { return false; } @@ -1513,6 +1516,12 @@ private: return false; Instruction.AssemblyMnemonic = *Value; } + if (const yaml::Node *Encoding = optionalNode(*Element, "encoding")) { + const auto Value = unsignedInteger32(*Encoding, "instruction encoding"); + if (!Value) + return false; + Instruction.BinaryEncoding = Value; + } if (const yaml::Node *SchedulingClass = optionalNode(*Element, "scheduling_class")) { const auto Value = scalar(*SchedulingClass, "instruction scheduling_class"); if (!Value) @@ -2386,13 +2395,14 @@ private: std::unordered_set<std::string> Names; for (const SourceInstruction &Instruction : Input.Instructions) { const bool HasMnemonic = !Instruction.AssemblyMnemonic.empty(); + const bool HasBinaryEncoding = Instruction.BinaryEncoding.has_value(); const bool HasSchedulingClass = !Instruction.SchedulingClassSymbol.empty(); const bool HasEncodingCategory = !Instruction.EncodingCategorySymbol.empty(); const bool HasAssemblyFormat = !Instruction.AssemblyFormatSymbol.empty(); - const bool HasAllMachineFacts = - HasMnemonic && HasSchedulingClass && HasEncodingCategory && HasAssemblyFormat; - const bool HasAnyMachineFact = - HasMnemonic || HasSchedulingClass || HasEncodingCategory || HasAssemblyFormat; + const bool HasAllMachineFacts = HasMnemonic && HasBinaryEncoding && HasSchedulingClass && + HasEncodingCategory && HasAssemblyFormat; + const bool HasAnyMachineFact = HasMnemonic || HasBinaryEncoding || HasSchedulingClass || + HasEncodingCategory || HasAssemblyFormat; const bool IsPseudoSource = std::ranges::find(Instruction.Flags, "pseudo") != Instruction.Flags.end(); const bool IsTerminalEmissionSource = @@ -2432,6 +2442,7 @@ private: .Symbol = Instruction.Symbol, .Name = Instruction.Name, .AssemblyMnemonic = Instruction.AssemblyMnemonic, + .BinaryEncoding = Instruction.BinaryEncoding.value_or(0), .Operands = {}, .NumExplicitDefs = Instruction.NumExplicitDefs, .Variadic = Instruction.Variadic, @@ -2970,7 +2981,8 @@ void emitImmediatePredicate(std::ostream &Output, const NormalizedImmediatePredi continue; Output << " {Opcode::fromValue(" << Instruction.ID << "), "; appendQuoted(Output, Instruction.AssemblyMnemonic); - Output << ", AssemblyFormatID::fromValue(" << Instruction.AssemblyFormat << ")},\n"; + Output << ", AssemblyFormatID::fromValue(" << Instruction.AssemblyFormat << "), " + << Instruction.BinaryEncoding << "},\n"; } Output << "}};\n\n"; |
