From 97e5fbaa55b4672db36123c2425d05a4738452ab Mon Sep 17 00:00:00 2001 From: Richard-Qin-X Date: Fri, 14 Aug 2026 20:35:54 +0800 Subject: [GlobalISel] Match LLVM legalization value tracking --- backend/include/rcc/CodeGen/TargetDescription.h | 31 +++++++++++++++++++++---- 1 file changed, 26 insertions(+), 5 deletions(-) (limited to 'backend/include/rcc/CodeGen/TargetDescription.h') diff --git a/backend/include/rcc/CodeGen/TargetDescription.h b/backend/include/rcc/CodeGen/TargetDescription.h index 7e41a58..56d328e 100644 --- a/backend/include/rcc/CodeGen/TargetDescription.h +++ b/backend/include/rcc/CodeGen/TargetDescription.h @@ -8,6 +8,7 @@ #include "rcc/CodeGen/TargetRegisterInfo.h" #include "rcc/Support/Error.h" +#include #include #include #include @@ -23,6 +24,18 @@ class MachineMemOperand; class MachineRegisterInfo; struct VirtualRegisterInfo; +enum class BooleanContent : std::uint8_t { + Undefined, + ZeroOrOne, + ZeroOrNegativeOne, +}; + +struct TargetBooleanContentInfo final { + BooleanContent ScalarInteger = BooleanContent::Undefined; + BooleanContent ScalarFloatingPoint = BooleanContent::Undefined; + BooleanContent Vector = BooleanContent::Undefined; +}; + class TargetDescription final { public: TargetDescription(const TargetDescription &) = delete; @@ -31,9 +44,9 @@ public: TargetDescription &operator=(TargetDescription &&) noexcept = default; ~TargetDescription() = default; - [[nodiscard]] static Expected create(InstructionSet Instructions, - TargetRegisterInfo Registers, - TargetMIRTextInfoDesc MIRText = {}); + [[nodiscard]] static Expected + create(InstructionSet Instructions, TargetRegisterInfo Registers, + TargetMIRTextInfoDesc MIRText = {}, TargetBooleanContentInfo BooleanInfo = {}); [[nodiscard]] const InstructionSet &instructions() const noexcept { return Instructions; @@ -47,6 +60,13 @@ public: return MIRText; } + [[nodiscard]] BooleanContent getBooleanContents(bool IsVector, + bool IsFloatingPoint) const noexcept { + if (IsVector) + return BooleanInfo.Vector; + return IsFloatingPoint ? BooleanInfo.ScalarFloatingPoint : BooleanInfo.ScalarInteger; + } + [[nodiscard]] const InstructionDescriptor * instructionDescriptor(Opcode InstructionOpcode) const noexcept { return Instructions.descriptor(InstructionOpcode); @@ -87,9 +107,9 @@ public: private: TargetDescription(InstructionSet Instructions, TargetRegisterInfo Registers, - TargetMIRTextInfo MIRText) + TargetMIRTextInfo MIRText, TargetBooleanContentInfo BooleanInfo) : Instructions(std::move(Instructions)), Registers(std::move(Registers)), - MIRText(std::move(MIRText)) {} + MIRText(std::move(MIRText)), BooleanInfo(BooleanInfo) {} [[nodiscard]] Expected validateTargetOperand(const OperandDescriptor *Descriptor, const MachineOperand &Operand, @@ -101,6 +121,7 @@ private: InstructionSet Instructions; TargetRegisterInfo Registers; TargetMIRTextInfo MIRText; + TargetBooleanContentInfo BooleanInfo; }; } // namespace rcc -- cgit v1.2.3