mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-05-20 05:38:50 +00:00
Model 128-bit vld lane with REG_SEQUENCE.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@103868 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
1e03ff4243
commit
7189fd03fa
@ -1320,8 +1320,9 @@ SDNode *ARMDAGToDAGISel::SelectVST(SDNode *N, unsigned NumVecs,
|
|||||||
N->getOperand(Vec+3));
|
N->getOperand(Vec+3));
|
||||||
}
|
}
|
||||||
if (NumVecs == 3)
|
if (NumVecs == 3)
|
||||||
V[6] = V[7] =
|
V[6] = V[7] = SDValue(CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,
|
||||||
SDValue(CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,dl,RegVT), 0);
|
dl, RegVT), 0);
|
||||||
|
|
||||||
SDValue RegSeq = SDValue(OctoDRegs(MVT::v8i64, V[0], V[1], V[2], V[3],
|
SDValue RegSeq = SDValue(OctoDRegs(MVT::v8i64, V[0], V[1], V[2], V[3],
|
||||||
V[4], V[5], V[6], V[7]), 0);
|
V[4], V[5], V[6], V[7]), 0);
|
||||||
|
|
||||||
@ -1458,28 +1459,52 @@ SDNode *ARMDAGToDAGISel::SelectVLDSTLane(SDNode *N, bool IsLoad,
|
|||||||
ResTys.push_back(MVT::Other);
|
ResTys.push_back(MVT::Other);
|
||||||
SDNode *VLdLn = CurDAG->getMachineNode(Opc, dl, ResTys, Ops.data(),NumVecs+6);
|
SDNode *VLdLn = CurDAG->getMachineNode(Opc, dl, ResTys, Ops.data(),NumVecs+6);
|
||||||
|
|
||||||
if (llvm::ModelWithRegSequence() && is64BitVector) {
|
if (llvm::ModelWithRegSequence()) {
|
||||||
SDValue RegSeq;
|
|
||||||
SDValue V0 = SDValue(VLdLn, 0);
|
|
||||||
SDValue V1 = SDValue(VLdLn, 1);
|
|
||||||
|
|
||||||
// Form a REG_SEQUENCE to force register allocation.
|
// Form a REG_SEQUENCE to force register allocation.
|
||||||
if (NumVecs == 2) {
|
SDValue RegSeq;
|
||||||
RegSeq = SDValue(PairDRegs(MVT::v2i64, V0, V1), 0);
|
if (is64BitVector) {
|
||||||
} else {
|
SDValue V0 = SDValue(VLdLn, 0);
|
||||||
SDValue V2 = SDValue(VLdLn, 2);
|
SDValue V1 = SDValue(VLdLn, 1);
|
||||||
// If it's a vld3, form a quad D-register but discard the last part.
|
if (NumVecs == 2) {
|
||||||
SDValue V3 = (NumVecs == 3)
|
RegSeq = SDValue(PairDRegs(MVT::v2i64, V0, V1), 0);
|
||||||
|
} else {
|
||||||
|
SDValue V2 = SDValue(VLdLn, 2);
|
||||||
|
// If it's a vld3, form a quad D-register but discard the last part.
|
||||||
|
SDValue V3 = (NumVecs == 3)
|
||||||
? SDValue(CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,dl,VT), 0)
|
? SDValue(CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,dl,VT), 0)
|
||||||
: SDValue(VLdLn, 3);
|
: SDValue(VLdLn, 3);
|
||||||
RegSeq = SDValue(QuadDRegs(MVT::v4i64, V0, V1, V2, V3), 0);
|
RegSeq = SDValue(QuadDRegs(MVT::v4i64, V0, V1, V2, V3), 0);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// For 128-bit vectors, take the 64-bit results of the load and insert them
|
||||||
|
// as subregs into the result.
|
||||||
|
SDValue V[8];
|
||||||
|
for (unsigned Vec = 0, i = 0; Vec < NumVecs; ++Vec, i+=2) {
|
||||||
|
if (SubregIdx == ARM::DSUBREG_0) {
|
||||||
|
V[i] = SDValue(VLdLn, Vec);
|
||||||
|
V[i+1] = SDValue(CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,
|
||||||
|
dl, RegVT), 0);
|
||||||
|
} else {
|
||||||
|
V[i] = SDValue(CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,
|
||||||
|
dl, RegVT), 0);
|
||||||
|
V[i+1] = SDValue(VLdLn, Vec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (NumVecs == 3)
|
||||||
|
V[6] = V[7] = SDValue(CurDAG->getMachineNode(TargetOpcode::IMPLICIT_DEF,
|
||||||
|
dl, RegVT), 0);
|
||||||
|
|
||||||
|
if (NumVecs == 2)
|
||||||
|
RegSeq = SDValue(QuadDRegs(MVT::v4i64, V[0], V[1], V[2], V[3]), 0);
|
||||||
|
else
|
||||||
|
RegSeq = SDValue(OctoDRegs(MVT::v8i64, V[0], V[1], V[2], V[3],
|
||||||
|
V[4], V[5], V[6], V[7]), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (unsigned Vec = 0; Vec < NumVecs; ++Vec) {
|
unsigned SubIdx = is64BitVector ? ARM::DSUBREG_0 : ARM::QSUBREG_0;
|
||||||
SDValue D = CurDAG->getTargetExtractSubreg(ARM::DSUBREG_0+Vec, dl, VT,
|
for (unsigned Vec = 0; Vec < NumVecs; ++Vec)
|
||||||
RegSeq);
|
ReplaceUses(SDValue(N, Vec),
|
||||||
ReplaceUses(SDValue(N, Vec), D);
|
CurDAG->getTargetExtractSubreg(SubIdx+Vec, dl, VT, RegSeq));
|
||||||
}
|
|
||||||
ReplaceUses(SDValue(N, NumVecs), SDValue(VLdLn, NumVecs));
|
ReplaceUses(SDValue(N, NumVecs), SDValue(VLdLn, NumVecs));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user