mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-15 04:30:12 +00:00
ARM parsing for VLD1 all lanes, with writeback.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@145510 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
8ff4115ef0
commit
096334e25e
@ -2446,9 +2446,12 @@ ARMBaseInstrInfo::getOperandLatency(const InstrItineraryData *ItinData,
|
||||
case ARM::VLD1DUPq8:
|
||||
case ARM::VLD1DUPq16:
|
||||
case ARM::VLD1DUPq32:
|
||||
case ARM::VLD1DUPq8_UPD:
|
||||
case ARM::VLD1DUPq16_UPD:
|
||||
case ARM::VLD1DUPq32_UPD:
|
||||
case ARM::VLD1DUPq8wb_fixed:
|
||||
case ARM::VLD1DUPq16wb_fixed:
|
||||
case ARM::VLD1DUPq32wb_fixed:
|
||||
case ARM::VLD1DUPq8wb_register:
|
||||
case ARM::VLD1DUPq16wb_register:
|
||||
case ARM::VLD1DUPq32wb_register:
|
||||
case ARM::VLD2DUPd8:
|
||||
case ARM::VLD2DUPd16:
|
||||
case ARM::VLD2DUPd32:
|
||||
@ -2621,9 +2624,12 @@ ARMBaseInstrInfo::getOperandLatency(const InstrItineraryData *ItinData,
|
||||
case ARM::VLD1DUPq8Pseudo:
|
||||
case ARM::VLD1DUPq16Pseudo:
|
||||
case ARM::VLD1DUPq32Pseudo:
|
||||
case ARM::VLD1DUPq8Pseudo_UPD:
|
||||
case ARM::VLD1DUPq16Pseudo_UPD:
|
||||
case ARM::VLD1DUPq32Pseudo_UPD:
|
||||
case ARM::VLD1DUPq8PseudoWB_fixed:
|
||||
case ARM::VLD1DUPq16PseudoWB_fixed:
|
||||
case ARM::VLD1DUPq32PseudoWB_fixed:
|
||||
case ARM::VLD1DUPq8PseudoWB_register:
|
||||
case ARM::VLD1DUPq16PseudoWB_register:
|
||||
case ARM::VLD1DUPq32PseudoWB_register:
|
||||
case ARM::VLD2DUPd8Pseudo:
|
||||
case ARM::VLD2DUPd16Pseudo:
|
||||
case ARM::VLD2DUPd32Pseudo:
|
||||
|
@ -130,11 +130,14 @@ namespace {
|
||||
|
||||
static const NEONLdStTableEntry NEONLdStTable[] = {
|
||||
{ ARM::VLD1DUPq16Pseudo, ARM::VLD1DUPq16, true, false, false, SingleSpc, 2, 4,false},
|
||||
{ ARM::VLD1DUPq16Pseudo_UPD, ARM::VLD1DUPq16_UPD, true, true, true, SingleSpc, 2, 4,true},
|
||||
{ ARM::VLD1DUPq16PseudoWB_fixed, ARM::VLD1DUPq16wb_fixed, true, true, true, SingleSpc, 2, 4,false},
|
||||
{ ARM::VLD1DUPq16PseudoWB_register, ARM::VLD1DUPq16wb_register, true, true, true, SingleSpc, 2, 4,false},
|
||||
{ ARM::VLD1DUPq32Pseudo, ARM::VLD1DUPq32, true, false, false, SingleSpc, 2, 2,false},
|
||||
{ ARM::VLD1DUPq32Pseudo_UPD, ARM::VLD1DUPq32_UPD, true, true, true, SingleSpc, 2, 2,true},
|
||||
{ ARM::VLD1DUPq32PseudoWB_fixed, ARM::VLD1DUPq32wb_fixed, true, true, false, SingleSpc, 2, 2,false},
|
||||
{ ARM::VLD1DUPq32PseudoWB_register, ARM::VLD1DUPq32wb_register, true, true, true, SingleSpc, 2, 2,false},
|
||||
{ ARM::VLD1DUPq8Pseudo, ARM::VLD1DUPq8, true, false, false, SingleSpc, 2, 8,false},
|
||||
{ ARM::VLD1DUPq8Pseudo_UPD, ARM::VLD1DUPq8_UPD, true, true, true, SingleSpc, 2, 8,true},
|
||||
{ ARM::VLD1DUPq8PseudoWB_fixed, ARM::VLD1DUPq8wb_fixed, true, true, false, SingleSpc, 2, 8,false},
|
||||
{ ARM::VLD1DUPq8PseudoWB_register, ARM::VLD1DUPq8wb_register, true, true, true, SingleSpc, 2, 8,false},
|
||||
|
||||
{ ARM::VLD1LNq16Pseudo, ARM::VLD1LNd16, true, false, false, EvenDblSpc, 1, 4 ,true},
|
||||
{ ARM::VLD1LNq16Pseudo_UPD, ARM::VLD1LNd16_UPD, true, true, true, EvenDblSpc, 1, 4 ,true},
|
||||
@ -1133,9 +1136,12 @@ bool ARMExpandPseudo::ExpandMI(MachineBasicBlock &MBB,
|
||||
case ARM::VLD1DUPq8Pseudo:
|
||||
case ARM::VLD1DUPq16Pseudo:
|
||||
case ARM::VLD1DUPq32Pseudo:
|
||||
case ARM::VLD1DUPq8Pseudo_UPD:
|
||||
case ARM::VLD1DUPq16Pseudo_UPD:
|
||||
case ARM::VLD1DUPq32Pseudo_UPD:
|
||||
case ARM::VLD1DUPq8PseudoWB_fixed:
|
||||
case ARM::VLD1DUPq16PseudoWB_fixed:
|
||||
case ARM::VLD1DUPq32PseudoWB_fixed:
|
||||
case ARM::VLD1DUPq8PseudoWB_register:
|
||||
case ARM::VLD1DUPq16PseudoWB_register:
|
||||
case ARM::VLD1DUPq32PseudoWB_register:
|
||||
case ARM::VLD2DUPd8Pseudo:
|
||||
case ARM::VLD2DUPd16Pseudo:
|
||||
case ARM::VLD2DUPd32Pseudo:
|
||||
|
@ -1065,32 +1065,63 @@ def VLD1DUPq16 : VLD1QDUP<{0,1,1,?}, "16">;
|
||||
def VLD1DUPq32 : VLD1QDUP<{1,0,1,?}, "32">;
|
||||
|
||||
// ...with address register writeback:
|
||||
class VLD1DUPWB<bits<4> op7_4, string Dt>
|
||||
: NLdSt<1, 0b10, 0b1100, op7_4, (outs DPR:$Vd, GPR:$wb),
|
||||
(ins addrmode6dup:$Rn, am6offset:$Rm), IIC_VLD1dupu,
|
||||
"vld1", Dt, "\\{$Vd[]\\}, $Rn$Rm", "$Rn.addr = $wb", []> {
|
||||
multiclass VLD1DUPWB<bits<4> op7_4, string Dt> {
|
||||
def _fixed : NLdSt<1, 0b10, 0b1100, op7_4,
|
||||
(outs VecListOneDAllLanes:$Vd, GPR:$wb),
|
||||
(ins addrmode6dup:$Rn), IIC_VLD1dupu,
|
||||
"vld1", Dt, "$Vd, $Rn!",
|
||||
"$Rn.addr = $wb", []> {
|
||||
let Rm = 0b1101; // NLdSt will assign to the right encoding bits.
|
||||
let Inst{4} = Rn{4};
|
||||
let DecoderMethod = "DecodeVLD1DupInstruction";
|
||||
let AsmMatchConverter = "cvtVLDwbFixed";
|
||||
}
|
||||
class VLD1QDUPWB<bits<4> op7_4, string Dt>
|
||||
: NLdSt<1, 0b10, 0b1100, op7_4, (outs DPR:$Vd, DPR:$dst2, GPR:$wb),
|
||||
(ins addrmode6dup:$Rn, am6offset:$Rm), IIC_VLD1dupu,
|
||||
"vld1", Dt, "\\{$Vd[], $dst2[]\\}, $Rn$Rm", "$Rn.addr = $wb", []> {
|
||||
def _register : NLdSt<1, 0b10, 0b1100, op7_4,
|
||||
(outs VecListOneDAllLanes:$Vd, GPR:$wb),
|
||||
(ins addrmode6dup:$Rn, rGPR:$Rm), IIC_VLD1dupu,
|
||||
"vld1", Dt, "$Vd, $Rn, $Rm",
|
||||
"$Rn.addr = $wb", []> {
|
||||
let Inst{4} = Rn{4};
|
||||
let DecoderMethod = "DecodeVLD1DupInstruction";
|
||||
let AsmMatchConverter = "cvtVLDwbRegister";
|
||||
}
|
||||
}
|
||||
multiclass VLD1QDUPWB<bits<4> op7_4, string Dt> {
|
||||
def _fixed : NLdSt<1, 0b10, 0b1100, op7_4,
|
||||
(outs VecListTwoDAllLanes:$Vd, GPR:$wb),
|
||||
(ins addrmode6dup:$Rn), IIC_VLD1dupu,
|
||||
"vld1", Dt, "$Vd, $Rn!",
|
||||
"$Rn.addr = $wb", []> {
|
||||
let Rm = 0b1101; // NLdSt will assign to the right encoding bits.
|
||||
let Inst{4} = Rn{4};
|
||||
let DecoderMethod = "DecodeVLD1DupInstruction";
|
||||
let AsmMatchConverter = "cvtVLDwbFixed";
|
||||
}
|
||||
def _register : NLdSt<1, 0b10, 0b1100, op7_4,
|
||||
(outs VecListTwoDAllLanes:$Vd, GPR:$wb),
|
||||
(ins addrmode6dup:$Rn, rGPR:$Rm), IIC_VLD1dupu,
|
||||
"vld1", Dt, "$Vd, $Rn, $Rm",
|
||||
"$Rn.addr = $wb", []> {
|
||||
let Inst{4} = Rn{4};
|
||||
let DecoderMethod = "DecodeVLD1DupInstruction";
|
||||
let AsmMatchConverter = "cvtVLDwbRegister";
|
||||
}
|
||||
}
|
||||
|
||||
def VLD1DUPd8_UPD : VLD1DUPWB<{0,0,0,0}, "8">;
|
||||
def VLD1DUPd16_UPD : VLD1DUPWB<{0,1,0,?}, "16">;
|
||||
def VLD1DUPd32_UPD : VLD1DUPWB<{1,0,0,?}, "32">;
|
||||
defm VLD1DUPd8wb : VLD1DUPWB<{0,0,0,0}, "8">;
|
||||
defm VLD1DUPd16wb : VLD1DUPWB<{0,1,0,?}, "16">;
|
||||
defm VLD1DUPd32wb : VLD1DUPWB<{1,0,0,?}, "32">;
|
||||
|
||||
def VLD1DUPq8_UPD : VLD1QDUPWB<{0,0,1,0}, "8">;
|
||||
def VLD1DUPq16_UPD : VLD1QDUPWB<{0,1,1,?}, "16">;
|
||||
def VLD1DUPq32_UPD : VLD1QDUPWB<{1,0,1,?}, "32">;
|
||||
defm VLD1DUPq8wb : VLD1QDUPWB<{0,0,1,0}, "8">;
|
||||
defm VLD1DUPq16wb : VLD1QDUPWB<{0,1,1,?}, "16">;
|
||||
defm VLD1DUPq32wb : VLD1QDUPWB<{1,0,1,?}, "32">;
|
||||
|
||||
def VLD1DUPq8Pseudo_UPD : VLDQWBPseudo<IIC_VLD1dupu>;
|
||||
def VLD1DUPq16Pseudo_UPD : VLDQWBPseudo<IIC_VLD1dupu>;
|
||||
def VLD1DUPq32Pseudo_UPD : VLDQWBPseudo<IIC_VLD1dupu>;
|
||||
def VLD1DUPq8PseudoWB_fixed : VLDQWBfixedPseudo<IIC_VLD1dupu>;
|
||||
def VLD1DUPq16PseudoWB_fixed : VLDQWBfixedPseudo<IIC_VLD1dupu>;
|
||||
def VLD1DUPq32PseudoWB_fixed : VLDQWBfixedPseudo<IIC_VLD1dupu>;
|
||||
def VLD1DUPq8PseudoWB_register : VLDQWBregisterPseudo<IIC_VLD1dupu>;
|
||||
def VLD1DUPq16PseudoWB_register : VLDQWBregisterPseudo<IIC_VLD1dupu>;
|
||||
def VLD1DUPq32PseudoWB_register : VLDQWBregisterPseudo<IIC_VLD1dupu>;
|
||||
|
||||
// VLD2DUP : Vector Load (single 2-element structure to all lanes)
|
||||
class VLD2DUP<bits<4> op7_4, string Dt>
|
||||
|
@ -2415,10 +2415,6 @@ static DecodeStatus DecodeVLD1DupInstruction(llvm::MCInst &Inst, unsigned Insn,
|
||||
|
||||
if (!Check(S, DecodeDPRRegisterClass(Inst, Rd, Address, Decoder)))
|
||||
return MCDisassembler::Fail;
|
||||
if (regs == 2) {
|
||||
if (!Check(S, DecodeDPRRegisterClass(Inst, (Rd+1)%32, Address, Decoder)))
|
||||
return MCDisassembler::Fail;
|
||||
}
|
||||
if (Rm != 0xF) {
|
||||
if (!Check(S, DecodeGPRRegisterClass(Inst, Rn, Address, Decoder)))
|
||||
return MCDisassembler::Fail;
|
||||
@ -2428,12 +2424,12 @@ static DecodeStatus DecodeVLD1DupInstruction(llvm::MCInst &Inst, unsigned Insn,
|
||||
return MCDisassembler::Fail;
|
||||
Inst.addOperand(MCOperand::CreateImm(align));
|
||||
|
||||
if (Rm == 0xD)
|
||||
Inst.addOperand(MCOperand::CreateReg(0));
|
||||
else if (Rm != 0xF) {
|
||||
if (!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
|
||||
// The fixed offset post-increment encodes Rm == 0xd. The no-writeback
|
||||
// variant encodes Rm == 0xf. Anything else is a register offset post-
|
||||
// increment and we need to add the register operand to the instruction.
|
||||
if (Rm != 0xD && Rm != 0xF &&
|
||||
!Check(S, DecodeGPRRegisterClass(Inst, Rm, Address, Decoder)))
|
||||
return MCDisassembler::Fail;
|
||||
}
|
||||
|
||||
return S;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user