diff options
author | Amara Emerson <aemerson@apple.com> | 2019-07-26 23:46:38 +0000 |
---|---|---|
committer | Amara Emerson <aemerson@apple.com> | 2019-07-26 23:46:38 +0000 |
commit | 7bc4fad0fbee60530f0b50d8e3911a21d47046bd (patch) | |
tree | c94037dc7cc53b0f7fd4e10fc23e12a3818d3d0f /llvm/lib/CodeGen | |
parent | aa8b9993c23f9915f1ba694502333f67a627e8d0 (diff) | |
download | bcm5719-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.cpp | 20 |
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. |