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