1894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//===- TableGen'erated file -------------------------------------*- C++ -*-===// 2894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 3894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Calling Convention Implementation Fragment 4894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 5894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// Automatically generated file, do not edit! 6894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman// 7894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman//===----------------------------------------------------------------------===// 8894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool CC_X86(unsigned ValNo, MVT ValVT, 1066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 1166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State); 1266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool CC_X86_32(unsigned ValNo, MVT ValVT, 1366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 1466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State); 1566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool CC_X86_32_C(unsigned ValNo, MVT ValVT, 1666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 17894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State); 1866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool CC_X86_32_Common(unsigned ValNo, MVT ValVT, 1966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 20894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State); 2166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool CC_X86_32_FastCC(unsigned ValNo, MVT ValVT, 2266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 23894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State); 2466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool CC_X86_32_FastCall(unsigned ValNo, MVT ValVT, 2566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 26894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State); 2766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool CC_X86_32_GHC(unsigned ValNo, MVT ValVT, 2866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 29894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State); 3066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool CC_X86_32_ThisCall(unsigned ValNo, MVT ValVT, 3166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 32894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State); 3366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool CC_X86_64(unsigned ValNo, MVT ValVT, 3466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 3566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State); 3666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool CC_X86_64_C(unsigned ValNo, MVT ValVT, 3766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 38894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State); 3966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool CC_X86_64_GHC(unsigned ValNo, MVT ValVT, 4066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 41894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State); 4266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool CC_X86_Win64_C(unsigned ValNo, MVT ValVT, 4366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 44894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State); 4566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool RetCC_X86(unsigned ValNo, MVT ValVT, 4666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 47894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State); 4866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool RetCC_X86Common(unsigned ValNo, MVT ValVT, 4966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 50894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State); 5166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool RetCC_X86_32(unsigned ValNo, MVT ValVT, 5266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 53894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State); 5466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool RetCC_X86_32_C(unsigned ValNo, MVT ValVT, 5566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 56894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State); 5766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool RetCC_X86_32_Fast(unsigned ValNo, MVT ValVT, 5866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 59894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State); 6066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool RetCC_X86_64(unsigned ValNo, MVT ValVT, 6166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 62894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State); 6366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool RetCC_X86_64_C(unsigned ValNo, MVT ValVT, 6466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 65894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State); 6666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool RetCC_X86_Win64_C(unsigned ValNo, MVT ValVT, 6766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 68894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State); 69894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 70894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 7166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool CC_X86(unsigned ValNo, MVT ValVT, 7266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 7366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State) { 7466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman 7566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (State.getTarget().getSubtarget<X86Subtarget>().is64Bit()) { 7666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (!CC_X86_64(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 7766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman return false; 7866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman } 7966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman 8066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (!CC_X86_32(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 8166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman return false; 8266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman 8366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman return true; // CC didn't match. 8466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman} 8566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman 8666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman 8766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool CC_X86_32(unsigned ValNo, MVT ValVT, 8866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 8966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State) { 9066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman 9166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (State.getCallingConv() == CallingConv::X86_FastCall) { 9266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (!CC_X86_32_FastCall(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 9366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman return false; 9466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman } 9566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman 9666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (State.getCallingConv() == CallingConv::X86_ThisCall) { 9766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (!CC_X86_32_ThisCall(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 9866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman return false; 9966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman } 10066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman 10166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (State.getCallingConv() == CallingConv::Fast) { 10266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (!CC_X86_32_FastCC(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 10366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman return false; 10466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman } 10566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman 10666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (State.getCallingConv() == CallingConv::GHC) { 10766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (!CC_X86_32_GHC(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 10866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman return false; 10966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman } 11066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman 11166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (!CC_X86_32_C(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 11266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman return false; 11366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman 11466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman return true; // CC didn't match. 11566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman} 11666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman 11766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman 11866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool CC_X86_32_C(unsigned ValNo, MVT ValVT, 11966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 120894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State) { 121894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 122894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::i8 || 123894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::i16) { 124894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT = MVT::i32; 125894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (ArgFlags.isSExt()) 126894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocInfo = CCValAssign::SExt; 127894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman else if (ArgFlags.isZExt()) 128894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocInfo = CCValAssign::ZExt; 129894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman else 130894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocInfo = CCValAssign::AExt; 131894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 132894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 133894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (ArgFlags.isNest()) { 134894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(X86::ECX)) { 135894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 136894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 137894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 138894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 139894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 140894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (!State.isVarArg()) { 141894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (ArgFlags.isInReg()) { 142894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::i32) { 143894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList1[] = { 144894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::EAX, X86::EDX, X86::ECX 145894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 146894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList1, 3)) { 147894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 148894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 149894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 150894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 151894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 152894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 153894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 154894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (!CC_X86_32_Common(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 155894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 156894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 157894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return true; // CC didn't match. 158894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 159894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 160894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 16166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool CC_X86_32_Common(unsigned ValNo, MVT ValVT, 16266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 163894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State) { 164894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 165894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (ArgFlags.isByVal()) { 166894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.HandleByVal(ValNo, ValVT, LocVT, LocInfo, 4, 4, ArgFlags); 167894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 168894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 169894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 170894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (!State.isVarArg()) { 171894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (ArgFlags.isInReg()) { 172894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::f32 || 173894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::f64) { 17466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (State.getTarget().getSubtarget<X86Subtarget>().hasXMMInt()) { 175894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList1[] = { 176894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::XMM0, X86::XMM1, X86::XMM2 177894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 178894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList1, 3)) { 179894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 180894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 181894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 182894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 183894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 184894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 185894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 186894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 187894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (!State.isVarArg()) { 18866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (LocVT == MVT::x86mmx) { 189894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList2[] = { 190894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::MM0, X86::MM1, X86::MM2 191894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 192894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList2, 3)) { 193894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 194894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 195894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 196894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 197894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 198894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 199894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::i32 || 200894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::f32) { 201894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman unsigned Offset3 = State.AllocateStack(4, 4); 202894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset3, LocVT, LocInfo)); 203894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 204894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 205894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 206894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::f64) { 207894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman unsigned Offset4 = State.AllocateStack(8, 4); 208894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset4, LocVT, LocInfo)); 209894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 210894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 211894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 212894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::f80) { 213894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman unsigned Offset5 = State.AllocateStack( 21466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman State.getTarget().getTargetData()->getTypeAllocSize(EVT(LocVT).getTypeForEVT(State.getContext())), 4); 215894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset5, LocVT, LocInfo)); 216894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 217894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 218894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 219894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (!State.isVarArg()) { 220894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::v16i8 || 221894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v8i16 || 222894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v4i32 || 223894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v2i64 || 224894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v4f32 || 225894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v2f64) { 226894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList6[] = { 227894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3 228894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 229894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList6, 4)) { 230894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 231894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 232894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 233894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 234894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 235894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 236894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (!State.isVarArg()) { 237894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::v32i8 || 238894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v16i16 || 239894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v8i32 || 240894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v4i64 || 241894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v8f32 || 242894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v4f64) { 243894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (State.getTarget().getSubtarget<X86Subtarget>().hasAVX()) { 244894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList7[] = { 245894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::YMM0, X86::YMM1, X86::YMM2, X86::YMM3 246894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 247894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList7, 4)) { 248894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 249894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 250894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 251894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 252894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 253894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 254894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 255894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::v16i8 || 256894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v8i16 || 257894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v4i32 || 258894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v2i64 || 259894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v4f32 || 260894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v2f64) { 261894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman unsigned Offset8 = State.AllocateStack(16, 16); 262894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset8, LocVT, LocInfo)); 263894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 264894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 265894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 266894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::v32i8 || 267894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v16i16 || 268894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v8i32 || 269894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v4i64 || 270894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v8f32 || 271894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v4f64) { 272894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman unsigned Offset9 = State.AllocateStack(32, 32); 273894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset9, LocVT, LocInfo)); 274894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 275894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 276894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 27766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (LocVT == MVT::x86mmx) { 278894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman unsigned Offset10 = State.AllocateStack(8, 4); 279894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset10, LocVT, LocInfo)); 280894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 281894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 282894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 283894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return true; // CC didn't match. 284894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 285894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 286894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 28766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool CC_X86_32_FastCC(unsigned ValNo, MVT ValVT, 28866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 289894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State) { 290894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 291894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (ArgFlags.isByVal()) { 292894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.HandleByVal(ValNo, ValVT, LocVT, LocInfo, 4, 4, ArgFlags); 293894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 294894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 295894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 296894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::i8 || 297894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::i16) { 298894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT = MVT::i32; 299894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (ArgFlags.isSExt()) 300894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocInfo = CCValAssign::SExt; 301894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman else if (ArgFlags.isZExt()) 302894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocInfo = CCValAssign::ZExt; 303894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman else 304894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocInfo = CCValAssign::AExt; 305894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 306894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 307894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (ArgFlags.isNest()) { 308894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(X86::EAX)) { 309894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 310894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 311894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 312894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 313894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 314894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::i32) { 315894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList1[] = { 316894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::ECX, X86::EDX 317894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 318894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList1, 2)) { 319894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 320894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 321894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 322894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 323894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 324894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (!State.isVarArg()) { 325894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::f32 || 326894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::f64) { 32766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (State.getTarget().getSubtarget<X86Subtarget>().hasXMMInt()) { 328894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList2[] = { 329894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::XMM0, X86::XMM1, X86::XMM2 330894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 331894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList2, 3)) { 332894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 333894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 334894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 335894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 336894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 337894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 338894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 339894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::f64) { 340894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman unsigned Offset3 = State.AllocateStack(8, 8); 341894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset3, LocVT, LocInfo)); 342894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 343894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 344894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 345894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (!CC_X86_32_Common(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 346894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 347894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 348894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return true; // CC didn't match. 349894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 350894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 351894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 35266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool CC_X86_32_FastCall(unsigned ValNo, MVT ValVT, 35366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 354894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State) { 355894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 356894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::i8 || 357894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::i16) { 358894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT = MVT::i32; 359894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (ArgFlags.isSExt()) 360894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocInfo = CCValAssign::SExt; 361894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman else if (ArgFlags.isZExt()) 362894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocInfo = CCValAssign::ZExt; 363894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman else 364894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocInfo = CCValAssign::AExt; 365894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 366894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 367894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (ArgFlags.isNest()) { 368894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(X86::EAX)) { 369894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 370894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 371894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 372894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 373894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 374894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::i32) { 375894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList1[] = { 376894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::ECX, X86::EDX 377894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 378894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList1, 2)) { 379894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 380894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 381894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 382894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 383894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 384894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (!CC_X86_32_Common(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 385894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 386894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 387894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return true; // CC didn't match. 388894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 389894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 390894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 39166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool CC_X86_32_GHC(unsigned ValNo, MVT ValVT, 39266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 393894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State) { 394894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 395894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::i8 || 396894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::i16) { 397894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT = MVT::i32; 398894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (ArgFlags.isSExt()) 399894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocInfo = CCValAssign::SExt; 400894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman else if (ArgFlags.isZExt()) 401894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocInfo = CCValAssign::ZExt; 402894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman else 403894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocInfo = CCValAssign::AExt; 404894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 405894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 406894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::i32) { 407894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList1[] = { 408894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::EBX, X86::EBP, X86::EDI, X86::ESI 409894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 410894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList1, 4)) { 411894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 412894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 413894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 414894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 415894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 416894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return true; // CC didn't match. 417894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 418894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 419894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 42066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool CC_X86_32_ThisCall(unsigned ValNo, MVT ValVT, 42166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 422894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State) { 423894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 424894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::i8 || 425894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::i16) { 426894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT = MVT::i32; 427894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (ArgFlags.isSExt()) 428894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocInfo = CCValAssign::SExt; 429894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman else if (ArgFlags.isZExt()) 430894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocInfo = CCValAssign::ZExt; 431894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman else 432894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocInfo = CCValAssign::AExt; 433894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 434894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 435894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (ArgFlags.isNest()) { 436894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(X86::EAX)) { 437894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 438894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 439894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 440894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 441894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 442894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::i32) { 443894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(X86::ECX)) { 444894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 445894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 446894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 447894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 448894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 449894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (!CC_X86_32_Common(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 450894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 451894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 452894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return true; // CC didn't match. 453894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 454894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 455894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 45666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool CC_X86_64(unsigned ValNo, MVT ValVT, 45766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 45866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State) { 45966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman 46066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (State.getCallingConv() == CallingConv::GHC) { 46166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (!CC_X86_64_GHC(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 46266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman return false; 46366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman } 46466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman 46566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (State.getTarget().getSubtarget<X86Subtarget>().isTargetWin64()) { 46666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (!CC_X86_Win64_C(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 46766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman return false; 46866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman } 46966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman 47066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (!CC_X86_64_C(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 47166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman return false; 47266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman 47366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman return true; // CC didn't match. 47466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman} 47566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman 47666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman 47766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool CC_X86_64_C(unsigned ValNo, MVT ValVT, 47866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 479894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State) { 480894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 481894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (ArgFlags.isByVal()) { 482894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.HandleByVal(ValNo, ValVT, LocVT, LocInfo, 8, 8, ArgFlags); 483894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 484894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 485894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 486894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::i8 || 487894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::i16) { 488894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT = MVT::i32; 489894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (ArgFlags.isSExt()) 490894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocInfo = CCValAssign::SExt; 491894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman else if (ArgFlags.isZExt()) 492894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocInfo = CCValAssign::ZExt; 493894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman else 494894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocInfo = CCValAssign::AExt; 495894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 496894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 497894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (ArgFlags.isNest()) { 498894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(X86::R10)) { 499894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 500894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 501894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 502894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 503894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 504894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::i32) { 505894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList1[] = { 506894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::EDI, X86::ESI, X86::EDX, X86::ECX, X86::R8D, X86::R9D 507894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 508894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList1, 6)) { 509894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 510894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 511894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 512894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 513894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 514894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::i64) { 515894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList2[] = { 516894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::RDI, X86::RSI, X86::RDX, X86::RCX, X86::R8, X86::R9 517894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 518894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList2, 6)) { 519894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 520894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 521894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 522894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 523894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 52466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (LocVT == MVT::x86mmx) { 525894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (State.getTarget().getSubtarget<X86Subtarget>().isTargetDarwin()) { 52666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (State.getTarget().getSubtarget<X86Subtarget>().hasXMMInt()) { 527894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT = MVT::v2i64; 528894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (ArgFlags.isSExt()) 529894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocInfo = CCValAssign::SExt; 530894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman else if (ArgFlags.isZExt()) 531894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocInfo = CCValAssign::ZExt; 532894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman else 533894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocInfo = CCValAssign::AExt; 534894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 535894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 536894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 537894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 538894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::f32 || 539894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::f64 || 540894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v16i8 || 541894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v8i16 || 542894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v4i32 || 543894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v2i64 || 544894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v4f32 || 545894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v2f64) { 54666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (State.getTarget().getSubtarget<X86Subtarget>().hasXMM()) { 547894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList3[] = { 548894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3, X86::XMM4, X86::XMM5, X86::XMM6, X86::XMM7 549894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 550894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList3, 8)) { 551894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 552894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 553894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 554894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 555894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 556894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 557894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::v32i8 || 558894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v16i16 || 559894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v8i32 || 560894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v4i64 || 561894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v8f32 || 562894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v4f64) { 563894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (State.getTarget().getSubtarget<X86Subtarget>().hasAVX()) { 564894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList4[] = { 565894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::YMM0, X86::YMM1, X86::YMM2, X86::YMM3, X86::YMM4, X86::YMM5, X86::YMM6, X86::YMM7 566894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 567894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList4, 8)) { 568894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 569894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 570894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 571894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 572894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 573894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 574894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::i32 || 575894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::i64 || 576894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::f32 || 577894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::f64) { 578894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman unsigned Offset5 = State.AllocateStack(8, 8); 579894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset5, LocVT, LocInfo)); 580894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 581894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 582894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 583894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::f80) { 584894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman unsigned Offset6 = State.AllocateStack( 58566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman State.getTarget().getTargetData()->getTypeAllocSize(EVT(LocVT).getTypeForEVT(State.getContext())), 58666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman State.getTarget().getTargetData()->getABITypeAlignment(EVT(LocVT).getTypeForEVT(State.getContext()))); 587894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset6, LocVT, LocInfo)); 588894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 589894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 590894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 591894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::v16i8 || 592894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v8i16 || 593894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v4i32 || 594894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v2i64 || 595894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v4f32 || 596894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v2f64) { 597894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman unsigned Offset7 = State.AllocateStack(16, 16); 598894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset7, LocVT, LocInfo)); 599894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 600894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 601894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 602894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::v32i8 || 603894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v16i16 || 604894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v8i32 || 605894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v4i64 || 606894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v8f32 || 607894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v4f64) { 608894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman unsigned Offset8 = State.AllocateStack(32, 32); 609894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset8, LocVT, LocInfo)); 610894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 611894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 612894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 613894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return true; // CC didn't match. 614894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 615894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 616894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 61766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool CC_X86_64_GHC(unsigned ValNo, MVT ValVT, 61866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 619894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State) { 620894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 621894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::i8 || 622894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::i16 || 623894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::i32) { 624894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT = MVT::i64; 625894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (ArgFlags.isSExt()) 626894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocInfo = CCValAssign::SExt; 627894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman else if (ArgFlags.isZExt()) 628894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocInfo = CCValAssign::ZExt; 629894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman else 630894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocInfo = CCValAssign::AExt; 631894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 632894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 633894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::i64) { 634894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList1[] = { 635894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::R13, X86::RBP, X86::R12, X86::RBX, X86::R14, X86::RSI, X86::RDI, X86::R8, X86::R9, X86::R15 636894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 637894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList1, 10)) { 638894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 639894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 640894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 641894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 642894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 643894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::f32 || 644894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::f64 || 645894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v16i8 || 646894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v8i16 || 647894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v4i32 || 648894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v2i64 || 649894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v4f32 || 650894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v2f64) { 65166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (State.getTarget().getSubtarget<X86Subtarget>().hasXMM()) { 652894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList2[] = { 653894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::XMM1, X86::XMM2, X86::XMM3, X86::XMM4, X86::XMM5, X86::XMM6 654894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 655894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList2, 6)) { 656894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 657894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 658894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 659894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 660894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 661894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 662894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return true; // CC didn't match. 663894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 664894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 665894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 66666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool CC_X86_Win64_C(unsigned ValNo, MVT ValVT, 66766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 668894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State) { 669894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 670894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::i8 || 671894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::i16) { 672894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT = MVT::i32; 673894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (ArgFlags.isSExt()) 674894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocInfo = CCValAssign::SExt; 675894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman else if (ArgFlags.isZExt()) 676894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocInfo = CCValAssign::ZExt; 677894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman else 678894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocInfo = CCValAssign::AExt; 679894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 680894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 681894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (ArgFlags.isNest()) { 682894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(X86::R10)) { 683894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 684894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 685894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 686894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 687894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 688894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::v16i8 || 689894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v8i16 || 690894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v4i32 || 691894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v2i64 || 692894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v4f32 || 693894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v2f64) { 694894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT = MVT::i64; 695894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocInfo = CCValAssign::Indirect; 696894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 697894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 69866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (LocVT == MVT::x86mmx) { 699894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT = MVT::i64; 700894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocInfo = CCValAssign::BCvt; 701894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 702894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 703894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::i32) { 704894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList1[] = { 705894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::ECX, X86::EDX, X86::R8D, X86::R9D 706894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 707894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList2[] = { 708894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3 709894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 710894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList1, RegList2, 4)) { 711894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 712894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 713894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 714894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 715894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 71666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (State.getCallingConv() == CallingConv::X86_ThisCall) { 71766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (ArgFlags.isSRet()) { 71866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (LocVT == MVT::i64) { 71966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman static const unsigned RegList3[] = { 72066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman X86::RDX, X86::R8, X86::R9 72166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman }; 72266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman static const unsigned RegList4[] = { 72366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman X86::XMM1, X86::XMM2, X86::XMM3 72466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman }; 72566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (unsigned Reg = State.AllocateReg(RegList3, RegList4, 3)) { 72666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 72766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman return false; 72866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman } 72966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman } 73066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman } 73166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman } 73266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman 733894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::i64) { 73466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman static const unsigned RegList5[] = { 735894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::RCX, X86::RDX, X86::R8, X86::R9 736894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 73766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman static const unsigned RegList6[] = { 738894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3 739894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 74066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (unsigned Reg = State.AllocateReg(RegList5, RegList6, 4)) { 741894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 742894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 743894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 744894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 745894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 746894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::f32 || 747894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::f64 || 748894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v16i8 || 749894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v8i16 || 750894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v4i32 || 751894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v2i64 || 752894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v4f32 || 753894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v2f64) { 75466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman static const unsigned RegList7[] = { 755894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3 756894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 75766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman static const unsigned RegList8[] = { 758894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::RCX, X86::RDX, X86::R8, X86::R9 759894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 76066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (unsigned Reg = State.AllocateReg(RegList7, RegList8, 4)) { 761894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 762894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 763894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 764894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 765894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 766894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::i32 || 767894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::i64 || 768894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::f32 || 769894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::f64) { 77066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman unsigned Offset9 = State.AllocateStack(8, 8); 77166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset9, LocVT, LocInfo)); 772894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 773894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 774894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 775894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::f80) { 77666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman unsigned Offset10 = State.AllocateStack( 77766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman State.getTarget().getTargetData()->getTypeAllocSize(EVT(LocVT).getTypeForEVT(State.getContext())), 77866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman State.getTarget().getTargetData()->getABITypeAlignment(EVT(LocVT).getTypeForEVT(State.getContext()))); 77966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset10, LocVT, LocInfo)); 780894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 781894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 782894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 783894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return true; // CC didn't match. 784894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 785894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 786894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 78766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool RetCC_X86(unsigned ValNo, MVT ValVT, 78866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 789894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State) { 790894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 791894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (State.getTarget().getSubtarget<X86Subtarget>().is64Bit()) { 792894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (!RetCC_X86_64(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 793894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 794894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 795894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 796894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (!RetCC_X86_32(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 797894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 798894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 799894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return true; // CC didn't match. 800894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 801894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 802894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 80366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool RetCC_X86Common(unsigned ValNo, MVT ValVT, 80466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 805894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State) { 806894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 807894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::i8) { 808894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList1[] = { 809894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::AL, X86::DL 810894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 811894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList1, 2)) { 812894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 813894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 814894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 815894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 816894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 817894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::i16) { 818894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList2[] = { 819894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::AX, X86::DX 820894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 821894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList2, 2)) { 822894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 823894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 824894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 825894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 826894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 827894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::i32) { 828894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList3[] = { 829894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::EAX, X86::EDX 830894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 831894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList3, 2)) { 832894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 833894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 834894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 835894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 836894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 837894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::i64) { 838894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList4[] = { 839894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::RAX, X86::RDX 840894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 841894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList4, 2)) { 842894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 843894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 844894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 845894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 846894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 847894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::v16i8 || 848894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v8i16 || 849894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v4i32 || 850894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v2i64 || 851894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v4f32 || 852894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v2f64) { 853894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList5[] = { 854894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::XMM0, X86::XMM1, X86::XMM2, X86::XMM3 855894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 856894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList5, 4)) { 857894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 858894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 859894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 860894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 861894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 862894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::v32i8 || 863894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v16i16 || 864894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v8i32 || 865894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v4i64 || 866894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v8f32 || 867894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::v4f64) { 86866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman static const unsigned RegList6[] = { 86966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman X86::YMM0, X86::YMM1, X86::YMM2, X86::YMM3 87066b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman }; 87166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (unsigned Reg = State.AllocateReg(RegList6, 4)) { 87266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 87366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman return false; 874894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 875894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 876894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 87766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (LocVT == MVT::x86mmx) { 878894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(X86::MM0)) { 879894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 880894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 881894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 882894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 883894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 884894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::f80) { 885894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList7[] = { 886894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::ST0, X86::ST1 887894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 888894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList7, 2)) { 889894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 890894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 891894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 892894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 893894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 894894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return true; // CC didn't match. 895894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 896894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 897894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 89866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool RetCC_X86_32(unsigned ValNo, MVT ValVT, 89966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 900894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State) { 901894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 902894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (State.getCallingConv() == CallingConv::Fast) { 903894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (!RetCC_X86_32_Fast(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 904894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 905894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 906894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 907894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (!RetCC_X86_32_C(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 908894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 909894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 910894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return true; // CC didn't match. 911894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 912894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 913894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 91466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool RetCC_X86_32_C(unsigned ValNo, MVT ValVT, 91566b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 916894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State) { 917894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 918894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (ArgFlags.isInReg()) { 91966b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (State.getTarget().getSubtarget<X86Subtarget>().hasXMMInt()) { 920894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::f32 || 921894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::f64) { 922894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList1[] = { 923894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::XMM0, X86::XMM1, X86::XMM2 924894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 925894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList1, 3)) { 926894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 927894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 928894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 929894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 930894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 931894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 932894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 933894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::f32 || 934894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT == MVT::f64) { 935894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList2[] = { 936894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::ST0, X86::ST1 937894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 938894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList2, 2)) { 939894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 940894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 941894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 942894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 943894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 944894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (!RetCC_X86Common(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 945894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 946894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 947894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return true; // CC didn't match. 948894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 949894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 950894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 95166b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool RetCC_X86_32_Fast(unsigned ValNo, MVT ValVT, 95266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 953894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State) { 954894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 955894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::f32) { 95666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (State.getTarget().getSubtarget<X86Subtarget>().hasXMMInt()) { 957894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList1[] = { 958894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::XMM0, X86::XMM1, X86::XMM2 959894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 960894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList1, 3)) { 961894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 962894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 963894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 964894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 965894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 966894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 967894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::f64) { 96866b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (State.getTarget().getSubtarget<X86Subtarget>().hasXMMInt()) { 969894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList2[] = { 970894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::XMM0, X86::XMM1, X86::XMM2 971894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 972894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList2, 3)) { 973894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 974894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 975894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 976894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 977894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 978894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 979894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::i8) { 980894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList3[] = { 981894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::AL, X86::DL, X86::CL 982894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 983894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList3, 3)) { 984894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 985894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 986894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 987894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 988894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 989894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::i16) { 990894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList4[] = { 991894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::AX, X86::DX, X86::CX 992894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 993894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList4, 3)) { 994894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 995894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 996894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 997894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 998894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 999894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::i32) { 1000894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList5[] = { 1001894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::EAX, X86::EDX, X86::ECX 1002894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 1003894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList5, 3)) { 1004894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 1005894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 1006894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 1007894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 1008894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 1009894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (!RetCC_X86Common(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 1010894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 1011894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 1012894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return true; // CC didn't match. 1013894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 1014894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 1015894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 101666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool RetCC_X86_64(unsigned ValNo, MVT ValVT, 101766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 1018894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State) { 1019894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 1020894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (State.getTarget().getSubtarget<X86Subtarget>().isTargetWin64()) { 1021894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (!RetCC_X86_Win64_C(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 1022894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 1023894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 1024894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 1025894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (!RetCC_X86_64_C(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 1026894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 1027894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 1028894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return true; // CC didn't match. 1029894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 1030894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 1031894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 103266b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool RetCC_X86_64_C(unsigned ValNo, MVT ValVT, 103366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 1034894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State) { 1035894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 1036894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::f32) { 1037894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList1[] = { 1038894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::XMM0, X86::XMM1 1039894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 1040894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList1, 2)) { 1041894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 1042894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 1043894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 1044894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 1045894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 1046894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (LocVT == MVT::f64) { 1047894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList2[] = { 1048894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::XMM0, X86::XMM1 1049894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 1050894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList2, 2)) { 1051894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 1052894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 1053894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 1054894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 1055894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 105666b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (LocVT == MVT::x86mmx) { 1057894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman static const unsigned RegList3[] = { 1058894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman X86::XMM0, X86::XMM1 1059894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman }; 1060894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (unsigned Reg = State.AllocateReg(RegList3, 2)) { 1061894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo)); 1062894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 1063894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 1064894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 1065894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 1066894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (!RetCC_X86Common(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 1067894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 1068894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 1069894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return true; // CC didn't match. 1070894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 1071894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 1072894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 107366b8ab22586debccb1f787d4d52b7f042d4ddeb8John Baumanstatic bool RetCC_X86_Win64_C(unsigned ValNo, MVT ValVT, 107466b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman MVT LocVT, CCValAssign::LocInfo LocInfo, 1075894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman ISD::ArgFlagsTy ArgFlags, CCState &State) { 1076894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 107766b8ab22586debccb1f787d4d52b7f042d4ddeb8John Bauman if (LocVT == MVT::x86mmx) { 1078894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocVT = MVT::i64; 1079894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman LocInfo = CCValAssign::BCvt; 1080894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman } 1081894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 1082894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman if (!RetCC_X86_64_C(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State)) 1083894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return false; 1084894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman 1085894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman return true; // CC didn't match. 1086894018228b0e0bdbd7aa7e8f47d4a9458789ca82John Bauman} 1087