mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-05-15 16:38:41 +00:00
Convert ADCS and SBCS instructions into pseudos that are expanded to the ADC/ABC with the appropriate S-bit input value.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@128892 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
ac42a19217
commit
15b81b51d6
@ -55,6 +55,7 @@ namespace {
|
|||||||
void ExpandVLD(MachineBasicBlock::iterator &MBBI);
|
void ExpandVLD(MachineBasicBlock::iterator &MBBI);
|
||||||
void ExpandVST(MachineBasicBlock::iterator &MBBI);
|
void ExpandVST(MachineBasicBlock::iterator &MBBI);
|
||||||
void ExpandLaneOp(MachineBasicBlock::iterator &MBBI);
|
void ExpandLaneOp(MachineBasicBlock::iterator &MBBI);
|
||||||
|
void ExpandSBitOp(MachineBasicBlock::iterator &MBBI);
|
||||||
void ExpandVTBL(MachineBasicBlock::iterator &MBBI,
|
void ExpandVTBL(MachineBasicBlock::iterator &MBBI,
|
||||||
unsigned Opc, bool IsExt, unsigned NumRegs);
|
unsigned Opc, bool IsExt, unsigned NumRegs);
|
||||||
void ExpandMOV32BitImm(MachineBasicBlock &MBB,
|
void ExpandMOV32BitImm(MachineBasicBlock &MBB,
|
||||||
@ -629,6 +630,43 @@ void ARMExpandPseudo::ExpandVTBL(MachineBasicBlock::iterator &MBBI,
|
|||||||
MI.eraseFromParent();
|
MI.eraseFromParent();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ARMExpandPseudo::ExpandSBitOp(MachineBasicBlock::iterator &MBBI) {
|
||||||
|
MachineInstr &MI = *MBBI;
|
||||||
|
MachineBasicBlock &MBB = *MI.getParent();
|
||||||
|
unsigned OldOpc = MI.getOpcode();
|
||||||
|
unsigned Opc = 0;
|
||||||
|
switch (OldOpc) {
|
||||||
|
case ARM::ADCSSrr:
|
||||||
|
Opc = ARM::ADCrr;
|
||||||
|
break;
|
||||||
|
case ARM::ADCSSri:
|
||||||
|
Opc = ARM::ADCri;
|
||||||
|
break;
|
||||||
|
case ARM::ADCSSrs:
|
||||||
|
Opc = ARM::ADCrs;
|
||||||
|
break;
|
||||||
|
case ARM::SBCSSrr:
|
||||||
|
Opc = ARM::SBCrr;
|
||||||
|
break;
|
||||||
|
case ARM::SBCSSri:
|
||||||
|
Opc = ARM::SBCri;
|
||||||
|
break;
|
||||||
|
case ARM::SBCSSrs:
|
||||||
|
Opc = ARM::SBCrs;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
llvm_unreachable("Unknown opcode?");
|
||||||
|
}
|
||||||
|
|
||||||
|
MachineInstrBuilder MIB = BuildMI(MBB, MBBI, MI.getDebugLoc(), TII->get(Opc));
|
||||||
|
MIB.addOperand(MachineOperand::CreateImm(0)); // Predicate
|
||||||
|
MIB.addOperand(MachineOperand::CreateImm(0)); // S bit
|
||||||
|
for (unsigned i = 0; i < MI.getNumOperands(); ++i)
|
||||||
|
MIB.addOperand(MI.getOperand(i));
|
||||||
|
TransferImpOps(MI, MIB, MIB);
|
||||||
|
MI.eraseFromParent();
|
||||||
|
}
|
||||||
|
|
||||||
void ARMExpandPseudo::ExpandMOV32BitImm(MachineBasicBlock &MBB,
|
void ARMExpandPseudo::ExpandMOV32BitImm(MachineBasicBlock &MBB,
|
||||||
MachineBasicBlock::iterator &MBBI) {
|
MachineBasicBlock::iterator &MBBI) {
|
||||||
MachineInstr &MI = *MBBI;
|
MachineInstr &MI = *MBBI;
|
||||||
@ -941,6 +979,15 @@ bool ARMExpandPseudo::ExpandMI(MachineBasicBlock &MBB,
|
|||||||
ExpandMOV32BitImm(MBB, MBBI);
|
ExpandMOV32BitImm(MBB, MBBI);
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
case ARM::ADCSSri:
|
||||||
|
case ARM::ADCSSrr:
|
||||||
|
case ARM::ADCSSrs:
|
||||||
|
case ARM::SBCSSri:
|
||||||
|
case ARM::SBCSSrr:
|
||||||
|
case ARM::SBCSSrs:
|
||||||
|
ExpandSBitOp(MBBI);
|
||||||
|
return true;
|
||||||
|
|
||||||
case ARM::VMOVQQ: {
|
case ARM::VMOVQQ: {
|
||||||
unsigned DstReg = MI.getOperand(0).getReg();
|
unsigned DstReg = MI.getOperand(0).getReg();
|
||||||
bool DstIsDead = MI.getOperand(0).isDead();
|
bool DstIsDead = MI.getOperand(0).isDead();
|
||||||
|
@ -938,50 +938,18 @@ multiclass AI1_adde_sube_irs<bits<4> opcod, string opc, PatFrag opnode,
|
|||||||
let isCodeGenOnly = 1, Defs = [CPSR] in {
|
let isCodeGenOnly = 1, Defs = [CPSR] in {
|
||||||
multiclass AI1_adde_sube_s_irs<bits<4> opcod, string opc, PatFrag opnode,
|
multiclass AI1_adde_sube_s_irs<bits<4> opcod, string opc, PatFrag opnode,
|
||||||
bit Commutable = 0> {
|
bit Commutable = 0> {
|
||||||
def Sri : AXI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, so_imm:$imm),
|
def Sri : ARMPseudoInst<(outs GPR:$Rd), (ins GPR:$Rn, so_imm:$imm),
|
||||||
DPFrm, IIC_iALUi, !strconcat(opc, "\t$Rd, $Rn, $imm"),
|
Size4Bytes, IIC_iALUi,
|
||||||
[(set GPR:$Rd, (opnode GPR:$Rn, so_imm:$imm))]>,
|
[(set GPR:$Rd, (opnode GPR:$Rn, so_imm:$imm))]>,
|
||||||
Requires<[IsARM]> {
|
Requires<[IsARM]>;
|
||||||
bits<4> Rd;
|
def Srr : ARMPseudoInst<(outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm),
|
||||||
bits<4> Rn;
|
Size4Bytes, IIC_iALUr,
|
||||||
bits<12> imm;
|
|
||||||
let Inst{31-27} = 0b1110; // non-predicated
|
|
||||||
let Inst{15-12} = Rd;
|
|
||||||
let Inst{19-16} = Rn;
|
|
||||||
let Inst{11-0} = imm;
|
|
||||||
let Inst{20} = 1;
|
|
||||||
let Inst{25} = 1;
|
|
||||||
}
|
|
||||||
def Srr : AXI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, GPR:$Rm),
|
|
||||||
DPFrm, IIC_iALUr, !strconcat(opc, "\t$Rd, $Rn, $Rm"),
|
|
||||||
[(set GPR:$Rd, (opnode GPR:$Rn, GPR:$Rm))]>,
|
[(set GPR:$Rd, (opnode GPR:$Rn, GPR:$Rm))]>,
|
||||||
Requires<[IsARM]> {
|
Requires<[IsARM]>;
|
||||||
bits<4> Rd;
|
def Srs : ARMPseudoInst<(outs GPR:$Rd), (ins GPR:$Rn, so_reg:$shift),
|
||||||
bits<4> Rn;
|
Size4Bytes, IIC_iALUsr,
|
||||||
bits<4> Rm;
|
|
||||||
let Inst{31-27} = 0b1110; // non-predicated
|
|
||||||
let Inst{11-4} = 0b00000000;
|
|
||||||
let isCommutable = Commutable;
|
|
||||||
let Inst{3-0} = Rm;
|
|
||||||
let Inst{15-12} = Rd;
|
|
||||||
let Inst{19-16} = Rn;
|
|
||||||
let Inst{20} = 1;
|
|
||||||
let Inst{25} = 0;
|
|
||||||
}
|
|
||||||
def Srs : AXI1<opcod, (outs GPR:$Rd), (ins GPR:$Rn, so_reg:$shift),
|
|
||||||
DPSoRegFrm, IIC_iALUsr, !strconcat(opc, "\t$Rd, $Rn, $shift"),
|
|
||||||
[(set GPR:$Rd, (opnode GPR:$Rn, so_reg:$shift))]>,
|
[(set GPR:$Rd, (opnode GPR:$Rn, so_reg:$shift))]>,
|
||||||
Requires<[IsARM]> {
|
Requires<[IsARM]>;
|
||||||
bits<4> Rd;
|
|
||||||
bits<4> Rn;
|
|
||||||
bits<12> shift;
|
|
||||||
let Inst{31-27} = 0b1110; // non-predicated
|
|
||||||
let Inst{11-0} = shift;
|
|
||||||
let Inst{15-12} = Rd;
|
|
||||||
let Inst{19-16} = Rn;
|
|
||||||
let Inst{20} = 1;
|
|
||||||
let Inst{25} = 0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user