mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-25 04:02:41 +01:00
Pseudo-ize BX_CALL and friends. Remove dead instruction format classes.
rdar://8685712 llvm-svn: 120438
This commit is contained in:
parent
e2a8781847
commit
cb8193b99e
@ -806,6 +806,56 @@ void ARMAsmPrinter::EmitInstruction(const MachineInstr *MI) {
|
||||
}
|
||||
return;
|
||||
}
|
||||
case ARM::BXr9_CALL:
|
||||
case ARM::BX_CALL: {
|
||||
{
|
||||
MCInst TmpInst;
|
||||
TmpInst.setOpcode(ARM::MOVr);
|
||||
TmpInst.addOperand(MCOperand::CreateReg(ARM::LR));
|
||||
TmpInst.addOperand(MCOperand::CreateReg(ARM::PC));
|
||||
// Add predicate operands.
|
||||
TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL));
|
||||
TmpInst.addOperand(MCOperand::CreateReg(0));
|
||||
// Add 's' bit operand (always reg0 for this)
|
||||
TmpInst.addOperand(MCOperand::CreateReg(0));
|
||||
OutStreamer.EmitInstruction(TmpInst);
|
||||
}
|
||||
{
|
||||
MCInst TmpInst;
|
||||
TmpInst.setOpcode(ARM::BX);
|
||||
TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg()));
|
||||
OutStreamer.EmitInstruction(TmpInst);
|
||||
}
|
||||
return;
|
||||
}
|
||||
case ARM::BMOVPCRXr9_CALL:
|
||||
case ARM::BMOVPCRX_CALL: {
|
||||
{
|
||||
MCInst TmpInst;
|
||||
TmpInst.setOpcode(ARM::MOVr);
|
||||
TmpInst.addOperand(MCOperand::CreateReg(ARM::LR));
|
||||
TmpInst.addOperand(MCOperand::CreateReg(ARM::PC));
|
||||
// Add predicate operands.
|
||||
TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL));
|
||||
TmpInst.addOperand(MCOperand::CreateReg(0));
|
||||
// Add 's' bit operand (always reg0 for this)
|
||||
TmpInst.addOperand(MCOperand::CreateReg(0));
|
||||
OutStreamer.EmitInstruction(TmpInst);
|
||||
}
|
||||
{
|
||||
MCInst TmpInst;
|
||||
TmpInst.setOpcode(ARM::MOVr);
|
||||
TmpInst.addOperand(MCOperand::CreateReg(ARM::PC));
|
||||
TmpInst.addOperand(MCOperand::CreateReg(MI->getOperand(0).getReg()));
|
||||
// Add predicate operands.
|
||||
TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL));
|
||||
TmpInst.addOperand(MCOperand::CreateReg(0));
|
||||
// Add 's' bit operand (always reg0 for this)
|
||||
TmpInst.addOperand(MCOperand::CreateReg(0));
|
||||
OutStreamer.EmitInstruction(TmpInst);
|
||||
}
|
||||
return;
|
||||
}
|
||||
case ARM::tPICADD: {
|
||||
// This is a pseudo op for a label + instruction sequence, which looks like:
|
||||
// LPC0:
|
||||
@ -978,6 +1028,9 @@ void ARMAsmPrinter::EmitInstruction(const MachineInstr *MI) {
|
||||
// Add predicate operands.
|
||||
TmpInst.addOperand(MCOperand::CreateImm(ARMCC::AL));
|
||||
TmpInst.addOperand(MCOperand::CreateReg(0));
|
||||
// Add 's' bit operand (always reg0 for this)
|
||||
if (Opc == ARM::MOVr)
|
||||
TmpInst.addOperand(MCOperand::CreateReg(0));
|
||||
OutStreamer.EmitInstruction(TmpInst);
|
||||
|
||||
// Make sure the Thumb jump table is 4-byte aligned.
|
||||
|
@ -352,10 +352,6 @@ class ABXI<bits<4> opcod, dag oops, dag iops, InstrItinClass itin,
|
||||
asm, "", pattern> {
|
||||
let Inst{27-24} = opcod;
|
||||
}
|
||||
class ABXIx2<dag oops, dag iops, InstrItinClass itin,
|
||||
string asm, list<dag> pattern>
|
||||
: XI<oops, iops, AddrModeNone, Size8Bytes, IndexModeNone, Pseudo, itin,
|
||||
asm, "", pattern>;
|
||||
|
||||
// BR_JT instructions
|
||||
class JTI<dag oops, dag iops, InstrItinClass itin,
|
||||
@ -428,11 +424,6 @@ class AXI1<bits<4> opcod, dag oops, dag iops, Format f, InstrItinClass itin,
|
||||
let Inst{24-21} = opcod;
|
||||
let Inst{27-26} = 0b00;
|
||||
}
|
||||
class AI1x2<dag oops, dag iops, Format f, InstrItinClass itin,
|
||||
string opc, string asm, list<dag> pattern>
|
||||
: I<oops, iops, AddrMode1, Size8Bytes, IndexModeNone, f, itin,
|
||||
opc, asm, "", pattern>;
|
||||
|
||||
|
||||
// loads
|
||||
|
||||
@ -1020,10 +1011,6 @@ class T2JTI<dag oops, dag iops, InstrItinClass itin,
|
||||
string asm, list<dag> pattern>
|
||||
: Thumb2XI<oops, iops, AddrModeNone, SizeSpecial, itin, asm, "", pattern>;
|
||||
|
||||
class T2Ix2<dag oops, dag iops, InstrItinClass itin,
|
||||
string opc, string asm, list<dag> pattern>
|
||||
: Thumb2I<oops, iops, AddrModeNone, Size8Bytes, itin, opc, asm, "", pattern>;
|
||||
|
||||
// Two-address instructions
|
||||
class T2XIt<dag oops, dag iops, InstrItinClass itin,
|
||||
string asm, string cstr, list<dag> pattern>
|
||||
|
@ -1230,6 +1230,7 @@ let isBranch = 1, isTerminator = 1, isBarrier = 1, isIndirectBranch = 1 in {
|
||||
}
|
||||
|
||||
// ARMV4 only
|
||||
// FIXME: This should be a pseudo.
|
||||
def MOVPCRX : AXI<(outs), (ins GPR:$dst), BrMiscFrm, IIC_Br, "mov\tpc, $dst",
|
||||
[(brind GPR:$dst)]>,
|
||||
Requires<[IsARM, NoV4T]> {
|
||||
@ -1278,25 +1279,14 @@ let isCall = 1,
|
||||
|
||||
// ARMv4T
|
||||
// Note: Restrict $func to the tGPR regclass to prevent it being in LR.
|
||||
// FIXME: x2 insn patterns like this need to be pseudo instructions.
|
||||
def BX_CALL : ABXIx2<(outs), (ins tGPR:$func, variable_ops),
|
||||
IIC_Br, "mov\tlr, pc\n\tbx\t$func",
|
||||
[(ARMcall_nolink tGPR:$func)]>,
|
||||
Requires<[IsARM, HasV4T, IsNotDarwin]> {
|
||||
bits<4> func;
|
||||
let Inst{27-4} = 0b000100101111111111110001;
|
||||
let Inst{3-0} = func;
|
||||
}
|
||||
def BX_CALL : ARMPseudoInst<(outs), (ins tGPR:$func, variable_ops),
|
||||
Size8Bytes, IIC_Br, [(ARMcall_nolink tGPR:$func)]>,
|
||||
Requires<[IsARM, HasV4T, IsNotDarwin]>;
|
||||
|
||||
// ARMv4
|
||||
def BMOVPCRX_CALL : ABXIx2<(outs), (ins tGPR:$func, variable_ops),
|
||||
IIC_Br, "mov\tlr, pc\n\tmov\tpc, $func",
|
||||
[(ARMcall_nolink tGPR:$func)]>,
|
||||
Requires<[IsARM, NoV4T, IsNotDarwin]> {
|
||||
bits<4> func;
|
||||
let Inst{27-4} = 0b000110100000111100000000;
|
||||
let Inst{3-0} = func;
|
||||
}
|
||||
def BMOVPCRX_CALL : ARMPseudoInst<(outs), (ins tGPR:$func, variable_ops),
|
||||
Size8Bytes, IIC_Br, [(ARMcall_nolink tGPR:$func)]>,
|
||||
Requires<[IsARM, NoV4T, IsNotDarwin]>;
|
||||
}
|
||||
|
||||
let isCall = 1,
|
||||
@ -1335,24 +1325,14 @@ let isCall = 1,
|
||||
|
||||
// ARMv4T
|
||||
// Note: Restrict $func to the tGPR regclass to prevent it being in LR.
|
||||
def BXr9_CALL : ABXIx2<(outs), (ins tGPR:$func, variable_ops),
|
||||
IIC_Br, "mov\tlr, pc\n\tbx\t$func",
|
||||
[(ARMcall_nolink tGPR:$func)]>,
|
||||
Requires<[IsARM, HasV4T, IsDarwin]> {
|
||||
bits<4> func;
|
||||
let Inst{27-4} = 0b000100101111111111110001;
|
||||
let Inst{3-0} = func;
|
||||
}
|
||||
def BXr9_CALL : ARMPseudoInst<(outs), (ins tGPR:$func, variable_ops),
|
||||
Size8Bytes, IIC_Br, [(ARMcall_nolink tGPR:$func)]>,
|
||||
Requires<[IsARM, HasV4T, IsDarwin]>;
|
||||
|
||||
// ARMv4
|
||||
def BMOVPCRXr9_CALL : ABXIx2<(outs), (ins tGPR:$func, variable_ops),
|
||||
IIC_Br, "mov\tlr, pc\n\tmov\tpc, $func",
|
||||
[(ARMcall_nolink tGPR:$func)]>,
|
||||
Requires<[IsARM, NoV4T, IsDarwin]> {
|
||||
bits<4> func;
|
||||
let Inst{27-4} = 0b000110100000111100000000;
|
||||
let Inst{3-0} = func;
|
||||
}
|
||||
def BMOVPCRXr9_CALL : ARMPseudoInst<(outs), (ins tGPR:$func, variable_ops),
|
||||
Size8Bytes, IIC_Br, [(ARMcall_nolink tGPR:$func)]>,
|
||||
Requires<[IsARM, NoV4T, IsDarwin]>;
|
||||
}
|
||||
|
||||
// Tail calls.
|
||||
|
Loading…
Reference in New Issue
Block a user