diff options
| author | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-15 02:31:31 +0800 |
|---|---|---|
| committer | Richard-Qin-X <richard.qin.001@gmail.com> | 2026-08-15 02:31:31 +0800 |
| commit | e15a7d0a152abf5c2e0f2f6d063f6cbe3cbcfb70 (patch) | |
| tree | 7b8ad1664631d27ecbad7d77027566645e6431e8 /backend/lib/CodeGen/GlobalISel/LegalizerHelper.cpp | |
| parent | a4ee3bbc782fe10737d2733ae144553f5bab6297 (diff) | |
| download | rcc-project-e15a7d0a152abf5c2e0f2f6d063f6cbe3cbcfb70.tar.gz rcc-project-e15a7d0a152abf5c2e0f2f6d063f6cbe3cbcfb70.tar.xz | |
[GlobalISel] Legalize scalar floating comparisons
Diffstat (limited to 'backend/lib/CodeGen/GlobalISel/LegalizerHelper.cpp')
| -rw-r--r-- | backend/lib/CodeGen/GlobalISel/LegalizerHelper.cpp | 26 |
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, |
