/*===- TableGen'erated file -------------------------------------*- C++ -*-===*\
|*                                                                            *|
|* Calling Convention Implementation Fragment                                 *|
|*                                                                            *|
|* Automatically generated file, do not edit!                                 *|
|*                                                                            *|
\*===----------------------------------------------------------------------===*/

#ifndef GET_CC_REGISTER_LISTS

static bool CC_Colossus(unsigned ValNo, MVT ValVT,
                        MVT LocVT, CCValAssign::LocInfo LocInfo,
                        ISD::ArgFlagsTy ArgFlags, CCState &State);
static bool CC_Colossus_NonVarArg(unsigned ValNo, MVT ValVT,
                                  MVT LocVT, CCValAssign::LocInfo LocInfo,
                                  ISD::ArgFlagsTy ArgFlags, CCState &State);
static bool CC_Colossus_VarArg(unsigned ValNo, MVT ValVT,
                               MVT LocVT, CCValAssign::LocInfo LocInfo,
                               ISD::ArgFlagsTy ArgFlags, CCState &State);
static bool RetCC_Colossus(unsigned ValNo, MVT ValVT,
                           MVT LocVT, CCValAssign::LocInfo LocInfo,
                           ISD::ArgFlagsTy ArgFlags, CCState &State);
static bool RetCC_Colossus_Vertex(unsigned ValNo, MVT ValVT,
                                  MVT LocVT, CCValAssign::LocInfo LocInfo,
                                  ISD::ArgFlagsTy ArgFlags, CCState &State);


static bool CC_Colossus(unsigned ValNo, MVT ValVT,
                        MVT LocVT, CCValAssign::LocInfo LocInfo,
                        ISD::ArgFlagsTy ArgFlags, CCState &State) {

  if (LocVT == MVT::i8 ||
      LocVT == MVT::i16) {
    LocVT = MVT::i32;
    if (ArgFlags.isSExt())
      LocInfo = CCValAssign::SExt;
    else if (ArgFlags.isZExt())
      LocInfo = CCValAssign::ZExt;
    else
      LocInfo = CCValAssign::AExt;
  }

  if (State.isVarArg()) {
    if (!CC_Colossus_VarArg(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State))
      return false;
  }

  if (!State.isVarArg()) {
    if (!CC_Colossus_NonVarArg(ValNo, ValVT, LocVT, LocInfo, ArgFlags, State))
      return false;
  }

  return true; // CC didn't match.
}


static bool CC_Colossus_NonVarArg(unsigned ValNo, MVT ValVT,
                                  MVT LocVT, CCValAssign::LocInfo LocInfo,
                                  ISD::ArgFlagsTy ArgFlags, CCState &State) {

  if (LocVT == MVT::i32 ||
      LocVT == MVT::v2i16) {
    static const MCPhysReg RegList1[] = {
      Colossus::M0, Colossus::M1, Colossus::M2, Colossus::M3
    };
    if (MCRegister Reg = State.AllocateReg(RegList1)) {
      State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo));
      return false;
    }
  }

  if (LocVT == MVT::v2i32 ||
      LocVT == MVT::v4i16) {
    static const MCPhysReg RegList2[] = {
      Colossus::MD0, Colossus::MD1
    };
    if (MCRegister Reg = State.AllocateReg(RegList2)) {
      State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo));
      return false;
    }
  }

  if (LocVT == MVT::f32 ||
      LocVT == MVT::f16 ||
      LocVT == MVT::v2f16) {
    static const MCPhysReg RegList3[] = {
      Colossus::A0, Colossus::A1, Colossus::A2, Colossus::A3, Colossus::A4, Colossus::A5
    };
    if (MCRegister Reg = State.AllocateReg(RegList3)) {
      State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo));
      return false;
    }
  }

  if (LocVT == MVT::v2f32 ||
      LocVT == MVT::v4f16) {
    static const MCPhysReg RegList4[] = {
      Colossus::AD0, Colossus::AD1, Colossus::AD2
    };
    if (MCRegister Reg = State.AllocateReg(RegList4)) {
      State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo));
      return false;
    }
  }

  if (LocVT == MVT::i32 ||
      LocVT == MVT::f32 ||
      LocVT == MVT::f16 ||
      LocVT == MVT::v2i16 ||
      LocVT == MVT::v2f16) {
    int64_t Offset5 = State.AllocateStack(4, Align(4));
    State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset5, LocVT, LocInfo));
    return false;
  }

  if (LocVT == MVT::v2i32 ||
      LocVT == MVT::v2f32 ||
      LocVT == MVT::v4i16 ||
      LocVT == MVT::v4f16) {
    int64_t Offset6 = State.AllocateStack(8, Align(8));
    State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset6, LocVT, LocInfo));
    return false;
  }

  return true; // CC didn't match.
}


