Changeset View
Changeset View
Standalone View
Standalone View
llvm/lib/CodeGen/SelectionDAG/TargetLowering.cpp
- This file is larger than 256 KB, so syntax highlighting is disabled by default.
Show First 20 Lines • Show All 6,002 Lines • ▼ Show 20 Lines | bool TargetLowering::expandFunnelShift(SDNode *Node, SDValue &Result, | ||||
SDValue Z = Node->getOperand(2); | SDValue Z = Node->getOperand(2); | ||||
unsigned EltSizeInBits = VT.getScalarSizeInBits(); | unsigned EltSizeInBits = VT.getScalarSizeInBits(); | ||||
bool IsFSHL = Node->getOpcode() == ISD::FSHL; | bool IsFSHL = Node->getOpcode() == ISD::FSHL; | ||||
SDLoc DL(SDValue(Node, 0)); | SDLoc DL(SDValue(Node, 0)); | ||||
EVT ShVT = Z.getValueType(); | EVT ShVT = Z.getValueType(); | ||||
SDValue Mask = DAG.getConstant(EltSizeInBits - 1, DL, ShVT); | SDValue Mask = DAG.getConstant(EltSizeInBits - 1, DL, ShVT); | ||||
SDValue ShAmt; | SDValue ShAmt, InvShAmt; | ||||
if (isPowerOf2_32(EltSizeInBits)) { | if (isPowerOf2_32(EltSizeInBits)) { | ||||
// Z % BW -> Z & (BW - 1) | // Z % BW -> Z & (BW - 1) | ||||
ShAmt = DAG.getNode(ISD::AND, DL, ShVT, Z, Mask); | ShAmt = DAG.getNode(ISD::AND, DL, ShVT, Z, Mask); | ||||
// (BW - 1) - (Z % BW) -> ~Z & (BW - 1) | |||||
InvShAmt = DAG.getNode(ISD::AND, DL, ShVT, DAG.getNOT(DL, Z, ShVT), Mask); | |||||
} else { | } else { | ||||
SDValue BitWidthC = DAG.getConstant(EltSizeInBits, DL, ShVT); | SDValue BitWidthC = DAG.getConstant(EltSizeInBits, DL, ShVT); | ||||
ShAmt = DAG.getNode(ISD::UREM, DL, ShVT, Z, BitWidthC); | ShAmt = DAG.getNode(ISD::UREM, DL, ShVT, Z, BitWidthC); | ||||
InvShAmt = DAG.getNode(ISD::SUB, DL, ShVT, Mask, ShAmt); | |||||
} | } | ||||
SDValue InvShAmt = DAG.getNode(ISD::SUB, DL, ShVT, Mask, ShAmt); | |||||
SDValue One = DAG.getConstant(1, DL, ShVT); | SDValue One = DAG.getConstant(1, DL, ShVT); | ||||
SDValue ShX, ShY; | SDValue ShX, ShY; | ||||
if (IsFSHL) { | if (IsFSHL) { | ||||
ShX = DAG.getNode(ISD::SHL, DL, VT, X, ShAmt); | ShX = DAG.getNode(ISD::SHL, DL, VT, X, ShAmt); | ||||
SDValue ShY1 = DAG.getNode(ISD::SRL, DL, VT, Y, One); | SDValue ShY1 = DAG.getNode(ISD::SRL, DL, VT, Y, One); | ||||
ShY = DAG.getNode(ISD::SRL, DL, VT, ShY1, InvShAmt); | ShY = DAG.getNode(ISD::SRL, DL, VT, ShY1, InvShAmt); | ||||
} else { | } else { | ||||
▲ Show 20 Lines • Show All 1,681 Lines • Show Last 20 Lines |