mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-21 19:20:28 +00:00
Temporary solution: added a different set of BCTRL_Macho / BCTRL_ELF with right callee-saved defs set for ppc64.
llvm-svn: 43248
This commit is contained in:
parent
b2f90b6ae5
commit
0590c75f18
@ -42,11 +42,13 @@ namespace {
|
||||
class VISIBILITY_HIDDEN PPCDAGToDAGISel : public SelectionDAGISel {
|
||||
PPCTargetMachine &TM;
|
||||
PPCTargetLowering PPCLowering;
|
||||
const PPCSubtarget &PPCSubTarget;
|
||||
unsigned GlobalBaseReg;
|
||||
public:
|
||||
PPCDAGToDAGISel(PPCTargetMachine &tm)
|
||||
: SelectionDAGISel(PPCLowering), TM(tm),
|
||||
PPCLowering(*TM.getTargetLowering()) {}
|
||||
PPCLowering(*TM.getTargetLowering()),
|
||||
PPCSubTarget(*TM.getSubtargetImpl()) {}
|
||||
|
||||
virtual bool runOnFunction(Function &Fn) {
|
||||
// Make sure we re-emit a set of the global base reg if necessary
|
||||
@ -736,7 +738,7 @@ SDNode *PPCDAGToDAGISel::SelectSETCC(SDOperand Op) {
|
||||
CCReg = CurDAG->getCopyToReg(CurDAG->getEntryNode(), CR7Reg, CCReg,
|
||||
InFlag).getValue(1);
|
||||
|
||||
if (TLI.getTargetMachine().getSubtarget<PPCSubtarget>().isGigaProcessor())
|
||||
if (PPCSubTarget.isGigaProcessor())
|
||||
IntCR = SDOperand(CurDAG->getTargetNode(PPC::MFOCRF, MVT::i32, CR7Reg,
|
||||
CCReg), 0);
|
||||
else
|
||||
@ -859,7 +861,7 @@ SDNode *PPCDAGToDAGISel::Select(SDOperand Op) {
|
||||
SDOperand InFlag = N->getOperand(1);
|
||||
AddToISelQueue(InFlag);
|
||||
// Use MFOCRF if supported.
|
||||
if (TLI.getTargetMachine().getSubtarget<PPCSubtarget>().isGigaProcessor())
|
||||
if (PPCSubTarget.isGigaProcessor())
|
||||
return CurDAG->getTargetNode(PPC::MFOCRF, MVT::i32,
|
||||
N->getOperand(0), InFlag);
|
||||
else
|
||||
|
@ -81,10 +81,13 @@ let isCall = 1, PPC970_Unit = 7,
|
||||
def BL8_Macho : IForm<18, 0, 1,
|
||||
(outs), (ins calltarget:$func, variable_ops),
|
||||
"bl $func", BrB, []>; // See Pat patterns below.
|
||||
|
||||
def BLA8_Macho : IForm<18, 1, 1,
|
||||
(outs), (ins aaddr:$func, variable_ops),
|
||||
"bla $func", BrB, [(PPCcall_Macho (i64 imm:$func))]>;
|
||||
def BCTRL8_Macho : XLForm_2_ext<19, 528, 20, 0, 1,
|
||||
(outs), (ins variable_ops),
|
||||
"bctrl", BrB,
|
||||
[(PPCbctrl_Macho)]>, Requires<[In64BitMode]>;
|
||||
}
|
||||
|
||||
// ELF 64 ABI Calls = Macho ABI Calls
|
||||
@ -99,11 +102,14 @@ let isCall = 1, PPC970_Unit = 7,
|
||||
// Convenient aliases for call instructions
|
||||
def BL8_ELF : IForm<18, 0, 1,
|
||||
(outs), (ins calltarget:$func, variable_ops),
|
||||
"bl $func", BrB, []>; // See Pat patterns below.
|
||||
|
||||
"bl $func", BrB, []>; // See Pat patterns below.
|
||||
def BLA8_ELF : IForm<18, 1, 1,
|
||||
(outs), (ins aaddr:$func, variable_ops),
|
||||
"bla $func", BrB, [(PPCcall_ELF (i64 imm:$func))]>;
|
||||
def BCTRL8_ELF : XLForm_2_ext<19, 528, 20, 0, 1,
|
||||
(outs), (ins variable_ops),
|
||||
"bctrl", BrB,
|
||||
[(PPCbctrl_ELF)]>, Requires<[In64BitMode]>;
|
||||
}
|
||||
|
||||
|
||||
|
@ -304,6 +304,8 @@ def iaddroff : ComplexPattern<iPTR, 1, "SelectAddrImmOffs", [], []>;
|
||||
//===----------------------------------------------------------------------===//
|
||||
// PowerPC Instruction Predicate Definitions.
|
||||
def FPContractions : Predicate<"!NoExcessFPPrecision">;
|
||||
def In32BitMode : Predicate<"!PPCSubTarget.isPPC64()">;
|
||||
def In64BitMode : Predicate<"PPCSubTarget.isPPC64()">;
|
||||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
@ -409,7 +411,7 @@ let isCall = 1, PPC970_Unit = 7,
|
||||
def BCTRL_Macho : XLForm_2_ext<19, 528, 20, 0, 1,
|
||||
(outs), (ins variable_ops),
|
||||
"bctrl", BrB,
|
||||
[(PPCbctrl_Macho)]>;
|
||||
[(PPCbctrl_Macho)]>, Requires<[In32BitMode]>;
|
||||
}
|
||||
|
||||
// ELF ABI Calls.
|
||||
@ -431,7 +433,7 @@ let isCall = 1, PPC970_Unit = 7,
|
||||
def BCTRL_ELF : XLForm_2_ext<19, 528, 20, 0, 1,
|
||||
(outs), (ins variable_ops),
|
||||
"bctrl", BrB,
|
||||
[(PPCbctrl_ELF)]>;
|
||||
[(PPCbctrl_ELF)]>, Requires<[In32BitMode]>;
|
||||
}
|
||||
|
||||
// DCB* instructions.
|
||||
|
25
test/CodeGen/PowerPC/2007-10-21-LocalRegAllocAssert2.ll
Normal file
25
test/CodeGen/PowerPC/2007-10-21-LocalRegAllocAssert2.ll
Normal file
@ -0,0 +1,25 @@
|
||||
; RUN: llvm-as < %s | llc -mtriple=powerpc64-apple-darwin9 -regalloc=local -relocation-model=pic
|
||||
|
||||
%struct.NSError = type opaque
|
||||
%struct.NSManagedObjectContext = type opaque
|
||||
%struct.NSString = type opaque
|
||||
%struct.NSURL = type opaque
|
||||
%struct._message_ref_t = type { %struct.objc_object* (%struct.objc_object*, %struct._message_ref_t*, ...)*, %struct.objc_selector* }
|
||||
%struct.objc_object = type { }
|
||||
%struct.objc_selector = type opaque
|
||||
@"\01L_OBJC_MESSAGE_REF_2" = external global %struct._message_ref_t ; <%struct._message_ref_t*> [#uses=2]
|
||||
@"\01L_OBJC_MESSAGE_REF_6" = external global %struct._message_ref_t ; <%struct._message_ref_t*> [#uses=2]
|
||||
@NSXMLStoreType = external constant %struct.NSString* ; <%struct.NSString**> [#uses=1]
|
||||
@"\01L_OBJC_MESSAGE_REF_4" = external global %struct._message_ref_t ; <%struct._message_ref_t*> [#uses=2]
|
||||
|
||||
define %struct.NSManagedObjectContext* @"+[ListGenerator(Private) managedObjectContextWithModelURL:storeURL:]"(%struct.objc_object* %self, %struct._message_ref_t* %_cmd, %struct.NSURL* %modelURL, %struct.NSURL* %storeURL) {
|
||||
entry:
|
||||
%tmp27 = load %struct.objc_object* (%struct.objc_object*, %struct._message_ref_t*, ...)** getelementptr (%struct._message_ref_t* @"\01L_OBJC_MESSAGE_REF_2", i32 0, i32 0), align 8 ; <%struct.objc_object* (%struct.objc_object*, %struct._message_ref_t*, ...)*> [#uses=1]
|
||||
%tmp29 = call %struct.objc_object* (%struct.objc_object*, %struct._message_ref_t*, ...)* %tmp27( %struct.objc_object* null, %struct._message_ref_t* @"\01L_OBJC_MESSAGE_REF_2" ) ; <%struct.objc_object*> [#uses=0]
|
||||
%tmp33 = load %struct.objc_object* (%struct.objc_object*, %struct._message_ref_t*, ...)** getelementptr (%struct._message_ref_t* @"\01L_OBJC_MESSAGE_REF_6", i32 0, i32 0), align 8 ; <%struct.objc_object* (%struct.objc_object*, %struct._message_ref_t*, ...)*> [#uses=1]
|
||||
%tmp34 = load %struct.NSString** @NSXMLStoreType, align 8 ; <%struct.NSString*> [#uses=1]
|
||||
%tmp40 = load %struct.objc_object* (%struct.objc_object*, %struct._message_ref_t*, ...)** getelementptr (%struct._message_ref_t* @"\01L_OBJC_MESSAGE_REF_4", i32 0, i32 0), align 8 ; <%struct.objc_object* (%struct.objc_object*, %struct._message_ref_t*, ...)*> [#uses=1]
|
||||
%tmp42 = call %struct.objc_object* (%struct.objc_object*, %struct._message_ref_t*, ...)* %tmp40( %struct.objc_object* null, %struct._message_ref_t* @"\01L_OBJC_MESSAGE_REF_4", i32 1 ) ; <%struct.objc_object*> [#uses=0]
|
||||
%tmp48 = call %struct.objc_object* (%struct.objc_object*, %struct._message_ref_t*, ...)* %tmp33( %struct.objc_object* null, %struct._message_ref_t* @"\01L_OBJC_MESSAGE_REF_6", %struct.NSString* %tmp34, i8* null, %struct.NSURL* null, %struct.objc_object* null, %struct.NSError** null ) ; <%struct.objc_object*> [#uses=0]
|
||||
unreachable
|
||||
}
|
Loading…
Reference in New Issue
Block a user