diff options
author | Craig Topper <craig.topper@intel.com> | 2017-11-10 19:26:04 +0000 |
---|---|---|
committer | Craig Topper <craig.topper@intel.com> | 2017-11-10 19:26:04 +0000 |
commit | bb001c6ddcc23b06869552b99e22155a0e07cfde (patch) | |
tree | bb6b5b6f9f66d568b821c6ef0c8f8f5e7ad2a2cf /llvm | |
parent | 84d11cac287513b16ee5c5e1fb10d0652d7d1583 (diff) | |
download | bcm5719-llvm-bb001c6ddcc23b06869552b99e22155a0e07cfde.tar.gz bcm5719-llvm-bb001c6ddcc23b06869552b99e22155a0e07cfde.zip |
[X86] Merge the template method selectAddrOfGatherScatterNode into selectVectorAddr. NFCI
Just need to initialize a couple variables differently based on the node type. No need for a whole separate template method.
llvm-svn: 317915
Diffstat (limited to 'llvm')
-rw-r--r-- | llvm/lib/Target/X86/X86ISelDAGToDAG.cpp | 41 |
1 files changed, 16 insertions, 25 deletions
diff --git a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp index 099543240ae..9e1121aebf8 100644 --- a/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp +++ b/llvm/lib/Target/X86/X86ISelDAGToDAG.cpp @@ -204,11 +204,6 @@ namespace { bool selectVectorAddr(SDNode *Parent, SDValue N, SDValue &Base, SDValue &Scale, SDValue &Index, SDValue &Disp, SDValue &Segment); - template <class GatherScatterSDNode> - bool selectAddrOfGatherScatterNode(GatherScatterSDNode *Parent, SDValue N, - SDValue &Base, SDValue &Scale, - SDValue &Index, SDValue &Disp, - SDValue &Segment); bool selectMOV64Imm32(SDValue N, SDValue &Imm); bool selectLEAAddr(SDValue N, SDValue &Base, SDValue &Scale, SDValue &Index, SDValue &Disp, @@ -1507,12 +1502,23 @@ bool X86DAGToDAGISel::matchAddressBase(SDValue N, X86ISelAddressMode &AM) { return false; } -template <class GatherScatterSDNode> -bool X86DAGToDAGISel::selectAddrOfGatherScatterNode( - GatherScatterSDNode *Mgs, SDValue N, SDValue &Base, SDValue &Scale, - SDValue &Index, SDValue &Disp, SDValue &Segment) { +bool X86DAGToDAGISel::selectVectorAddr(SDNode *Parent, SDValue N, SDValue &Base, + SDValue &Scale, SDValue &Index, + SDValue &Disp, SDValue &Segment) { + unsigned ScalarSize; + if (auto Mgs = dyn_cast<MaskedGatherScatterSDNode>(Parent)) { + Base = Mgs->getBasePtr(); + Index = Mgs->getIndex(); + ScalarSize = Mgs->getValue().getScalarValueSizeInBits(); + } else { + auto X86Gather = cast<X86MaskedGatherSDNode>(Parent); + Base = X86Gather->getBasePtr(); + Index = X86Gather->getIndex(); + ScalarSize = X86Gather->getValue().getScalarValueSizeInBits(); + } + X86ISelAddressMode AM; - unsigned AddrSpace = Mgs->getPointerInfo().getAddrSpace(); + unsigned AddrSpace = cast<MemSDNode>(Parent)->getPointerInfo().getAddrSpace(); // AddrSpace 256 -> GS, 257 -> FS, 258 -> SS. if (AddrSpace == 256) AM.Segment = CurDAG->getRegister(X86::GS, MVT::i16); @@ -1522,9 +1528,6 @@ bool X86DAGToDAGISel::selectAddrOfGatherScatterNode( AM.Segment = CurDAG->getRegister(X86::SS, MVT::i16); SDLoc DL(N); - Base = Mgs->getBasePtr(); - Index = Mgs->getIndex(); - unsigned ScalarSize = Mgs->getValue().getScalarValueSizeInBits(); Scale = getI8Imm(ScalarSize/8, DL); // If Base is 0, the whole address is in index and the Scale is 1 @@ -1542,18 +1545,6 @@ bool X86DAGToDAGISel::selectAddrOfGatherScatterNode( return true; } -bool X86DAGToDAGISel::selectVectorAddr(SDNode *Parent, SDValue N, SDValue &Base, - SDValue &Scale, SDValue &Index, - SDValue &Disp, SDValue &Segment) { - if (auto Mgs = dyn_cast<MaskedGatherScatterSDNode>(Parent)) - return selectAddrOfGatherScatterNode<MaskedGatherScatterSDNode>( - Mgs, N, Base, Scale, Index, Disp, Segment); - if (auto X86Gather = dyn_cast<X86MaskedGatherSDNode>(Parent)) - return selectAddrOfGatherScatterNode<X86MaskedGatherSDNode>( - X86Gather, N, Base, Scale, Index, Disp, Segment); - return false; -} - /// Returns true if it is able to pattern match an addressing mode. /// It returns the operands which make up the maximal addressing mode it can /// match by reference. |