aboutsummaryrefslogtreecommitdiff
path: root/backend/lib/CodeGen
diff options
context:
space:
mode:
authorRichard-Qin-X <richard.qin.001@gmail.com>2026-08-15 02:31:31 +0800
committerRichard-Qin-X <richard.qin.001@gmail.com>2026-08-15 02:31:31 +0800
commite15a7d0a152abf5c2e0f2f6d063f6cbe3cbcfb70 (patch)
tree7b8ad1664631d27ecbad7d77027566645e6431e8 /backend/lib/CodeGen
parenta4ee3bbc782fe10737d2733ae144553f5bab6297 (diff)
downloadrcc-project-e15a7d0a152abf5c2e0f2f6d063f6cbe3cbcfb70.tar.gz
rcc-project-e15a7d0a152abf5c2e0f2f6d063f6cbe3cbcfb70.tar.xz
[GlobalISel] Legalize scalar floating comparisons
Diffstat (limited to 'backend/lib/CodeGen')
-rw-r--r--backend/lib/CodeGen/GlobalISel/LegalizerHelper.cpp26
1 files changed, 26 insertions, 0 deletions
diff --git a/backend/lib/CodeGen/GlobalISel/LegalizerHelper.cpp b/backend/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
index 8e288e8..10ad2c0 100644
--- a/backend/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
+++ b/backend/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
@@ -1167,6 +1167,21 @@ Expected<void> LegalizerHelper::widenScalar(MachineInstr &Instruction, std::size
}
break;
+ case GenericOpcode::G_FCMP:
+ if (TypeIndex == 0) {
+ if (auto Result = Apply(WidenDestination()); !Result)
+ return Result;
+ break;
+ }
+ if (TypeIndex != 1)
+ return makeUnexpected(ErrorCode::VerificationError,
+ "floating comparison widening has an invalid type index");
+ if (auto Result = Apply(WidenSource(2, GenericOpcode::G_FPEXT)); !Result)
+ return Result;
+ if (auto Result = Apply(WidenSource(3, GenericOpcode::G_FPEXT)); !Result)
+ return Result;
+ break;
+
case GenericOpcode::G_SELECT:
if (TypeIndex == 0) {
if (auto Result = Apply(WidenSource(2, GenericOpcode::G_ANYEXT)); !Result)
@@ -2510,6 +2525,17 @@ Expected<void> LegalizerHelper::narrowScalar(MachineInstr &Instruction, std::siz
}
Observer.changedInstr(Instruction);
return {};
+ case GenericOpcode::G_FCMP:
+ if (TypeIndex != 0)
+ return makeUnexpected(ErrorCode::Unsupported,
+ "floating comparison source narrowing is not defined");
+ Observer.changingInstr(Instruction);
+ if (auto Narrowed = narrowScalarDst(Instruction, NarrowType, 0, GenericOpcode::G_ZEXT);
+ !Narrowed) {
+ return std::unexpected(Narrowed.error());
+ }
+ Observer.changedInstr(Instruction);
+ return {};
case GenericOpcode::G_SEXT_INREG: {
if (TypeIndex != 0)
return makeUnexpected(ErrorCode::Unsupported,