mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-23 20:45:06 +00:00
[AArch64] Normalize all constants to build a vector.
The value of constant operands will be truncated to fit element width. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@212428 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
466769dd97
commit
307e97d066
@ -5181,11 +5181,37 @@ FailedModImm:
|
||||
return Op;
|
||||
}
|
||||
|
||||
SDValue AArch64TargetLowering::LowerBUILD_VECTOR(SDValue Op,
|
||||
SelectionDAG &DAG) const {
|
||||
BuildVectorSDNode *BVN = cast<BuildVectorSDNode>(Op.getNode());
|
||||
// Normalize the operands of BUILD_VECTOR. The value of constant operands will
|
||||
// be truncated to fit element width.
|
||||
static SDValue NormalizeBuildVector(SDValue Op,
|
||||
SelectionDAG &DAG) {
|
||||
assert(Op.getOpcode() == ISD::BUILD_VECTOR && "Unknown opcode!");
|
||||
SDLoc dl(Op);
|
||||
EVT VT = Op.getValueType();
|
||||
EVT EltTy= VT.getVectorElementType();
|
||||
|
||||
if (EltTy.isFloatingPoint() || EltTy.getSizeInBits() > 16)
|
||||
return Op;
|
||||
|
||||
SmallVector<SDValue, 16> Ops;
|
||||
for (unsigned I = 0, E = VT.getVectorNumElements(); I != E; ++I) {
|
||||
SDValue Lane = Op.getOperand(I);
|
||||
if (Lane.getOpcode() == ISD::Constant) {
|
||||
APInt LowBits(EltTy.getSizeInBits(),
|
||||
cast<ConstantSDNode>(Lane)->getZExtValue());
|
||||
Lane = DAG.getConstant(LowBits.getZExtValue(), MVT::i32);
|
||||
}
|
||||
Ops.push_back(Lane);
|
||||
}
|
||||
return DAG.getNode(ISD::BUILD_VECTOR, dl, VT, Ops);
|
||||
}
|
||||
|
||||
SDValue AArch64TargetLowering::LowerBUILD_VECTOR(SDValue Op,
|
||||
SelectionDAG &DAG) const {
|
||||
SDLoc dl(Op);
|
||||
EVT VT = Op.getValueType();
|
||||
Op = NormalizeBuildVector(Op, DAG);
|
||||
BuildVectorSDNode *BVN = cast<BuildVectorSDNode>(Op.getNode());
|
||||
|
||||
APInt CnstBits(VT.getSizeInBits(), 0);
|
||||
APInt UndefBits(VT.getSizeInBits(), 0);
|
||||
|
@ -36,7 +36,7 @@ define <4 x float> @foo(float %a, float %b, float %c, float %d) nounwind {
|
||||
|
||||
define <8 x i16> @build_all_zero(<8 x i16> %a) #1 {
|
||||
; CHECK-LABEL: build_all_zero:
|
||||
; CHECK: movn w[[GREG:[0-9]+]], #0x517f
|
||||
; CHECK: movz w[[GREG:[0-9]+]], #0xae80
|
||||
; CHECK-NEXT: fmov s[[FREG:[0-9]+]], w[[GREG]]
|
||||
; CHECK-NEXT: mul.8h v0, v0, v[[FREG]]
|
||||
%b = add <8 x i16> %a, <i16 -32768, i16 undef, i16 undef, i16 undef, i16 undef, i16 undef, i16 undef, i16 undef>
|
||||
|
Loading…
Reference in New Issue
Block a user