summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
authorAmara Emerson <aemerson@apple.com>2019-07-26 23:46:38 +0000
committerAmara Emerson <aemerson@apple.com>2019-07-26 23:46:38 +0000
commit7bc4fad0fbee60530f0b50d8e3911a21d47046bd (patch)
treec94037dc7cc53b0f7fd4e10fc23e12a3818d3d0f /llvm/lib/CodeGen
parentaa8b9993c23f9915f1ba694502333f67a627e8d0 (diff)
downloadbcm5719-llvm-7bc4fad0fbee60530f0b50d8e3911a21d47046bd.tar.gz
bcm5719-llvm-7bc4fad0fbee60530f0b50d8e3911a21d47046bd.zip
[AArch64][GlobalISel] Implement narrowing of G_SEXT.
We need this to narrow a sext to s128. Differential Revision: https://reviews.llvm.org/D65357 llvm-svn: 367164
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r--llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
index 47afa8e04b0..61618d2b7dc 100644
--- a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
+++ b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp
@@ -567,6 +567,26 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI,
MI.eraseFromParent();
return Legalized;
}
+ case TargetOpcode::G_SEXT: {
+ if (TypeIdx != 0)
+ return UnableToLegalize;
+
+ if (NarrowTy.getSizeInBits() != SizeOp0 / 2) {
+ LLVM_DEBUG(dbgs() << "Can't narrow sext to type " << NarrowTy << "\n");
+ return UnableToLegalize;
+ }
+
+ Register SrcReg = MI.getOperand(1).getReg();
+
+ // Shift the sign bit of the low register through the high register.
+ auto ShiftAmt =
+ MIRBuilder.buildConstant(LLT::scalar(64), NarrowTy.getSizeInBits() - 1);
+ auto Shift = MIRBuilder.buildAShr(NarrowTy, SrcReg, ShiftAmt);
+ MIRBuilder.buildMerge(MI.getOperand(0).getReg(), {SrcReg, Shift.getReg(0)});
+ MI.eraseFromParent();
+ return Legalized;
+ }
+
case TargetOpcode::G_ADD: {
// FIXME: add support for when SizeOp0 isn't an exact multiple of
// NarrowSize.
OpenPOWER on IntegriCloud