mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-04-12 07:37:34 +00:00
Use VLD1/VST1 pseudo instructions for loadRegFromStackSlot and
storeRegToStackSlot. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@113918 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
22854b777e
commit
168f382dc6
lib/Target/ARM
@ -748,7 +748,7 @@ storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
|
||||
case ARM::QPR_VFP2RegClassID:
|
||||
case ARM::QPR_8RegClassID:
|
||||
if (Align >= 16 && getRegisterInfo().needsStackRealignment(MF)) {
|
||||
AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VST1q))
|
||||
AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VST1q64Pseudo))
|
||||
.addFrameIndex(FI).addImm(16)
|
||||
.addReg(SrcReg, getKillRegState(isKill))
|
||||
.addMemOperand(MMO));
|
||||
@ -765,13 +765,10 @@ storeRegToStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
|
||||
if (Align >= 16 && getRegisterInfo().canRealignStack(MF)) {
|
||||
// FIXME: It's possible to only store part of the QQ register if the
|
||||
// spilled def has a sub-register index.
|
||||
MachineInstrBuilder MIB = BuildMI(MBB, I, DL, get(ARM::VST1d64Q))
|
||||
.addFrameIndex(FI).addImm(16);
|
||||
MIB = AddDReg(MIB, SrcReg, ARM::dsub_0, getKillRegState(isKill), TRI);
|
||||
MIB = AddDReg(MIB, SrcReg, ARM::dsub_1, 0, TRI);
|
||||
MIB = AddDReg(MIB, SrcReg, ARM::dsub_2, 0, TRI);
|
||||
MIB = AddDReg(MIB, SrcReg, ARM::dsub_3, 0, TRI);
|
||||
AddDefaultPred(MIB.addMemOperand(MMO));
|
||||
AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VST1d64QPseudo))
|
||||
.addFrameIndex(FI).addImm(16)
|
||||
.addReg(SrcReg, getKillRegState(isKill))
|
||||
.addMemOperand(MMO));
|
||||
} else {
|
||||
MachineInstrBuilder MIB =
|
||||
AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VSTMD))
|
||||
@ -846,7 +843,7 @@ loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
|
||||
case ARM::QPR_VFP2RegClassID:
|
||||
case ARM::QPR_8RegClassID:
|
||||
if (Align >= 16 && getRegisterInfo().needsStackRealignment(MF)) {
|
||||
AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VLD1q), DestReg)
|
||||
AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VLD1q64Pseudo), DestReg)
|
||||
.addFrameIndex(FI).addImm(16)
|
||||
.addMemOperand(MMO));
|
||||
} else {
|
||||
@ -859,12 +856,9 @@ loadRegFromStackSlot(MachineBasicBlock &MBB, MachineBasicBlock::iterator I,
|
||||
case ARM::QQPRRegClassID:
|
||||
case ARM::QQPR_VFP2RegClassID:
|
||||
if (Align >= 16 && getRegisterInfo().canRealignStack(MF)) {
|
||||
MachineInstrBuilder MIB = BuildMI(MBB, I, DL, get(ARM::VLD1d64Q));
|
||||
MIB = AddDReg(MIB, DestReg, ARM::dsub_0, RegState::Define, TRI);
|
||||
MIB = AddDReg(MIB, DestReg, ARM::dsub_1, RegState::Define, TRI);
|
||||
MIB = AddDReg(MIB, DestReg, ARM::dsub_2, RegState::Define, TRI);
|
||||
MIB = AddDReg(MIB, DestReg, ARM::dsub_3, RegState::Define, TRI);
|
||||
AddDefaultPred(MIB.addFrameIndex(FI).addImm(16).addMemOperand(MMO));
|
||||
AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VLD1d64QPseudo), DestReg)
|
||||
.addFrameIndex(FI).addImm(16)
|
||||
.addMemOperand(MMO));
|
||||
} else {
|
||||
MachineInstrBuilder MIB =
|
||||
AddDefaultPred(BuildMI(MBB, I, DL, get(ARM::VLDMD))
|
||||
|
@ -138,15 +138,6 @@ def VLDMQ
|
||||
"vldm${addr:submode}${p}\t$addr, ${dst:dregpair}", "",
|
||||
[(set QPR:$dst, (v2f64 (load addrmode4:$addr)))]>;
|
||||
|
||||
let mayLoad = 1, neverHasSideEffects = 1 in {
|
||||
// Use vld1 to load a Q register as a D register pair.
|
||||
// This alternative to VLDMQ allows an alignment to be specified.
|
||||
// This is equivalent to VLD1q64 except that it has a Q register operand.
|
||||
def VLD1q
|
||||
: NLdSt<0,0b10,0b1010,0b1100, (outs QPR:$dst), (ins addrmode6:$addr),
|
||||
IIC_VLD1, "vld1", "64", "${dst:dregpair}, $addr", "", []>;
|
||||
} // mayLoad = 1, neverHasSideEffects = 1
|
||||
|
||||
// Use vstmia to store a Q register as a D register pair.
|
||||
// This is equivalent to VSTMD except that it has a Q register operand
|
||||
// instead of a pair of D registers.
|
||||
@ -156,15 +147,6 @@ def VSTMQ
|
||||
"vstm${addr:submode}${p}\t$addr, ${src:dregpair}", "",
|
||||
[(store (v2f64 QPR:$src), addrmode4:$addr)]>;
|
||||
|
||||
let mayStore = 1, neverHasSideEffects = 1 in {
|
||||
// Use vst1 to store a Q register as a D register pair.
|
||||
// This alternative to VSTMQ allows an alignment to be specified.
|
||||
// This is equivalent to VST1q64 except that it has a Q register operand.
|
||||
def VST1q
|
||||
: NLdSt<0,0b00,0b1010,0b1100, (outs), (ins addrmode6:$addr, QPR:$src),
|
||||
IIC_VST, "vst1", "64", "${src:dregpair}, $addr", "", []>;
|
||||
} // mayStore = 1, neverHasSideEffects = 1
|
||||
|
||||
let mayLoad = 1, neverHasSideEffects = 1, hasExtraDefRegAllocReq = 1 in {
|
||||
|
||||
// Classes for VLD* pseudo-instructions with multi-register operands.
|
||||
|
Loading…
x
Reference in New Issue
Block a user