summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
authorTim Northover <tnorthover@apple.com>2016-08-26 17:46:06 +0000
committerTim Northover <tnorthover@apple.com>2016-08-26 17:46:06 +0000
commit7a753d9bec529698c16475c72cf1de386b63381f (patch)
treebd0f2ee6bfa04c1e7d4788f14bfbefcb130e85fb /llvm/lib/CodeGen
parent1d18a99a53a3a37ccffdf36341da2d46c8f6c201 (diff)
downloadbcm5719-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.cpp27
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");
OpenPOWER on IntegriCloud