static bool CC_Colossus_VarArg(unsigned ValNo, MVT ValVT,
                               MVT LocVT, CCValAssign::LocInfo LocInfo,
                               ISD::ArgFlagsTy ArgFlags, CCState &State) {

  if (LocVT == MVT::i32 ||
      LocVT == MVT::f32) {
    int64_t Offset1 = State.AllocateStack(4, Align(4));
    State.addLoc(CCValAssign::getMem(ValNo, ValVT, Offset1, LocVT, LocInfo));
    return false;
  }

  return true; // CC didn't match.
}


static bool RetCC_Colossus(unsigned ValNo, MVT ValVT,
                           MVT LocVT, CCValAssign::LocInfo LocInfo,
                           ISD::ArgFlagsTy ArgFlags, CCState &State) {

  if (LocVT == MVT::i8 ||
      LocVT == MVT::i16) {
    LocVT = MVT::i32;
    if (ArgFlags.isSExt())
      LocInfo = CCValAssign::SExt;
    else if (ArgFlags.isZExt())
      LocInfo = CCValAssign::ZExt;
    else
      LocInfo = CCValAssign::AExt;
  }

  if (LocVT == MVT::i32 ||
      LocVT == MVT::v2i16) {
    static const MCPhysReg RegList1[] = {
      Colossus::M0, Colossus::M1, Colossus::M2, Colossus::M3
    };
    if (MCRegister Reg = State.AllocateReg(RegList1)) {
      State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo));
      return false;
    }
  }

  if (LocVT == MVT::v2i32 ||
      LocVT == MVT::v4i16) {
    static const MCPhysReg RegList2[] = {
      Colossus::MD0, Colossus::MD1
    };
    if (MCRegister Reg = State.AllocateReg(RegList2)) {
      State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo));
      return false;
    }
  }

  if (LocVT == MVT::f32 ||
      LocVT == MVT::f16 ||
      LocVT == MVT::v2f16) {
    static const MCPhysReg RegList3[] = {
      Colossus::A0, Colossus::A1, Colossus::A2, Colossus::A3, Colossus::A4, Colossus::A5
    };
    if (MCRegister Reg = State.AllocateReg(RegList3)) {
      State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo));
      return false;
    }
  }

  if (LocVT == MVT::v2f32 ||
      LocVT == MVT::v4f16) {
    static const MCPhysReg RegList4[] = {
      Colossus::AD0, Colossus::AD1, Colossus::AD2
    };
    if (MCRegister Reg = State.AllocateReg(RegList4)) {
      State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo));
      return false;
    }
  }

  return true; // CC didn't match.
}


static bool RetCC_Colossus_Vertex(unsigned ValNo, MVT ValVT,
                                  MVT LocVT, CCValAssign::LocInfo LocInfo,
                                  ISD::ArgFlagsTy ArgFlags, CCState &State) {

  if (LocVT == MVT::i32) {
    if (MCRegister Reg = State.AllocateReg(Colossus::M0)) {
      State.addLoc(CCValAssign::getReg(ValNo, ValVT, Reg, LocVT, LocInfo));
      return false;
    }
  }

  return true; // CC didn't match.
}

#else

const MCRegister CC_Colossus_ArgRegs[] = { 0 };
const MCRegister CC_Colossus_NonVarArg_ArgRegs[] = { Colossus::A0, Colossus::A1, Colossus::A2, Colossus::A3, Colossus::A4, Colossus::A5, Colossus::AD0, Colossus::AD1, Colossus::AD2, Colossus::M0, Colossus::M1, Colossus::M2, Colossus::M3, Colossus::MD0, Colossus::MD1 };
const MCRegister CC_Colossus_VarArg_ArgRegs[] = { 0 };
const MCRegister RetCC_Colossus_ArgRegs[] = { Colossus::A0, Colossus::A1, Colossus::A2, Colossus::A3, Colossus::A4, Colossus::A5, Colossus::AD0, Colossus::AD1, Colossus::AD2, Colossus::M0, Colossus::M1, Colossus::M2, Colossus::M3, Colossus::MD0, Colossus::MD1 };
const MCRegister RetCC_Colossus_Vertex_ArgRegs[] = { Colossus::M0 };

#endif // CC_REGISTER_LIST
