aboutsummaryrefslogtreecommitdiff
path: root/backend/lib/Target/RISCV
diff options
context:
space:
mode:
Diffstat (limited to 'backend/lib/Target/RISCV')
-rw-r--r--backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.cpp4
-rw-r--r--backend/lib/Target/RISCV/GISel/RISCVLegalizerInfo.h3
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