diff options
Diffstat (limited to 'backend/lib')
| -rw-r--r-- | backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp | 4 | ||||
| -rw-r--r-- | backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.h | 3 |
2 files changed, 6 insertions, 1 deletions
diff --git a/backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp b/backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp index 975fc9b..06eea7b 100644 --- a/backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp +++ b/backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp @@ -284,7 +284,7 @@ foldConstantExtension(MachineInstr &Instruction, MachineFunction &Function, Gene } // namespace -RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &Subtarget) { +RISCVLegalizerInfo::RISCVLegalizerInfo(const RISCVSubtarget &Subtarget) : Subtarget(Subtarget) { const LowLevelType S8 = *LowLevelType::makeCategoryNeutralScalar(8); const LowLevelType S16 = *LowLevelType::makeCategoryNeutralScalar(16); const LowLevelType S32 = *LowLevelType::makeCategoryNeutralScalar(32); @@ -754,6 +754,8 @@ Expected<void> RISCVLegalizerInfo::legalizeCustom(LegalizerHelper &Helper, return std::unexpected(DestinationType.error()); if (DestinationType->minimumBitWidth() == 64 && *Size == 32) return {}; + if (Subtarget.features().has(RISCVExtension::Zbb) && (*Size == 8 || *Size == 16)) + return {}; return Helper.lower(Instruction, LegalizationDecision{ .Action = LegalizationAction::Lower, .TypeIndex = 0, diff --git a/backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.h b/backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.h index 7e84764..43a18a1 100644 --- a/backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.h +++ b/backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.h @@ -18,6 +18,9 @@ public: MachineInstr &Instruction) const override; [[nodiscard]] bool isSExtCheaperThanZExt(LowLevelType SourceType, LowLevelType DestinationType) const override; + +private: + const RISCVSubtarget &Subtarget; }; } // namespace rcc::riscv |
