From 3a57627e59ba18b6f9f9aae7bb60c390c0d3575a Mon Sep 17 00:00:00 2001 From: Richard-Qin-X Date: Sun, 9 Aug 2026 22:05:14 +0800 Subject: [MC] Implement RV64GC object emission --- .../Description/TargetDescriptionGenerator.cpp | 30 +++++++++++++++------- 1 file changed, 21 insertions(+), 9 deletions(-) (limited to 'backend/lib/Target/Description') 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 BinaryEncoding; std::vector 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 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 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"; -- cgit v1.2.3