Skip to content

Commit e63c676

Browse files
committed
[PowerPC] Cust lower fpext v2f32 to v2f64 from extract_subvector v4f32
Add the missing piece of r372029. Somehow when the patch for review D61961 was committed, only the test case went in and the code didn't. This of course caused all kinds of build bot breaks. This patch just adds the code for that patch. Author: Lei Huang Differential revision: https://reviews.llvm.org/D61961 llvm-svn: 372043
1 parent 77383d8 commit e63c676

File tree

3 files changed

+49
-24
lines changed

3 files changed

+49
-24
lines changed

llvm/lib/Target/PowerPC/PPCISelLowering.cpp

Lines changed: 41 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1405,7 +1405,7 @@ const char *PPCTargetLowering::getTargetNodeName(unsigned Opcode) const {
14051405
case PPCISD::EXTRACT_SPE: return "PPCISD::EXTRACT_SPE";
14061406
case PPCISD::EXTSWSLI: return "PPCISD::EXTSWSLI";
14071407
case PPCISD::LD_VSX_LH: return "PPCISD::LD_VSX_LH";
1408-
case PPCISD::FP_EXTEND_LH: return "PPCISD::FP_EXTEND_LH";
1408+
case PPCISD::FP_EXTEND_HALF: return "PPCISD::FP_EXTEND_HALF";
14091409
}
14101410
return nullptr;
14111411
}
@@ -9913,6 +9913,30 @@ SDValue PPCTargetLowering::LowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const {
99139913
switch (Op0.getOpcode()) {
99149914
default:
99159915
return SDValue();
9916+
case ISD::EXTRACT_SUBVECTOR: {
9917+
assert(Op0.getNumOperands() == 2 &&
9918+
isa<ConstantSDNode>(Op0->getOperand(1)) &&
9919+
"Node should have 2 operands with second one being a constant!");
9920+
9921+
if (Op0.getOperand(0).getValueType() != MVT::v4f32)
9922+
return SDValue();
9923+
9924+
// Custom lower is only done for high or low doubleword.
9925+
int Idx = cast<ConstantSDNode>(Op0.getOperand(1))->getZExtValue();
9926+
if (Idx % 2 != 0)
9927+
return SDValue();
9928+
9929+
// Since input is v4f32, at this point Idx is either 0 or 2.
9930+
// Shift to get the doubleword position we want.
9931+
int DWord = Idx >> 1;
9932+
9933+
// High and low word positions are different on little endian.
9934+
if (Subtarget.isLittleEndian())
9935+
DWord ^= 0x1;
9936+
9937+
return DAG.getNode(PPCISD::FP_EXTEND_HALF, dl, MVT::v2f64,
9938+
Op0.getOperand(0), DAG.getConstant(DWord, dl, MVT::i32));
9939+
}
99169940
case ISD::FADD:
99179941
case ISD::FMUL:
99189942
case ISD::FSUB: {
@@ -9924,26 +9948,25 @@ SDValue PPCTargetLowering::LowerFP_EXTEND(SDValue Op, SelectionDAG &DAG) const {
99249948
return SDValue();
99259949
// Generate new load node.
99269950
LoadSDNode *LD = cast<LoadSDNode>(LdOp);
9927-
SDValue LoadOps[] = { LD->getChain(), LD->getBasePtr() };
9928-
NewLoad[i] =
9929-
DAG.getMemIntrinsicNode(PPCISD::LD_VSX_LH, dl,
9930-
DAG.getVTList(MVT::v4f32, MVT::Other),
9931-
LoadOps, LD->getMemoryVT(),
9932-
LD->getMemOperand());
9933-
}
9934-
SDValue NewOp = DAG.getNode(Op0.getOpcode(), SDLoc(Op0), MVT::v4f32,
9935-
NewLoad[0], NewLoad[1],
9936-
Op0.getNode()->getFlags());
9937-
return DAG.getNode(PPCISD::FP_EXTEND_LH, dl, MVT::v2f64, NewOp);
9951+
SDValue LoadOps[] = {LD->getChain(), LD->getBasePtr()};
9952+
NewLoad[i] = DAG.getMemIntrinsicNode(
9953+
PPCISD::LD_VSX_LH, dl, DAG.getVTList(MVT::v4f32, MVT::Other), LoadOps,
9954+
LD->getMemoryVT(), LD->getMemOperand());
9955+
}
9956+
SDValue NewOp =
9957+
DAG.getNode(Op0.getOpcode(), SDLoc(Op0), MVT::v4f32, NewLoad[0],
9958+
NewLoad[1], Op0.getNode()->getFlags());
9959+
return DAG.getNode(PPCISD::FP_EXTEND_HALF, dl, MVT::v2f64, NewOp,
9960+
DAG.getConstant(0, dl, MVT::i32));
99389961
}
99399962
case ISD::LOAD: {
99409963
LoadSDNode *LD = cast<LoadSDNode>(Op0);
9941-
SDValue LoadOps[] = { LD->getChain(), LD->getBasePtr() };
9942-
SDValue NewLd =
9943-
DAG.getMemIntrinsicNode(PPCISD::LD_VSX_LH, dl,
9944-
DAG.getVTList(MVT::v4f32, MVT::Other),
9945-
LoadOps, LD->getMemoryVT(), LD->getMemOperand());
9946-
return DAG.getNode(PPCISD::FP_EXTEND_LH, dl, MVT::v2f64, NewLd);
9964+
SDValue LoadOps[] = {LD->getChain(), LD->getBasePtr()};
9965+
SDValue NewLd = DAG.getMemIntrinsicNode(
9966+
PPCISD::LD_VSX_LH, dl, DAG.getVTList(MVT::v4f32, MVT::Other), LoadOps,
9967+
LD->getMemoryVT(), LD->getMemOperand());
9968+
return DAG.getNode(PPCISD::FP_EXTEND_HALF, dl, MVT::v2f64, NewLd,
9969+
DAG.getConstant(0, dl, MVT::i32));
99479970
}
99489971
}
99499972
llvm_unreachable("ERROR:Should return for all cases within swtich.");

