summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen
diff options
context:
space:
mode:
authorEvan Cheng <evan.cheng@apple.com>2006-09-01 18:17:58 +0000
committerEvan Cheng <evan.cheng@apple.com>2006-09-01 18:17:58 +0000
commite93762d36e62fa245b073c981d377bd28b52a66a (patch)
tree5d938f968374ada021e2809d5122c4a6a2b23f9e /llvm/lib/CodeGen
parent5352d0cc4d38ca89a38aa2fb487ecf5e2c8f1fc2 (diff)
downloadbcm5719-llvm-e93762d36e62fa245b073c981d377bd28b52a66a.tar.gz
bcm5719-llvm-e93762d36e62fa245b073c981d377bd28b52a66a.zip
Allow legalizer to expand ISD::MUL using only MULHS in the rare case that is
possible and the target only supports MULHS. llvm-svn: 30022
Diffstat (limited to 'llvm/lib/CodeGen')
-rw-r--r--llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp19
1 files changed, 13 insertions, 6 deletions
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
index 3af1c14f5ac..cd6a3bf2da1 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp
@@ -4656,7 +4656,10 @@ void SelectionDAGLegalize::ExpandOp(SDOperand Op, SDOperand &Lo, SDOperand &Hi){
break;
}
case ISD::MUL: {
- if (TLI.isOperationLegal(ISD::MULHU, NVT)) {
+ bool HasMULHS = TLI.isOperationLegal(ISD::MULHS, NVT);
+ bool HasMULHU = TLI.isOperationLegal(ISD::MULHU, NVT);
+ bool UseLibCall = true;
+ if (HasMULHS || HasMULHU) {
SDOperand LL, LH, RL, RH;
ExpandOp(Node->getOperand(0), LL, LH);
ExpandOp(Node->getOperand(1), RL, RH);
@@ -4665,7 +4668,7 @@ void SelectionDAGLegalize::ExpandOp(SDOperand Op, SDOperand &Lo, SDOperand &Hi){
// extended the sign bit of the low half through the upper half, and if so
// emit a MULHS instead of the alternate sequence that is valid for any
// i64 x i64 multiply.
- if (TLI.isOperationLegal(ISD::MULHS, NVT) &&
+ if (HasMULHS &&
// is RH an extension of the sign bit of RL?
RH.getOpcode() == ISD::SRA && RH.getOperand(0) == RL &&
RH.getOperand(1).getOpcode() == ISD::Constant &&
@@ -4675,17 +4678,21 @@ void SelectionDAGLegalize::ExpandOp(SDOperand Op, SDOperand &Lo, SDOperand &Hi){
LH.getOperand(1).getOpcode() == ISD::Constant &&
cast<ConstantSDNode>(LH.getOperand(1))->getValue() == SH) {
Hi = DAG.getNode(ISD::MULHS, NVT, LL, RL);
- } else {
+ UseLibCall = false;
+ } else if (HasMULHU) {
Hi = DAG.getNode(ISD::MULHU, NVT, LL, RL);
RH = DAG.getNode(ISD::MUL, NVT, LL, RH);
LH = DAG.getNode(ISD::MUL, NVT, LH, RL);
Hi = DAG.getNode(ISD::ADD, NVT, Hi, RH);
Hi = DAG.getNode(ISD::ADD, NVT, Hi, LH);
+ UseLibCall = false;
}
- Lo = DAG.getNode(ISD::MUL, NVT, LL, RL);
- } else {
- Lo = ExpandLibCall("__muldi3" , Node, Hi);
+ if (!UseLibCall)
+ Lo = DAG.getNode(ISD::MUL, NVT, LL, RL);
}
+
+ if (UseLibCall)
+ Lo = ExpandLibCall("__muldi3" , Node, Hi);
break;
}
case ISD::SDIV: Lo = ExpandLibCall("__divdi3" , Node, Hi); break;
OpenPOWER on IntegriCloud