diff options
author | Justin Bogner <mail@justinbogner.com> | 2017-01-19 01:05:48 +0000 |
---|---|---|
committer | Justin Bogner <mail@justinbogner.com> | 2017-01-19 01:05:48 +0000 |
commit | d09c3ce6c02779bda1c295ff7f261c13252d8b85 (patch) | |
tree | a2c6a04da26012c1e162dc25cb455669c80eb00b /llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp | |
parent | 1f5c505437139bb2dabcacd93c858dd1263b354f (diff) | |
download | bcm5719-llvm-d09c3ce6c02779bda1c295ff7f261c13252d8b85.tar.gz bcm5719-llvm-d09c3ce6c02779bda1c295ff7f261c13252d8b85.zip |
GlobalISel: Implement narrowing for G_LOAD
llvm-svn: 292461
Diffstat (limited to 'llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp')
-rw-r--r-- | llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp index bb4f2cf20db..443c6e1ee40 100644 --- a/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp +++ b/llvm/lib/CodeGen/GlobalISel/LegalizerHelper.cpp @@ -161,6 +161,32 @@ LegalizerHelper::LegalizeResult LegalizerHelper::narrowScalar(MachineInstr &MI, MI.eraseFromParent(); return Legalized; } + case TargetOpcode::G_LOAD: { + unsigned NarrowSize = NarrowTy.getSizeInBits(); + int NumParts = + MRI.getType(MI.getOperand(0).getReg()).getSizeInBits() / NarrowSize; + LLT NarrowPtrTy = LLT::pointer( + MRI.getType(MI.getOperand(1).getReg()).getAddressSpace(), NarrowSize); + + SmallVector<unsigned, 2> DstRegs; + SmallVector<uint64_t, 2> Indexes; + for (int i = 0; i < NumParts; ++i) { + unsigned DstReg = MRI.createGenericVirtualRegister(NarrowTy); + unsigned SrcReg = MRI.createGenericVirtualRegister(NarrowPtrTy); + unsigned Offset = MRI.createGenericVirtualRegister(LLT::scalar(64)); + + MIRBuilder.buildConstant(Offset, i * NarrowSize / 8); + MIRBuilder.buildGEP(SrcReg, MI.getOperand(1).getReg(), Offset); + MIRBuilder.buildLoad(DstReg, SrcReg, **MI.memoperands_begin()); + + DstRegs.push_back(DstReg); + Indexes.push_back(i * NarrowSize); + } + unsigned DstReg = MI.getOperand(0).getReg(); + MIRBuilder.buildSequence(DstReg, DstRegs, Indexes); + MI.eraseFromParent(); + return Legalized; + } case TargetOpcode::G_STORE: { unsigned NarrowSize = NarrowTy.getSizeInBits(); int NumParts = |