diff options
author | Tim Northover <tnorthover@apple.com> | 2016-08-26 17:46:06 +0000 |
---|---|---|
committer | Tim Northover <tnorthover@apple.com> | 2016-08-26 17:46:06 +0000 |
commit | 7a753d9bec529698c16475c72cf1de386b63381f (patch) | |
tree | bd0f2ee6bfa04c1e7d4788f14bfbefcb130e85fb /llvm/lib/CodeGen | |
parent | 1d18a99a53a3a37ccffdf36341da2d46c8f6c201 (diff) | |
download | bcm5719-llvm-7a753d9bec529698c16475c72cf1de386b63381f.tar.gz bcm5719-llvm-7a753d9bec529698c16475c72cf1de386b63381f.zip |
GlobalISel: legalize under-width divisions.
llvm-svn: 279841
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r-- | llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp b/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp index 66b71668820..401f29a6ddc 100644 --- a/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp +++ b/llvm/lib/CodeGen/GlobalISel/MachineLegalizeHelper.cpp @@ -161,6 +161,33 @@ MachineLegalizeHelper::widenScalar(MachineInstr &MI, unsigned TypeIdx, MI.eraseFromParent(); return Legalized; } + case TargetOpcode::G_SDIV: + case TargetOpcode::G_UDIV: { + unsigned ExtOp = MI.getOpcode() == TargetOpcode::G_SDIV + ? TargetOpcode::G_SEXT + : TargetOpcode::G_ZEXT; + + unsigned LHSExt = MRI.createGenericVirtualRegister(WideSize); + MIRBuilder.buildInstr(ExtOp, {WideTy, MI.getType()}) + .addDef(LHSExt) + .addUse(MI.getOperand(1).getReg()); + + unsigned RHSExt = MRI.createGenericVirtualRegister(WideSize); + MIRBuilder.buildInstr(ExtOp, {WideTy, MI.getType()}) + .addDef(RHSExt) + .addUse(MI.getOperand(2).getReg()); + + unsigned ResExt = MRI.createGenericVirtualRegister(WideSize); + MIRBuilder.buildInstr(MI.getOpcode(), WideTy) + .addDef(ResExt) + .addUse(LHSExt) + .addUse(RHSExt); + + MIRBuilder.buildTrunc({MI.getType(), WideTy}, MI.getOperand(0).getReg(), + ResExt); + MI.eraseFromParent(); + return Legalized; + } case TargetOpcode::G_LOAD: { assert(alignTo(Ty.getSizeInBits(), 8) == WideSize && "illegal to increase number of bytes loaded"); |