aboutsummaryrefslogtreecommitdiff
path: root/backend/include/rcc/CodeGen/TargetDescription.h
diff options
context:
space:
mode:
Diffstat (limited to 'backend/include/rcc/CodeGen/TargetDescription.h')
-rw-r--r--backend/include/rcc/CodeGen/TargetDescription.h31
1 files changed, 26 insertions, 5 deletions
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 <cstdint>
#include <optional>
#include <span>
#include <utility>
@@ -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<TargetDescription> create(InstructionSet Instructions,
- TargetRegisterInfo Registers,
- TargetMIRTextInfoDesc MIRText = {});
+ [[nodiscard]] static Expected<TargetDescription>
+ 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<void> validateTargetOperand(const OperandDescriptor *Descriptor,
const MachineOperand &Operand,
@@ -101,6 +121,7 @@ private:
InstructionSet Instructions;
TargetRegisterInfo Registers;
TargetMIRTextInfo MIRText;
+ TargetBooleanContentInfo BooleanInfo;
};
} // namespace rcc