llvm/lib/Target/PowerPC/PPCISelLowering.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -412,8 +412,9 @@ namespace llvm {
412412
/// representation.
413413
QBFLT,
414414

415-
/// Custom extend v4f32 to v2f64.
416-
FP_EXTEND_LH,
415+
/// FP_EXTEND_HALF(VECTOR, IDX) - Custom extend upper (IDX=0) half or
416+
/// lower (IDX=1) half of v4f32 to v2f64.
417+
FP_EXTEND_HALF,
417418

418419
/// CHAIN = STBRX CHAIN, GPRC, Ptr, Type - This is a
419420
/// byte-swapping store instruction. It byte-swaps the low "Type" bits of

llvm/lib/Target/PowerPC/PPCInstrVSX.td

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,8 @@ def SDT_PPCldvsxlh : SDTypeProfile<1, 1, [
5858
SDTCisVT<0, v4f32>, SDTCisPtrTy<1>
5959
]>;
6060

61-
def SDT_PPCfpextlh : SDTypeProfile<1, 1, [
62-
SDTCisVT<0, v2f64>, SDTCisVT<1, v4f32>
61+
def SDT_PPCfpexth : SDTypeProfile<1, 2, [
62+
SDTCisVT<0, v2f64>, SDTCisVT<1, v4f32>, SDTCisPtrTy<2>
6363
]>;
6464

6565
// Little-endian-specific nodes.
@@ -102,7 +102,7 @@ def PPCuvec2fp: SDNode<"PPCISD::UINT_VEC_TO_FP", SDTVecConv, []>;
102102
def PPCswapNoChain : SDNode<"PPCISD::SWAP_NO_CHAIN", SDT_PPCxxswapd>;
103103
def PPCvabsd : SDNode<"PPCISD::VABSD", SDTVabsd, []>;
104104

105-
def PPCfpextlh : SDNode<"PPCISD::FP_EXTEND_LH", SDT_PPCfpextlh, []>;
105+
def PPCfpexth : SDNode<"PPCISD::FP_EXTEND_HALF", SDT_PPCfpexth, []>;
106106
def PPCldvsxlh : SDNode<"PPCISD::LD_VSX_LH", SDT_PPCldvsxlh,
107107
[SDNPHasChain, SDNPMayLoad, SDNPMemOperand]>;
108108

@@ -1086,7 +1086,8 @@ def : Pat<(v2f64 (PPCuvec2fp v4i32:$C, 0)),
10861086
def : Pat<(v2f64 (PPCuvec2fp v4i32:$C, 1)),
10871087
(v2f64 (XVCVUXWDP (v2i64 (XXMRGLW $C, $C))))>;
10881088

1089-
def : Pat<(v2f64 (PPCfpextlh v4f32:$C)), (XVCVSPDP (XXMRGHW $C, $C))>;
1089+
def : Pat<(v2f64 (PPCfpexth v4f32:$C, 0)), (XVCVSPDP (XXMRGHW $C, $C))>;
1090+
def : Pat<(v2f64 (PPCfpexth v4f32:$C, 1)), (XVCVSPDP (XXMRGLW $C, $C))>;
10901091

10911092
// Loads.
10921093
let Predicates = [HasVSX, HasOnlySwappingMemOps] in {

0 commit comments

Comments
 (0)