Skip to content

Commit

Permalink
[ARM] Do not scale vext with a factor
Browse files Browse the repository at this point in the history
The vext pseudo-instruction takes the number of elements that need to be
extracted, not the number of bytes. Hence, use the number of elements
directly instead of scaling them with a factor.

Reviewers: Silviu Baranga, James Molloy
(not reflected in the differential revision)

Differential Revision: http://reviews.llvm.org/D12974

llvm-svn: 248208
  • Loading branch information
Jeroen Ketema committed Sep 21, 2015
1 parent 8abf7c8 commit 41681a5
Show file tree
Hide file tree
Showing 2 changed files with 12 additions and 9 deletions.
10 changes: 1 addition & 9 deletions llvm/lib/Target/ARM/ARMISelLowering.cpp
Expand Up @@ -5515,13 +5515,6 @@ SDValue ARMTargetLowering::LowerBUILD_VECTOR(SDValue Op, SelectionDAG &DAG,
return SDValue();
}

/// getExtFactor - Determine the adjustment factor for the position when
/// generating an "extract from vector registers" instruction.
static unsigned getExtFactor(SDValue &V) {
EVT EltType = V.getValueType().getVectorElementType();
return EltType.getSizeInBits() / 8;
}

// Gather data to see if the operation can be modelled as a
// shuffle in combination with VEXTs.
SDValue ARMTargetLowering::ReconstructShuffle(SDValue Op,
Expand Down Expand Up @@ -5652,11 +5645,10 @@ SDValue ARMTargetLowering::ReconstructShuffle(SDValue Op,
SDValue VEXTSrc2 =
DAG.getNode(ISD::EXTRACT_SUBVECTOR, dl, DestVT, Src.ShuffleVec,
DAG.getConstant(NumSrcElts, dl, MVT::i32));
unsigned Imm = Src.MinElt * getExtFactor(VEXTSrc1);

Src.ShuffleVec = DAG.getNode(ARMISD::VEXT, dl, DestVT, VEXTSrc1,
VEXTSrc2,
DAG.getConstant(Imm, dl, MVT::i32));
DAG.getConstant(Src.MinElt, dl, MVT::i32));
Src.WindowBase = -Src.MinElt;
}
}
Expand Down
11 changes: 11 additions & 0 deletions llvm/test/CodeGen/ARM/vzip.ll
Expand Up @@ -305,3 +305,14 @@ entry:
store <4 x i32> %0, <4 x i32>* %B
ret void
}

define void @vzip_vext_factor(<8 x i16>* %A, <4 x i16>* %B) {
entry:
; CHECK-LABEL: vzip_vext_factor
; CHECK: vext.16 d16, d16, d17, #3
; CHECK: vzip
%tmp1 = load <8 x i16>, <8 x i16>* %A
%0 = shufflevector <8 x i16> %tmp1, <8 x i16> undef, <4 x i32> <i32 4, i32 4, i32 5, i32 3>
store <4 x i16> %0, <4 x i16>* %B
ret void
}

0 comments on commit 41681a5

Please sign in to comment.