[X86] Use extract_vector_elt instead of X86ISD::VEXTRACT for isel of vXi1 extractions.
llvm-svn: 320937
This commit is contained in:
parent
c0c2d19e08
commit
ee1e71e576
|
|
@ -14575,6 +14575,12 @@ static SDValue ExtractBitFromMaskVector(SDValue Op, SelectionDAG &DAG,
|
|||
return DAG.getAnyExtOrTrunc(Extract, dl, EltVT);
|
||||
}
|
||||
|
||||
unsigned IdxVal = cast<ConstantSDNode>(Idx)->getZExtValue();
|
||||
|
||||
// Extracts from element 0 are always allowed.
|
||||
if (IdxVal == 0)
|
||||
return Op;
|
||||
|
||||
// If the kshift instructions of the correct width aren't natively supported
|
||||
// then we need to promote the vector to the native size to get the correct
|
||||
// zeroing behavior.
|
||||
|
|
@ -14587,12 +14593,10 @@ static SDValue ExtractBitFromMaskVector(SDValue Op, SelectionDAG &DAG,
|
|||
DAG.getIntPtrConstant(0, dl));
|
||||
}
|
||||
|
||||
// Use kshiftlw/rw instruction.
|
||||
unsigned IdxVal = cast<ConstantSDNode>(Idx)->getZExtValue();
|
||||
if (IdxVal != 0)
|
||||
Vec = DAG.getNode(X86ISD::KSHIFTR, dl, VecVT, Vec,
|
||||
DAG.getConstant(IdxVal, dl, MVT::i8));
|
||||
return DAG.getNode(X86ISD::VEXTRACT, dl, Op.getSimpleValueType(), Vec,
|
||||
// Use kshiftr instruction to move to the lower element.
|
||||
Vec = DAG.getNode(X86ISD::KSHIFTR, dl, VecVT, Vec,
|
||||
DAG.getConstant(IdxVal, dl, MVT::i8));
|
||||
return DAG.getNode(ISD::EXTRACT_VECTOR_ELT, dl, MVT::i32, Vec,
|
||||
DAG.getIntPtrConstant(0, dl));
|
||||
}
|
||||
|
||||
|
|
@ -25217,7 +25221,6 @@ const char *X86TargetLowering::getTargetNodeName(unsigned Opcode) const {
|
|||
case X86ISD::VBROADCAST: return "X86ISD::VBROADCAST";
|
||||
case X86ISD::VBROADCASTM: return "X86ISD::VBROADCASTM";
|
||||
case X86ISD::SUBV_BROADCAST: return "X86ISD::SUBV_BROADCAST";
|
||||
case X86ISD::VEXTRACT: return "X86ISD::VEXTRACT";
|
||||
case X86ISD::VPERMILPV: return "X86ISD::VPERMILPV";
|
||||
case X86ISD::VPERMILPI: return "X86ISD::VPERMILPI";
|
||||
case X86ISD::VPERM2X128: return "X86ISD::VPERM2X128";
|
||||
|
|
|
|||
|
|
@ -453,9 +453,6 @@ namespace llvm {
|
|||
// Broadcast subvector to vector.
|
||||
SUBV_BROADCAST,
|
||||
|
||||
// Extract vector element.
|
||||
VEXTRACT,
|
||||
|
||||
/// SSE4A Extraction and Insertion.
|
||||
EXTRQI, INSERTQI,
|
||||
|
||||
|
|
|
|||
|
|
@ -2768,7 +2768,7 @@ let Predicates = [HasAVX512] in {
|
|||
def : Pat<(maskVT (scalar_to_vector GR32:$src)),
|
||||
(COPY_TO_REGCLASS GR32:$src, maskRC)>;
|
||||
|
||||
def : Pat<(i32 (X86Vextract maskRC:$src, (iPTR 0))),
|
||||
def : Pat<(i32 (X86kextract maskRC:$src, (iPTR 0))),
|
||||
(COPY_TO_REGCLASS maskRC:$src, GR32)>;
|
||||
|
||||
def : Pat<(maskVT (scalar_to_vector GR8:$src)),
|
||||
|
|
|
|||
|
|
@ -465,9 +465,10 @@ def X86SubVBroadcast : SDNode<"X86ISD::SUBV_BROADCAST",
|
|||
|
||||
def X86VBroadcast : SDNode<"X86ISD::VBROADCAST", SDTVBroadcast>;
|
||||
def X86VBroadcastm : SDNode<"X86ISD::VBROADCASTM", SDTVBroadcastm>;
|
||||
def X86Vextract : SDNode<"X86ISD::VEXTRACT", SDTypeProfile<1, 2,
|
||||
[SDTCisVec<1>,
|
||||
SDTCisPtrTy<2>]>, []>;
|
||||
def X86kextract : SDNode<"ISD::EXTRACT_VECTOR_ELT",
|
||||
SDTypeProfile<1, 2, [SDTCisVT<0, i32>,
|
||||
SDTCVecEltisVT<1, i1>,
|
||||
SDTCisPtrTy<2>]>>;
|
||||
|
||||
def X86Blendi : SDNode<"X86ISD::BLENDI", SDTBlend>;
|
||||
|
||||
|
|
|
|||
|
|
@ -48,11 +48,11 @@ target triple = "x86_64-unknown-linux-gnu"
|
|||
; SKX-NEXT: fldz
|
||||
; SKX-NEXT: fld %st(0)
|
||||
; SKX-NEXT: fcmovne %st(2), %st(0)
|
||||
; SKX-NEXT: kmovd %k1, %eax
|
||||
; SKX-NEXT: kshiftrw $1, %k0, %k2
|
||||
; SKX-NEXT: kmovd %k2, %eax
|
||||
; SKX-NEXT: testb $1, %al
|
||||
; SKX-NEXT: fld %st(1)
|
||||
; SKX-NEXT: fcmovne %st(3), %st(0)
|
||||
; SKX-NEXT: kshiftrw $1, %k0, %k1
|
||||
; SKX-NEXT: kmovd %k1, %eax
|
||||
; SKX-NEXT: testb $1, %al
|
||||
; SKX-NEXT: fld %st(2)
|
||||
|
|
@ -65,9 +65,9 @@ target triple = "x86_64-unknown-linux-gnu"
|
|||
; SKX-NEXT: fxch %st(3)
|
||||
; SKX-NEXT: fstpt (%rdi)
|
||||
; SKX-NEXT: fxch %st(1)
|
||||
; SKX-NEXT: fstpt 10(%rdi)
|
||||
; SKX-NEXT: fxch %st(1)
|
||||
; SKX-NEXT: fstpt 20(%rdi)
|
||||
; SKX-NEXT: fxch %st(1)
|
||||
; SKX-NEXT: fstpt 10(%rdi)
|
||||
; SKX-NEXT: fstpt 30(%rdi)
|
||||
; SKX-NEXT: retq
|
||||
bb:
|
||||
|
|
|
|||
Loading…
Reference in New Issue