mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-26 21:32:10 +00:00
ARM target code clean up. Check for iOS, not Darwin where it makes sense.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@146981 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d7c9e08b6b
commit
afff941211
@ -72,8 +72,8 @@ ARMBaseRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
|
||||
0
|
||||
};
|
||||
|
||||
static const unsigned DarwinCalleeSavedRegs[] = {
|
||||
// Darwin ABI deviates from ARM standard ABI. R9 is not a callee-saved
|
||||
static const unsigned iOSCalleeSavedRegs[] = {
|
||||
// iOS ABI deviates from ARM standard ABI. R9 is not a callee-saved
|
||||
// register.
|
||||
ARM::LR, ARM::R7, ARM::R6, ARM::R5, ARM::R4,
|
||||
ARM::R11, ARM::R10, ARM::R8,
|
||||
@ -82,7 +82,7 @@ ARMBaseRegisterInfo::getCalleeSavedRegs(const MachineFunction *MF) const {
|
||||
ARM::D11, ARM::D10, ARM::D9, ARM::D8,
|
||||
0
|
||||
};
|
||||
return STI.isTargetDarwin() ? DarwinCalleeSavedRegs : CalleeSavedRegs;
|
||||
return (STI.isTargetIOS()) ? iOSCalleeSavedRegs : CalleeSavedRegs;
|
||||
}
|
||||
|
||||
BitVector ARMBaseRegisterInfo::
|
||||
|
@ -2012,12 +2012,12 @@ bool ARMFastISel::SelectRet(const Instruction *I) {
|
||||
|
||||
unsigned ARMFastISel::ARMSelectCallOp(const GlobalValue *GV) {
|
||||
|
||||
// Darwin needs the r9 versions of the opcodes.
|
||||
bool isDarwin = Subtarget->isTargetDarwin();
|
||||
// iOS needs the r9 versions of the opcodes.
|
||||
bool isiOS = Subtarget->isTargetIOS();
|
||||
if (isThumb2) {
|
||||
return isDarwin ? ARM::tBLr9 : ARM::tBL;
|
||||
return isiOS ? ARM::tBLr9 : ARM::tBL;
|
||||
} else {
|
||||
return isDarwin ? ARM::BLr9 : ARM::BL;
|
||||
return isiOS ? ARM::BLr9 : ARM::BL;
|
||||
}
|
||||
}
|
||||
|
||||
@ -2076,7 +2076,7 @@ bool ARMFastISel::ARMEmitLibcall(const Instruction *I, RTLIB::Libcall Call) {
|
||||
if (!ProcessCallArgs(Args, ArgRegs, ArgVTs, ArgFlags, RegArgs, CC, NumBytes))
|
||||
return false;
|
||||
|
||||
// Issue the call, BLr9 for darwin, BL otherwise.
|
||||
// Issue the call, BLr9 for iOS, BL otherwise.
|
||||
// TODO: Turn this into the table of arm call ops.
|
||||
MachineInstrBuilder MIB;
|
||||
unsigned CallOpc = ARMSelectCallOp(NULL);
|
||||
@ -2197,7 +2197,7 @@ bool ARMFastISel::SelectCall(const Instruction *I,
|
||||
if (!ProcessCallArgs(Args, ArgRegs, ArgVTs, ArgFlags, RegArgs, CC, NumBytes))
|
||||
return false;
|
||||
|
||||
// Issue the call, BLr9 for darwin, BL otherwise.
|
||||
// Issue the call, BLr9 for iOS, BL otherwise.
|
||||
// TODO: Turn this into the table of arm call ops.
|
||||
MachineInstrBuilder MIB;
|
||||
unsigned CallOpc = ARMSelectCallOp(GV);
|
||||
@ -2514,12 +2514,12 @@ bool ARMFastISel::TryToFoldLoad(MachineInstr *MI, unsigned OpNo,
|
||||
|
||||
namespace llvm {
|
||||
llvm::FastISel *ARM::createFastISel(FunctionLoweringInfo &funcInfo) {
|
||||
// Completely untested on non-darwin.
|
||||
// Completely untested on non-iOS.
|
||||
const TargetMachine &TM = funcInfo.MF->getTarget();
|
||||
|
||||
// Darwin and thumb1 only for now.
|
||||
const ARMSubtarget *Subtarget = &TM.getSubtarget<ARMSubtarget>();
|
||||
if (Subtarget->isTargetDarwin() && !Subtarget->isThumb1Only() &&
|
||||
if (Subtarget->isTargetIOS() && !Subtarget->isThumb1Only() &&
|
||||
!DisableARMFastISel)
|
||||
return new ARMFastISel(funcInfo);
|
||||
return 0;
|
||||
|
@ -206,8 +206,8 @@ def IsARClass : Predicate<"!Subtarget->isMClass()">,
|
||||
AssemblerPredicate<"!FeatureMClass">;
|
||||
def IsARM : Predicate<"!Subtarget->isThumb()">,
|
||||
AssemblerPredicate<"!ModeThumb">;
|
||||
def IsDarwin : Predicate<"Subtarget->isTargetDarwin()">;
|
||||
def IsNotDarwin : Predicate<"!Subtarget->isTargetDarwin()">;
|
||||
def IsIOS : Predicate<"Subtarget->isTargetIOS()">;
|
||||
def IsNotIOS : Predicate<"!Subtarget->isTargetIOS()">;
|
||||
def IsNaCl : Predicate<"Subtarget->isTargetNaCl()">;
|
||||
|
||||
// FIXME: Eventually this will be just "hasV6T2Ops".
|
||||
@ -1896,7 +1896,7 @@ let isBranch = 1, isTerminator = 1, isBarrier = 1, isIndirectBranch = 1 in {
|
||||
// a use to prevent stack-pointer assignments that appear immediately
|
||||
// before calls from potentially appearing dead.
|
||||
let isCall = 1,
|
||||
// On non-Darwin platforms R9 is callee-saved.
|
||||
// On non-IOS platforms R9 is callee-saved.
|
||||
// FIXME: Do we really need a non-predicated version? If so, it should
|
||||
// at least be a pseudo instruction expanding to the predicated version
|
||||
// at MC lowering time.
|
||||
@ -1905,7 +1905,7 @@ let isCall = 1,
|
||||
def BL : ABXI<0b1011, (outs), (ins bl_target:$func, variable_ops),
|
||||
IIC_Br, "bl\t$func",
|
||||
[(ARMcall tglobaladdr:$func)]>,
|
||||
Requires<[IsARM, IsNotDarwin]> {
|
||||
Requires<[IsARM, IsNotIOS]> {
|
||||
let Inst{31-28} = 0b1110;
|
||||
bits<24> func;
|
||||
let Inst{23-0} = func;
|
||||
@ -1915,7 +1915,7 @@ let isCall = 1,
|
||||
def BL_pred : ABI<0b1011, (outs), (ins bl_target:$func, variable_ops),
|
||||
IIC_Br, "bl", "\t$func",
|
||||
[(ARMcall_pred tglobaladdr:$func)]>,
|
||||
Requires<[IsARM, IsNotDarwin]> {
|
||||
Requires<[IsARM, IsNotIOS]> {
|
||||
bits<24> func;
|
||||
let Inst{23-0} = func;
|
||||
let DecoderMethod = "DecodeBranchImmInstruction";
|
||||
@ -1925,7 +1925,7 @@ let isCall = 1,
|
||||
def BLX : AXI<(outs), (ins GPR:$func, variable_ops), BrMiscFrm,
|
||||
IIC_Br, "blx\t$func",
|
||||
[(ARMcall GPR:$func)]>,
|
||||
Requires<[IsARM, HasV5T, IsNotDarwin]> {
|
||||
Requires<[IsARM, HasV5T, IsNotIOS]> {
|
||||
bits<4> func;
|
||||
let Inst{31-4} = 0b1110000100101111111111110011;
|
||||
let Inst{3-0} = func;
|
||||
@ -1934,7 +1934,7 @@ let isCall = 1,
|
||||
def BLX_pred : AI<(outs), (ins GPR:$func, variable_ops), BrMiscFrm,
|
||||
IIC_Br, "blx", "\t$func",
|
||||
[(ARMcall_pred GPR:$func)]>,
|
||||
Requires<[IsARM, HasV5T, IsNotDarwin]> {
|
||||
Requires<[IsARM, HasV5T, IsNotIOS]> {
|
||||
bits<4> func;
|
||||
let Inst{27-4} = 0b000100101111111111110011;
|
||||
let Inst{3-0} = func;
|
||||
@ -1944,16 +1944,16 @@ let isCall = 1,
|
||||
// Note: Restrict $func to the tGPR regclass to prevent it being in LR.
|
||||
def BX_CALL : ARMPseudoInst<(outs), (ins tGPR:$func, variable_ops),
|
||||
8, IIC_Br, [(ARMcall_nolink tGPR:$func)]>,
|
||||
Requires<[IsARM, HasV4T, IsNotDarwin]>;
|
||||
Requires<[IsARM, HasV4T, IsNotIOS]>;
|
||||
|
||||
// ARMv4
|
||||
def BMOVPCRX_CALL : ARMPseudoInst<(outs), (ins tGPR:$func, variable_ops),
|
||||
8, IIC_Br, [(ARMcall_nolink tGPR:$func)]>,
|
||||
Requires<[IsARM, NoV4T, IsNotDarwin]>;
|
||||
Requires<[IsARM, NoV4T, IsNotIOS]>;
|
||||
}
|
||||
|
||||
let isCall = 1,
|
||||
// On Darwin R9 is call-clobbered.
|
||||
// On IOS R9 is call-clobbered.
|
||||
// R7 is marked as a use to prevent frame-pointer assignments from being
|
||||
// moved above / below calls.
|
||||
Defs = [R0, R1, R2, R3, R9, R12, LR, QQQQ0, QQQQ2, QQQQ3, CPSR, FPSCR],
|
||||
@ -1961,38 +1961,38 @@ let isCall = 1,
|
||||
def BLr9 : ARMPseudoExpand<(outs), (ins bl_target:$func, variable_ops),
|
||||
4, IIC_Br,
|
||||
[(ARMcall tglobaladdr:$func)], (BL bl_target:$func)>,
|
||||
Requires<[IsARM, IsDarwin]>;
|
||||
Requires<[IsARM, IsIOS]>;
|
||||
|
||||
def BLr9_pred : ARMPseudoExpand<(outs),
|
||||
(ins bl_target:$func, pred:$p, variable_ops),
|
||||
4, IIC_Br,
|
||||
[(ARMcall_pred tglobaladdr:$func)],
|
||||
(BL_pred bl_target:$func, pred:$p)>,
|
||||
Requires<[IsARM, IsDarwin]>;
|
||||
Requires<[IsARM, IsIOS]>;
|
||||
|
||||
// ARMv5T and above
|
||||
def BLXr9 : ARMPseudoExpand<(outs), (ins GPR:$func, variable_ops),
|
||||
4, IIC_Br,
|
||||
[(ARMcall GPR:$func)],
|
||||
(BLX GPR:$func)>,
|
||||
Requires<[IsARM, HasV5T, IsDarwin]>;
|
||||
Requires<[IsARM, HasV5T, IsIOS]>;
|
||||
|
||||
def BLXr9_pred: ARMPseudoExpand<(outs), (ins GPR:$func, pred:$p,variable_ops),
|
||||
4, IIC_Br,
|
||||
[(ARMcall_pred GPR:$func)],
|
||||
(BLX_pred GPR:$func, pred:$p)>,
|
||||
Requires<[IsARM, HasV5T, IsDarwin]>;
|
||||
Requires<[IsARM, HasV5T, IsIOS]>;
|
||||
|
||||
// ARMv4T
|
||||
// Note: Restrict $func to the tGPR regclass to prevent it being in LR.
|
||||
def BXr9_CALL : ARMPseudoInst<(outs), (ins tGPR:$func, variable_ops),
|
||||
8, IIC_Br, [(ARMcall_nolink tGPR:$func)]>,
|
||||
Requires<[IsARM, HasV4T, IsDarwin]>;
|
||||
Requires<[IsARM, HasV4T, IsIOS]>;
|
||||
|
||||
// ARMv4
|
||||
def BMOVPCRXr9_CALL : ARMPseudoInst<(outs), (ins tGPR:$func, variable_ops),
|
||||
8, IIC_Br, [(ARMcall_nolink tGPR:$func)]>,
|
||||
Requires<[IsARM, NoV4T, IsDarwin]>;
|
||||
Requires<[IsARM, NoV4T, IsIOS]>;
|
||||
}
|
||||
|
||||
let isBranch = 1, isTerminator = 1 in {
|
||||
@ -2060,45 +2060,45 @@ def BXJ : ABI<0b0001, (outs), (ins GPR:$func), NoItinerary, "bxj", "\t$func",
|
||||
// Tail calls.
|
||||
|
||||
let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in {
|
||||
// Darwin versions.
|
||||
// IOS versions.
|
||||
let Defs = [R0, R1, R2, R3, R9, R12, QQQQ0, QQQQ2, QQQQ3, PC],
|
||||
Uses = [SP] in {
|
||||
def TCRETURNdi : PseudoInst<(outs), (ins i32imm:$dst, variable_ops),
|
||||
IIC_Br, []>, Requires<[IsDarwin]>;
|
||||
IIC_Br, []>, Requires<[IsIOS]>;
|
||||
|
||||
def TCRETURNri : PseudoInst<(outs), (ins tcGPR:$dst, variable_ops),
|
||||
IIC_Br, []>, Requires<[IsDarwin]>;
|
||||
IIC_Br, []>, Requires<[IsIOS]>;
|
||||
|
||||
def TAILJMPd : ARMPseudoExpand<(outs), (ins br_target:$dst, variable_ops),
|
||||
4, IIC_Br, [],
|
||||
(Bcc br_target:$dst, (ops 14, zero_reg))>,
|
||||
Requires<[IsARM, IsDarwin]>;
|
||||
Requires<[IsARM, IsIOS]>;
|
||||
|
||||
def TAILJMPr : ARMPseudoExpand<(outs), (ins tcGPR:$dst, variable_ops),
|
||||
4, IIC_Br, [],
|
||||
(BX GPR:$dst)>,
|
||||
Requires<[IsARM, IsDarwin]>;
|
||||
Requires<[IsARM, IsIOS]>;
|
||||
|
||||
}
|
||||
|
||||
// Non-Darwin versions (the difference is R9).
|
||||
// Non-IOS versions (the difference is R9).
|
||||
let Defs = [R0, R1, R2, R3, R12, QQQQ0, QQQQ2, QQQQ3, PC],
|
||||
Uses = [SP] in {
|
||||
def TCRETURNdiND : PseudoInst<(outs), (ins i32imm:$dst, variable_ops),
|
||||
IIC_Br, []>, Requires<[IsNotDarwin]>;
|
||||
IIC_Br, []>, Requires<[IsNotIOS]>;
|
||||
|
||||
def TCRETURNriND : PseudoInst<(outs), (ins tcGPR:$dst, variable_ops),
|
||||
IIC_Br, []>, Requires<[IsNotDarwin]>;
|
||||
IIC_Br, []>, Requires<[IsNotIOS]>;
|
||||
|
||||
def TAILJMPdND : ARMPseudoExpand<(outs), (ins brtarget:$dst, variable_ops),
|
||||
4, IIC_Br, [],
|
||||
(Bcc br_target:$dst, (ops 14, zero_reg))>,
|
||||
Requires<[IsARM, IsNotDarwin]>;
|
||||
Requires<[IsARM, IsNotIOS]>;
|
||||
|
||||
def TAILJMPrND : ARMPseudoExpand<(outs), (ins tcGPR:$dst, variable_ops),
|
||||
4, IIC_Br, [],
|
||||
(BX GPR:$dst)>,
|
||||
Requires<[IsARM, IsNotDarwin]>;
|
||||
Requires<[IsARM, IsNotIOS]>;
|
||||
}
|
||||
}
|
||||
|
||||
@ -4728,13 +4728,13 @@ let Defs =
|
||||
Requires<[IsARM, NoVFP]>;
|
||||
}
|
||||
|
||||
// FIXME: Non-Darwin version(s)
|
||||
// FIXME: Non-IOS version(s)
|
||||
let isBarrier = 1, hasSideEffects = 1, isTerminator = 1,
|
||||
Defs = [ R7, LR, SP ] in {
|
||||
def Int_eh_sjlj_longjmp : PseudoInst<(outs), (ins GPR:$src, GPR:$scratch),
|
||||
NoItinerary,
|
||||
[(ARMeh_sjlj_longjmp GPR:$src, GPR:$scratch)]>,
|
||||
Requires<[IsARM, IsDarwin]>;
|
||||
Requires<[IsARM, IsIOS]>;
|
||||
}
|
||||
|
||||
// eh.sjlj.dispatchsetup pseudo-instruction.
|
||||
@ -4804,28 +4804,28 @@ def : ARMPat<(ARMWrapperJT tjumptable:$dst, imm:$id),
|
||||
|
||||
// Tail calls
|
||||
def : ARMPat<(ARMtcret tcGPR:$dst),
|
||||
(TCRETURNri tcGPR:$dst)>, Requires<[IsDarwin]>;
|
||||
(TCRETURNri tcGPR:$dst)>, Requires<[IsIOS]>;
|
||||
|
||||
def : ARMPat<(ARMtcret (i32 tglobaladdr:$dst)),
|
||||
(TCRETURNdi texternalsym:$dst)>, Requires<[IsDarwin]>;
|
||||
(TCRETURNdi texternalsym:$dst)>, Requires<[IsIOS]>;
|
||||
|
||||
def : ARMPat<(ARMtcret (i32 texternalsym:$dst)),
|
||||
(TCRETURNdi texternalsym:$dst)>, Requires<[IsDarwin]>;
|
||||
(TCRETURNdi texternalsym:$dst)>, Requires<[IsIOS]>;
|
||||
|
||||
def : ARMPat<(ARMtcret tcGPR:$dst),
|
||||
(TCRETURNriND tcGPR:$dst)>, Requires<[IsNotDarwin]>;
|
||||
(TCRETURNriND tcGPR:$dst)>, Requires<[IsNotIOS]>;
|
||||
|
||||
def : ARMPat<(ARMtcret (i32 tglobaladdr:$dst)),
|
||||
(TCRETURNdiND texternalsym:$dst)>, Requires<[IsNotDarwin]>;
|
||||
(TCRETURNdiND texternalsym:$dst)>, Requires<[IsNotIOS]>;
|
||||
|
||||
def : ARMPat<(ARMtcret (i32 texternalsym:$dst)),
|
||||
(TCRETURNdiND texternalsym:$dst)>, Requires<[IsNotDarwin]>;
|
||||
(TCRETURNdiND texternalsym:$dst)>, Requires<[IsNotIOS]>;
|
||||
|
||||
// Direct calls
|
||||
def : ARMPat<(ARMcall texternalsym:$func), (BL texternalsym:$func)>,
|
||||
Requires<[IsARM, IsNotDarwin]>;
|
||||
Requires<[IsARM, IsNotIOS]>;
|
||||
def : ARMPat<(ARMcall texternalsym:$func), (BLr9 texternalsym:$func)>,
|
||||
Requires<[IsARM, IsDarwin]>;
|
||||
Requires<[IsARM, IsIOS]>;
|
||||
|
||||
// zextload i1 -> zextload i8
|
||||
def : ARMPat<(zextloadi1 addrmode_imm12:$addr), (LDRBi12 addrmode_imm12:$addr)>;
|
||||
|
@ -404,7 +404,7 @@ let isReturn = 1, isTerminator = 1, isBarrier = 1 in {
|
||||
// prevent stack-pointer assignments that appear immediately before calls from
|
||||
// potentially appearing dead.
|
||||
let isCall = 1,
|
||||
// On non-Darwin platforms R9 is callee-saved.
|
||||
// On non-IOS platforms R9 is callee-saved.
|
||||
Defs = [R0, R1, R2, R3, R12, LR, QQQQ0, QQQQ2, QQQQ3, CPSR, FPSCR],
|
||||
Uses = [SP] in {
|
||||
// Also used for Thumb2
|
||||
@ -412,7 +412,7 @@ let isCall = 1,
|
||||
(outs), (ins pred:$p, t_bltarget:$func, variable_ops), IIC_Br,
|
||||
"bl${p}\t$func",
|
||||
[(ARMtcall tglobaladdr:$func)]>,
|
||||
Requires<[IsThumb, IsNotDarwin]> {
|
||||
Requires<[IsThumb, IsNotIOS]> {
|
||||
bits<22> func;
|
||||
let Inst{26} = func{21};
|
||||
let Inst{25-16} = func{20-11};
|
||||
@ -426,7 +426,7 @@ let isCall = 1,
|
||||
(outs), (ins pred:$p, t_blxtarget:$func, variable_ops), IIC_Br,
|
||||
"blx${p}\t$func",
|
||||
[(ARMcall tglobaladdr:$func)]>,
|
||||
Requires<[IsThumb, HasV5T, IsNotDarwin]> {
|
||||
Requires<[IsThumb, HasV5T, IsNotIOS]> {
|
||||
bits<21> func;
|
||||
let Inst{25-16} = func{20-11};
|
||||
let Inst{13} = 1;
|
||||
@ -439,7 +439,7 @@ let isCall = 1,
|
||||
def tBLXr : TI<(outs), (ins pred:$p, GPR:$func, variable_ops), IIC_Br,
|
||||
"blx${p}\t$func",
|
||||
[(ARMtcall GPR:$func)]>,
|
||||
Requires<[IsThumb, HasV5T, IsNotDarwin]>,
|
||||
Requires<[IsThumb, HasV5T, IsNotIOS]>,
|
||||
T1Special<{1,1,1,?}> { // A6.2.3 & A8.6.24;
|
||||
bits<4> func;
|
||||
let Inst{6-3} = func;
|
||||
@ -450,11 +450,11 @@ let isCall = 1,
|
||||
def tBX_CALL : tPseudoInst<(outs), (ins tGPR:$func, variable_ops),
|
||||
4, IIC_Br,
|
||||
[(ARMcall_nolink tGPR:$func)]>,
|
||||
Requires<[IsThumb, IsThumb1Only, IsNotDarwin]>;
|
||||
Requires<[IsThumb, IsThumb1Only, IsNotIOS]>;
|
||||
}
|
||||
|
||||
let isCall = 1,
|
||||
// On Darwin R9 is call-clobbered.
|
||||
// On IOS R9 is call-clobbered.
|
||||
// R7 is marked as a use to prevent frame-pointer assignments from being
|
||||
// moved above / below calls.
|
||||
Defs = [R0, R1, R2, R3, R9, R12, LR, QQQQ0, QQQQ2, QQQQ3, CPSR, FPSCR],
|
||||
@ -463,25 +463,25 @@ let isCall = 1,
|
||||
def tBLr9 : tPseudoExpand<(outs), (ins pred:$p, t_bltarget:$func, variable_ops),
|
||||
4, IIC_Br, [(ARMtcall tglobaladdr:$func)],
|
||||
(tBL pred:$p, t_bltarget:$func)>,
|
||||
Requires<[IsThumb, IsDarwin]>;
|
||||
Requires<[IsThumb, IsIOS]>;
|
||||
|
||||
// ARMv5T and above, also used for Thumb2
|
||||
def tBLXi_r9 : tPseudoExpand<(outs), (ins pred:$p, t_blxtarget:$func, variable_ops),
|
||||
4, IIC_Br, [(ARMcall tglobaladdr:$func)],
|
||||
(tBLXi pred:$p, t_blxtarget:$func)>,
|
||||
Requires<[IsThumb, HasV5T, IsDarwin]>;
|
||||
Requires<[IsThumb, HasV5T, IsIOS]>;
|
||||
|
||||
// Also used for Thumb2
|
||||
def tBLXr_r9 : tPseudoExpand<(outs), (ins pred:$p, GPR:$func, variable_ops),
|
||||
2, IIC_Br, [(ARMtcall GPR:$func)],
|
||||
(tBLXr pred:$p, GPR:$func)>,
|
||||
Requires<[IsThumb, HasV5T, IsDarwin]>;
|
||||
Requires<[IsThumb, HasV5T, IsIOS]>;
|
||||
|
||||
// ARMv4T
|
||||
def tBXr9_CALL : tPseudoInst<(outs), (ins tGPR:$func, variable_ops),
|
||||
4, IIC_Br,
|
||||
[(ARMcall_nolink tGPR:$func)]>,
|
||||
Requires<[IsThumb, IsThumb1Only, IsDarwin]>;
|
||||
Requires<[IsThumb, IsThumb1Only, IsIOS]>;
|
||||
}
|
||||
|
||||
let isBranch = 1, isTerminator = 1, isBarrier = 1 in {
|
||||
@ -523,28 +523,28 @@ let isBranch = 1, isTerminator = 1 in
|
||||
|
||||
// Tail calls
|
||||
let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in {
|
||||
// Darwin versions.
|
||||
// IOS versions.
|
||||
let Defs = [R0, R1, R2, R3, R9, R12, QQQQ0, QQQQ2, QQQQ3, PC],
|
||||
Uses = [SP] in {
|
||||
// tTAILJMPd: Darwin version uses a Thumb2 branch (no Thumb1 tail calls
|
||||
// on Darwin), so it's in ARMInstrThumb2.td.
|
||||
// tTAILJMPd: IOS version uses a Thumb2 branch (no Thumb1 tail calls
|
||||
// on IOS), so it's in ARMInstrThumb2.td.
|
||||
def tTAILJMPr : tPseudoExpand<(outs), (ins tcGPR:$dst, variable_ops),
|
||||
4, IIC_Br, [],
|
||||
(tBX GPR:$dst, (ops 14, zero_reg))>,
|
||||
Requires<[IsThumb, IsDarwin]>;
|
||||
Requires<[IsThumb, IsIOS]>;
|
||||
}
|
||||
// Non-Darwin versions (the difference is R9).
|
||||
// Non-IOS versions (the difference is R9).
|
||||
let Defs = [R0, R1, R2, R3, R12, QQQQ0, QQQQ2, QQQQ3, PC],
|
||||
Uses = [SP] in {
|
||||
def tTAILJMPdND : tPseudoExpand<(outs),
|
||||
(ins t_brtarget:$dst, pred:$p, variable_ops),
|
||||
4, IIC_Br, [],
|
||||
(tB t_brtarget:$dst, pred:$p)>,
|
||||
Requires<[IsThumb, IsNotDarwin]>;
|
||||
Requires<[IsThumb, IsNotIOS]>;
|
||||
def tTAILJMPrND : tPseudoExpand<(outs), (ins tcGPR:$dst, variable_ops),
|
||||
4, IIC_Br, [],
|
||||
(tBX GPR:$dst, (ops 14, zero_reg))>,
|
||||
Requires<[IsThumb, IsNotDarwin]>;
|
||||
Requires<[IsThumb, IsNotIOS]>;
|
||||
}
|
||||
}
|
||||
|
||||
@ -652,7 +652,7 @@ def tLDRspi : T1pIs<(outs tGPR:$Rt), (ins t_addrmode_sp:$addr), IIC_iLoad_i,
|
||||
}
|
||||
|
||||
// Load tconstpool
|
||||
// FIXME: Use ldr.n to work around a Darwin assembler bug.
|
||||
// FIXME: Use ldr.n to work around a darwin assembler bug.
|
||||
let canFoldAsLoad = 1, isReMaterializable = 1, isCodeGenOnly = 1 in
|
||||
def tLDRpci : T1pIs<(outs tGPR:$Rt), (ins t_addrmode_pc:$addr), IIC_iLoad_i,
|
||||
"ldr", ".n\t$Rt, $addr",
|
||||
@ -1262,14 +1262,14 @@ def tInt_eh_sjlj_setjmp : ThumbXI<(outs),(ins tGPR:$src, tGPR:$val),
|
||||
AddrModeNone, 0, NoItinerary, "","",
|
||||
[(set R0, (ARMeh_sjlj_setjmp tGPR:$src, tGPR:$val))]>;
|
||||
|
||||
// FIXME: Non-Darwin version(s)
|
||||
// FIXME: Non-IOS version(s)
|
||||
let isBarrier = 1, hasSideEffects = 1, isTerminator = 1, isCodeGenOnly = 1,
|
||||
Defs = [ R7, LR, SP ] in
|
||||
def tInt_eh_sjlj_longjmp : XI<(outs), (ins GPR:$src, GPR:$scratch),
|
||||
AddrModeNone, 0, IndexModeNone,
|
||||
Pseudo, NoItinerary, "", "",
|
||||
[(ARMeh_sjlj_longjmp GPR:$src, GPR:$scratch)]>,
|
||||
Requires<[IsThumb, IsDarwin]>;
|
||||
Requires<[IsThumb, IsIOS]>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Non-Instruction Patterns
|
||||
@ -1307,20 +1307,20 @@ def : T1Pat<(ARMWrapperJT tjumptable:$dst, imm:$id),
|
||||
|
||||
// Direct calls
|
||||
def : T1Pat<(ARMtcall texternalsym:$func), (tBL texternalsym:$func)>,
|
||||
Requires<[IsThumb, IsNotDarwin]>;
|
||||
Requires<[IsThumb, IsNotIOS]>;
|
||||
def : T1Pat<(ARMtcall texternalsym:$func), (tBLr9 texternalsym:$func)>,
|
||||
Requires<[IsThumb, IsDarwin]>;
|
||||
Requires<[IsThumb, IsIOS]>;
|
||||
|
||||
def : Tv5Pat<(ARMcall texternalsym:$func), (tBLXi texternalsym:$func)>,
|
||||
Requires<[IsThumb, HasV5T, IsNotDarwin]>;
|
||||
Requires<[IsThumb, HasV5T, IsNotIOS]>;
|
||||
def : Tv5Pat<(ARMcall texternalsym:$func), (tBLXi_r9 texternalsym:$func)>,
|
||||
Requires<[IsThumb, HasV5T, IsDarwin]>;
|
||||
Requires<[IsThumb, HasV5T, IsIOS]>;
|
||||
|
||||
// Indirect calls to ARM routines
|
||||
def : Tv5Pat<(ARMcall GPR:$dst), (tBLXr GPR:$dst)>,
|
||||
Requires<[IsThumb, HasV5T, IsNotDarwin]>;
|
||||
Requires<[IsThumb, HasV5T, IsNotIOS]>;
|
||||
def : Tv5Pat<(ARMcall GPR:$dst), (tBLXr_r9 GPR:$dst)>,
|
||||
Requires<[IsThumb, HasV5T, IsDarwin]>;
|
||||
Requires<[IsThumb, HasV5T, IsIOS]>;
|
||||
|
||||
// zextload i1 -> zextload i8
|
||||
def : T1Pat<(zextloadi1 t_addrmode_rrs1:$addr),
|
||||
|
@ -3212,17 +3212,17 @@ def t2Bcc : T2I<(outs), (ins brtarget:$target), IIC_Br,
|
||||
let DecoderMethod = "DecodeThumb2BCCInstruction";
|
||||
}
|
||||
|
||||
// Tail calls. The Darwin version of thumb tail calls uses a t2 branch, so
|
||||
// Tail calls. The IOS version of thumb tail calls uses a t2 branch, so
|
||||
// it goes here.
|
||||
let isCall = 1, isTerminator = 1, isReturn = 1, isBarrier = 1 in {
|
||||
// Darwin version.
|
||||
// IOS version.
|
||||
let Defs = [R0, R1, R2, R3, R9, R12, QQQQ0, QQQQ2, QQQQ3, PC],
|
||||
Uses = [SP] in
|
||||
def tTAILJMPd: tPseudoExpand<(outs),
|
||||
(ins uncondbrtarget:$dst, pred:$p, variable_ops),
|
||||
4, IIC_Br, [],
|
||||
(t2B uncondbrtarget:$dst, pred:$p)>,
|
||||
Requires<[IsThumb2, IsDarwin]>;
|
||||
Requires<[IsThumb2, IsIOS]>;
|
||||
}
|
||||
|
||||
// IT block
|
||||
|
@ -108,13 +108,13 @@ ARMSubtarget::ARMSubtarget(const std::string &TT, const std::string &CPU,
|
||||
if (isAAPCS_ABI())
|
||||
stackAlignment = 8;
|
||||
|
||||
if (!isTargetDarwin())
|
||||
if (!isTargetIOS())
|
||||
UseMovt = hasV6T2Ops();
|
||||
else {
|
||||
IsR9Reserved = ReserveR9 | !HasV6Ops;
|
||||
UseMovt = DarwinUseMOVT && hasV6T2Ops();
|
||||
const Triple &T = getTargetTriple();
|
||||
SupportsTailCall = T.getOS() == Triple::IOS && !T.isOSVersionLT(5, 0);
|
||||
SupportsTailCall = !T.isOSVersionLT(5, 0);
|
||||
}
|
||||
|
||||
if (!isThumb() || hasThumb2())
|
||||
|
@ -218,6 +218,7 @@ protected:
|
||||
|
||||
const Triple &getTargetTriple() const { return TargetTriple; }
|
||||
|
||||
bool isTargetIOS() const { return TargetTriple.getOS() == Triple::IOS; }
|
||||
bool isTargetDarwin() const { return TargetTriple.isOSDarwin(); }
|
||||
bool isTargetNaCl() const {
|
||||
return TargetTriple.getOS() == Triple::NativeClient;
|
||||
|
@ -1,5 +1,5 @@
|
||||
; RUN: llc < %s -mtriple=armv7-apple-darwin | FileCheck %s --check-prefix=ARM
|
||||
; RUN: llc < %s -mtriple=thumbv7-apple-darwin | FileCheck %s --check-prefix=THUMB2
|
||||
; RUN: llc < %s -mtriple=armv7-apple-ios | FileCheck %s --check-prefix=ARM
|
||||
; RUN: llc < %s -mtriple=thumbv7-apple-ios | FileCheck %s --check-prefix=THUMB2
|
||||
; rdar://8690640
|
||||
|
||||
define i32* @t(i32* %x) nounwind {
|
||||
|
@ -1,6 +1,6 @@
|
||||
; RUN: llc < %s -arm-tail-calls=1 | FileCheck %s
|
||||
target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:32:64-v128:32:128-a0:0:32-n32"
|
||||
target triple = "thumbv7-apple-darwin10"
|
||||
target triple = "thumbv7-apple-ios"
|
||||
|
||||
%struct.A = type <{ i16, i16, i32, i16, i16, i32, i16, [8 x %struct.B], [418 x i8], %struct.C }>
|
||||
%struct.B = type <{ i32, i16, i16 }>
|
||||
|
@ -1,6 +1,6 @@
|
||||
; RUN: llc < %s -mtriple=armv6-apple-darwin -mattr=+vfp2 -arm-tail-calls | FileCheck %s -check-prefix=CHECKV6
|
||||
; RUN: llc < %s -mtriple=armv6-apple-ios -mattr=+vfp2 -arm-tail-calls | FileCheck %s -check-prefix=CHECKV6
|
||||
; RUN: llc < %s -mtriple=armv6-linux-gnueabi -relocation-model=pic -mattr=+vfp2 -arm-tail-calls | FileCheck %s -check-prefix=CHECKELF
|
||||
; RUN: llc < %s -mtriple=thumbv7-apple-darwin -arm-tail-calls | FileCheck %s -check-prefix=CHECKT2D
|
||||
; RUN: llc < %s -mtriple=thumbv7-apple-ios -arm-tail-calls | FileCheck %s -check-prefix=CHECKT2D
|
||||
; RUN: llc < %s -mtriple=thumbv7-apple-ios5.0 | FileCheck %s -check-prefix=CHECKT2D
|
||||
|
||||
; Enable tailcall optimization for iOS 5.0
|
||||
|
@ -2,7 +2,7 @@
|
||||
; CHECK: @DEBUG_VALUE: mydata <- [sp+#{{[0-9]+}}]+#0
|
||||
; Radar 9331779
|
||||
target datalayout = "e-p:32:32:32-i1:8:32-i8:8:32-i16:16:32-i32:32:32-i64:32:32-f32:32:32-f64:32:32-v64:32:64-v128:32:128-a0:0:32-n32"
|
||||
target triple = "thumbv7-apple-macosx10.7.0"
|
||||
target triple = "thumbv7-apple-ios"
|
||||
|
||||
%0 = type opaque
|
||||
%1 = type { [4 x i32] }
|
||||
|
@ -1,5 +1,5 @@
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-darwin | FileCheck %s --check-prefix=ARM
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-darwin | FileCheck %s --check-prefix=THUMB
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-ios | FileCheck %s --check-prefix=ARM
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios | FileCheck %s --check-prefix=THUMB
|
||||
|
||||
define i32 @t1(i32 %a, i32 %b) nounwind uwtable ssp {
|
||||
entry:
|
||||
|
@ -1,5 +1,5 @@
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-darwin | FileCheck %s --check-prefix=ARM
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-darwin | FileCheck %s --check-prefix=THUMB
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-ios | FileCheck %s --check-prefix=ARM
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios | FileCheck %s --check-prefix=THUMB
|
||||
|
||||
define i32 @t0(i1 zeroext %a) nounwind {
|
||||
%1 = zext i1 %a to i32
|
||||
|
@ -1,5 +1,5 @@
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-darwin | FileCheck %s --check-prefix=ARM
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-darwin | FileCheck %s --check-prefix=THUMB
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-ios | FileCheck %s --check-prefix=ARM
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios | FileCheck %s --check-prefix=THUMB
|
||||
|
||||
define void @t1a(float %a) uwtable ssp {
|
||||
entry:
|
||||
|
@ -1,5 +1,5 @@
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-darwin | FileCheck %s --check-prefix=ARM
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-darwin | FileCheck %s --check-prefix=THUMB
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-ios | FileCheck %s --check-prefix=ARM
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios | FileCheck %s --check-prefix=THUMB
|
||||
|
||||
; Test sitofp
|
||||
|
||||
|
@ -1,4 +1,4 @@
|
||||
; RUN: llc < %s -O0 -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-darwin | FileCheck %s --check-prefix=THUMB
|
||||
; RUN: llc < %s -O0 -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios | FileCheck %s --check-prefix=THUMB
|
||||
|
||||
; Target-specific selector can't properly handle the double because it isn't
|
||||
; being passed via a register, so the materialized arguments become dead code.
|
||||
|
@ -1,5 +1,5 @@
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-darwin | FileCheck %s --check-prefix=ARM
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-darwin | FileCheck %s --check-prefix=THUMB
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-ios | FileCheck %s --check-prefix=ARM
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios | FileCheck %s --check-prefix=THUMB
|
||||
|
||||
define i32 @icmp_i16_unsigned(i16 %a, i16 %b) nounwind {
|
||||
entry:
|
||||
|
@ -1,5 +1,5 @@
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-darwin | FileCheck %s --check-prefix=ARM
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-darwin | FileCheck %s --check-prefix=THUMB
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-ios | FileCheck %s --check-prefix=ARM
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios | FileCheck %s --check-prefix=THUMB
|
||||
|
||||
@message1 = global [60 x i8] c"The LLVM Compiler Infrastructure\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00", align 1
|
||||
@temp = common global [60 x i8] zeroinitializer, align 1
|
||||
|
@ -1,4 +1,4 @@
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-darwin | FileCheck %s --check-prefix=THUMB
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios | FileCheck %s --check-prefix=THUMB
|
||||
|
||||
define i32 @t1(i32* nocapture %ptr) nounwind readonly {
|
||||
entry:
|
||||
|
@ -1,4 +1,4 @@
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-darwin | FileCheck %s --check-prefix=ARM
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-ios | FileCheck %s --check-prefix=ARM
|
||||
; rdar://10418009
|
||||
|
||||
define zeroext i16 @t1(i16* nocapture %a) nounwind uwtable readonly ssp {
|
||||
|
@ -1,5 +1,5 @@
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-darwin | FileCheck %s --check-prefix=ARM
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-darwin | FileCheck %s --check-prefix=THUMB
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-ios | FileCheck %s --check-prefix=ARM
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios | FileCheck %s --check-prefix=THUMB
|
||||
; rdar://10412592
|
||||
|
||||
; Note: The Thumb code is being generated by the target-independent selector.
|
||||
@ -104,4 +104,4 @@ entry:
|
||||
; THUMB: movt r0, #33023
|
||||
call void @foo(i32 -2130706433)
|
||||
ret void
|
||||
}
|
||||
}
|
||||
|
@ -1,5 +1,5 @@
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-darwin | FileCheck %s
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-darwin | FileCheck %s
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-ios | FileCheck %s
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios | FileCheck %s
|
||||
|
||||
; Sign-extend of i1 currently not supported by fast-isel
|
||||
;define signext i1 @ret0(i1 signext %a) nounwind uwtable ssp {
|
||||
|
@ -1,5 +1,5 @@
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-darwin | FileCheck %s --check-prefix=ARM
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-darwin | FileCheck %s --check-prefix=THUMB
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-ios | FileCheck %s --check-prefix=ARM
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios | FileCheck %s --check-prefix=THUMB
|
||||
|
||||
define i32 @t1(i1 %c) nounwind readnone {
|
||||
entry:
|
||||
|
@ -1,5 +1,5 @@
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-darwin | FileCheck %s --check-prefix=ARM
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-darwin | FileCheck %s --check-prefix=THUMB
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=armv7-apple-ios | FileCheck %s --check-prefix=ARM
|
||||
; RUN: llc < %s -O0 -fast-isel-abort -relocation-model=dynamic-no-pic -mtriple=thumbv7-apple-ios | FileCheck %s --check-prefix=THUMB
|
||||
|
||||
; Very basic fast-isel functionality.
|
||||
define i32 @add(i32 %a, i32 %b) nounwind {
|
||||
|
@ -1,4 +1,4 @@
|
||||
; RUN: llc < %s -mtriple=thumbv7-apple-darwin9 -mattr=+vfp2,+thumb2 | FileCheck %s
|
||||
; RUN: llc < %s -mtriple=thumbv7-apple-ios -mattr=+vfp2,+thumb2 | FileCheck %s
|
||||
; rdar://7076238
|
||||
|
||||
@"\01LC" = external constant [36 x i8], align 1 ; <[36 x i8]*> [#uses=1]
|
||||
|
Loading…
Reference in New Issue
Block a user