summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
authorAmara Emerson <aemerson@apple.com>2019-08-21 00:12:37 +0000
committerAmara Emerson <aemerson@apple.com>2019-08-21 00:12:37 +0000
commit56606a4db3e7c6b4a1b3bfd3b2dfc04c81a2247e (patch)
tree43e275c99cda9d1e1ef5b20f7565ed8c02569844 /llvm/lib/CodeGen
parentd979a2993561d42612da5ef45122fb69466967c3 (diff)
downloadbcm5719-llvm-56606a4db3e7c6b4a1b3bfd3b2dfc04c81a2247e.tar.gz
bcm5719-llvm-56606a4db3e7c6b4a1b3bfd3b2dfc04c81a2247e.zip
[AArch64][GlobalISel] Add support for narrowScalar of G_ZEXT
We do this by merging the source with the high bits set to 0. Differential Revision: https://reviews.llvm.org/D66181 llvm-svn: 369480
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r--llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp18
1 files changed, 18 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
index c5f23859783..26c25ba26d4 100644
--- a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
@@ -615,6 +615,24 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI,
MI.eraseFromParent();
return Legalized;
}
+ case TargetOpcode::G_ZEXT: {
+ if (TypeIdx != 0)
+ return UnableToLegalize;
+
+ if (SizeOp0 % NarrowTy.getSizeInBits() != 0)
+ return UnableToLegalize;
+
+ // Generate a merge where the bottom bits are taken from the source, and
+ // zero everything else.
+ Register ZeroReg = MIRBuilder.buildConstant(NarrowTy, 0).getReg(0);
+ unsigned NumParts = SizeOp0 / NarrowTy.getSizeInBits();
+ SmallVector<Register, 4> Srcs = {MI.getOperand(1).getReg()};
+ for (unsigned Part = 1; Part < NumParts; ++Part)
+ Srcs.push_back(ZeroReg);
+ MIRBuilder.buildMerge(MI.getOperand(0).getReg(), Srcs);
+ MI.eraseFromParent();
+ return Legalized;
+ }
case TargetOpcode::G_ADD: {
// FIXME: add support for when SizeOp0 isn't an exact multiple of
OpenPOWER on IntegriCloud