aboutsummaryrefslogtreecommitdiff
path: root/backend/include
diff options
context:
space:
mode:
authorRichard-Qin-X <richard.qin.001@gmail.com>2026-08-15 01:52:19 +0800
committerRichard-Qin-X <richard.qin.001@gmail.com>2026-08-15 01:52:19 +0800
commit76bc552dc3b685ecafd52ecc31e69b0eca00cfbd (patch)
treeedd9f8bd52095b39790b104fa70c5162f018424c /backend/include
parentc8bad4713f17c3624a6044885ee43d316953b598 (diff)
downloadrcc-project-76bc552dc3b685ecafd52ecc31e69b0eca00cfbd.tar.gz
rcc-project-76bc552dc3b685ecafd52ecc31e69b0eca00cfbd.tar.xz
[GlobalISel] Narrow scalar shifts
Diffstat (limited to 'backend/include')
-rw-r--r--backend/include/rcc/CodeGen/GlobalISel/LegalizerHelper.h30
1 files changed, 30 insertions, 0 deletions
diff --git a/backend/include/rcc/CodeGen/GlobalISel/LegalizerHelper.h b/backend/include/rcc/CodeGen/GlobalISel/LegalizerHelper.h
index 993690e..7814d95 100644
--- a/backend/include/rcc/CodeGen/GlobalISel/LegalizerHelper.h
+++ b/backend/include/rcc/CodeGen/GlobalISel/LegalizerHelper.h
@@ -37,6 +37,8 @@ public:
[[nodiscard]] Expected<void> widenScalarSrc(MachineInstr &Instruction, LowLevelType WideType,
std::size_t OperandIndex,
GenericOpcode ExtensionOpcode);
+ [[nodiscard]] Expected<void> narrowScalarSrc(MachineInstr &Instruction, LowLevelType NarrowType,
+ std::size_t OperandIndex);
[[nodiscard]] Expected<void> widenScalarDst(MachineInstr &Instruction, LowLevelType WideType,
std::size_t OperandIndex = 0,
GenericOpcode TruncOpcode = GenericOpcode::G_TRUNC);
@@ -74,6 +76,34 @@ private:
LowLevelType NarrowType);
[[nodiscard]] Expected<void> narrowScalarSelect(MachineInstr &Instruction, std::size_t TypeIndex,
LowLevelType NarrowType);
+ [[nodiscard]] Expected<void> narrowScalarShift(MachineInstr &Instruction, std::size_t TypeIndex,
+ LowLevelType NarrowType);
+ [[nodiscard]] Expected<void> narrowScalarShiftByConstant(MachineInstr &Instruction,
+ const APInt &Amount,
+ LowLevelType HalfType,
+ LowLevelType AmountType);
+ [[nodiscard]] Expected<void> narrowScalarShiftMultiway(MachineInstr &Instruction,
+ LowLevelType TargetType);
+ [[nodiscard]] Expected<void> narrowScalarShiftByConstantMultiway(MachineInstr &Instruction,
+ const APInt &Amount,
+ LowLevelType TargetType,
+ LowLevelType AmountType);
+
+ struct ShiftParameters final {
+ Register WordShift;
+ Register BitShift;
+ Register InverseBitShift;
+ Register Zero;
+ Register SignBit;
+ };
+
+ [[nodiscard]] Expected<Register>
+ buildConstantShiftPart(GenericOpcode Generic, std::size_t PartIndex, std::size_t PartCount,
+ const std::vector<Register> &SourceParts,
+ const ShiftParameters &Parameters, LowLevelType TargetType);
+ [[nodiscard]] Expected<Register>
+ buildVariableShiftPart(GenericOpcode Generic, Register MainOperand, Register ShiftAmount,
+ LowLevelType TargetType, Register CarryOperand = {});
[[nodiscard]] Expected<void> widenScalarAddSubOverflow(MachineInstr &Instruction,
std::size_t TypeIndex,
LowLevelType WideType);