mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-21 06:30:16 +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;
|
return Op;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDValue AArch64TargetLowering::LowerBUILD_VECTOR(SDValue Op,
|
// Normalize the operands of BUILD_VECTOR. The value of constant operands will
|
||||||
SelectionDAG &DAG) const {
|
// be truncated to fit element width.
|
||||||
BuildVectorSDNode *BVN = cast<BuildVectorSDNode>(Op.getNode());
|
static SDValue NormalizeBuildVector(SDValue Op,
|
||||||
|
SelectionDAG &DAG) {
|
||||||
|
assert(Op.getOpcode() == ISD::BUILD_VECTOR && "Unknown opcode!");
|
||||||
SDLoc dl(Op);
|
SDLoc dl(Op);
|
||||||
EVT VT = Op.getValueType();
|
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 CnstBits(VT.getSizeInBits(), 0);
|
||||||
APInt UndefBits(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 {
|
define <8 x i16> @build_all_zero(<8 x i16> %a) #1 {
|
||||||
; CHECK-LABEL: build_all_zero:
|
; 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: fmov s[[FREG:[0-9]+]], w[[GREG]]
|
||||||
; CHECK-NEXT: mul.8h v0, v0, v[[FREG]]
|
; 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>
|
%b = add <8 x i16> %a, <i16 -32768, i16 undef, i16 undef, i16 undef, i16 undef, i16 undef, i16 undef, i16 undef>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user