summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorCraig Topper <craig.topper@intel.com>2017-09-28 18:45:28 +0000
committerCraig Topper <craig.topper@intel.com>2017-09-28 18:45:28 +0000
commit3819be6cf61b3b2abc0aad1935feaba2ad976e89 (patch)
tree994496cc6e0a16bb0c446c6d56f197a83f2268c9 /llvm/lib
parentfc104bfbc0566316c90c8e64b876c1fac079ef41 (diff)
downloadbcm5719-llvm-3819be6cf61b3b2abc0aad1935feaba2ad976e89.tar.gz
bcm5719-llvm-3819be6cf61b3b2abc0aad1935feaba2ad976e89.zip
[X86] Use target independent ZERO_EXTEND/SIGN_EXTEND nodes were possible in LowerMULH
We aren't do any in register extends here so we should be able to just the target independent nodes directly and allow them to be lowered as necessary. llvm-svn: 314447
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/Target/X86/X86ISelLowering.cpp19
1 files changed, 10 insertions, 9 deletions
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 5cc24471ec4..d762c985e90 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -21616,7 +21616,7 @@ static SDValue LowerMULH(SDValue Op, const X86Subtarget &Subtarget,
// and then ashr/lshr the upper bits down to the lower bits before multiply.
unsigned Opcode = Op.getOpcode();
unsigned ExShift = (ISD::MULHU == Opcode ? ISD::SRL : ISD::SRA);
- unsigned ExSSE41 = (ISD::MULHU == Opcode ? X86ISD::VZEXT : X86ISD::VSEXT);
+ unsigned ExAVX = (ISD::MULHU == Opcode ? ISD::ZERO_EXTEND : ISD::SIGN_EXTEND);
// AVX2 implementations - extend xmm subvectors to ymm.
if (Subtarget.hasInt256()) {
@@ -21626,8 +21626,8 @@ static SDValue LowerMULH(SDValue Op, const X86Subtarget &Subtarget,
if (VT == MVT::v32i8) {
if (Subtarget.hasBWI()) {
- SDValue ExA = getExtendInVec(ExSSE41, dl, MVT::v32i16, A, DAG);
- SDValue ExB = getExtendInVec(ExSSE41, dl, MVT::v32i16, B, DAG);
+ SDValue ExA = DAG.getNode(ExAVX, dl, MVT::v32i16, A);
+ SDValue ExB = DAG.getNode(ExAVX, dl, MVT::v32i16, B);
SDValue Mul = DAG.getNode(ISD::MUL, dl, MVT::v32i16, ExA, ExB);
Mul = DAG.getNode(ISD::SRL, dl, MVT::v32i16, Mul,
DAG.getConstant(8, dl, MVT::v32i16));
@@ -21647,10 +21647,10 @@ static SDValue LowerMULH(SDValue Op, const X86Subtarget &Subtarget,
SDValue BLo = extract128BitVector(B, 0, DAG, dl);
SDValue AHi = extract128BitVector(A, NumElems / 2, DAG, dl);
SDValue BHi = extract128BitVector(B, NumElems / 2, DAG, dl);
- ALo = DAG.getNode(ExSSE41, dl, MVT::v16i16, ALo);
- BLo = DAG.getNode(ExSSE41, dl, MVT::v16i16, BLo);
- AHi = DAG.getNode(ExSSE41, dl, MVT::v16i16, AHi);
- BHi = DAG.getNode(ExSSE41, dl, MVT::v16i16, BHi);
+ ALo = DAG.getNode(ExAVX, dl, MVT::v16i16, ALo);
+ BLo = DAG.getNode(ExAVX, dl, MVT::v16i16, BLo);
+ AHi = DAG.getNode(ExAVX, dl, MVT::v16i16, AHi);
+ BHi = DAG.getNode(ExAVX, dl, MVT::v16i16, BHi);
Lo = DAG.getNode(ISD::SRL, dl, MVT::v16i16,
DAG.getNode(ISD::MUL, dl, MVT::v16i16, ALo, BLo),
DAG.getConstant(8, dl, MVT::v16i16));
@@ -21668,8 +21668,8 @@ static SDValue LowerMULH(SDValue Op, const X86Subtarget &Subtarget,
DAG.getVectorShuffle(MVT::v16i16, dl, Lo, Hi, HiMask));
}
- SDValue ExA = getExtendInVec(ExSSE41, dl, MVT::v16i16, A, DAG);
- SDValue ExB = getExtendInVec(ExSSE41, dl, MVT::v16i16, B, DAG);
+ SDValue ExA = DAG.getNode(ExAVX, dl, MVT::v16i16, A);
+ SDValue ExB = DAG.getNode(ExAVX, dl, MVT::v16i16, B);
SDValue Mul = DAG.getNode(ISD::MUL, dl, MVT::v16i16, ExA, ExB);
SDValue MulH = DAG.getNode(ISD::SRL, dl, MVT::v16i16, Mul,
DAG.getConstant(8, dl, MVT::v16i16));
@@ -21681,6 +21681,7 @@ static SDValue LowerMULH(SDValue Op, const X86Subtarget &Subtarget,
assert(VT == MVT::v16i8 &&
"Pre-AVX2 support only supports v16i8 multiplication");
MVT ExVT = MVT::v8i16;
+ unsigned ExSSE41 = (ISD::MULHU == Opcode ? X86ISD::VZEXT : X86ISD::VSEXT);
// Extract the lo parts and zero/sign extend to i16.
SDValue ALo, BLo;
OpenPOWER on IntegriCloud