MSP430SelectionDAGInfo::MSP430SelectionDAGInfo(const MSP430TargetMachine &TM)
    : TargetSelectionDAGInfo(TM.getDataLayout()) {}
Esempio n. 2
0
MSP430TargetLowering::MSP430TargetLowering(MSP430TargetMachine &tm) :
  TargetLowering(tm, new TargetLoweringObjectFileELF()),
  Subtarget(*tm.getSubtargetImpl()), TM(tm) {

  TD = getTargetData();

  // Set up the register classes.
  addRegisterClass(MVT::i8,  MSP430::GR8RegisterClass);
  addRegisterClass(MVT::i16, MSP430::GR16RegisterClass);

  // Compute derived properties from the register classes
  computeRegisterProperties();

  // Provide all sorts of operation actions

  // Division is expensive
  setIntDivIsCheap(false);

  setStackPointerRegisterToSaveRestore(MSP430::SPW);
  setBooleanContents(ZeroOrOneBooleanContent);
  setSchedulingPreference(Sched::Latency);

  // We have post-incremented loads / stores.
  setIndexedLoadAction(ISD::POST_INC, MVT::i8, Legal);
  setIndexedLoadAction(ISD::POST_INC, MVT::i16, Legal);

  setLoadExtAction(ISD::EXTLOAD,  MVT::i1,  Promote);
  setLoadExtAction(ISD::SEXTLOAD, MVT::i1,  Promote);
  setLoadExtAction(ISD::ZEXTLOAD, MVT::i1,  Promote);
  setLoadExtAction(ISD::SEXTLOAD, MVT::i8,  Expand);
  setLoadExtAction(ISD::SEXTLOAD, MVT::i16, Expand);

  // We don't have any truncstores
  setTruncStoreAction(MVT::i16, MVT::i8, Expand);

  setOperationAction(ISD::SRA,              MVT::i8,    Custom);
  setOperationAction(ISD::SHL,              MVT::i8,    Custom);
  setOperationAction(ISD::SRL,              MVT::i8,    Custom);
  setOperationAction(ISD::SRA,              MVT::i16,   Custom);
  setOperationAction(ISD::SHL,              MVT::i16,   Custom);
  setOperationAction(ISD::SRL,              MVT::i16,   Custom);
  setOperationAction(ISD::ROTL,             MVT::i8,    Expand);
  setOperationAction(ISD::ROTR,             MVT::i8,    Expand);
  setOperationAction(ISD::ROTL,             MVT::i16,   Expand);
  setOperationAction(ISD::ROTR,             MVT::i16,   Expand);
  setOperationAction(ISD::GlobalAddress,    MVT::i16,   Custom);
  setOperationAction(ISD::ExternalSymbol,   MVT::i16,   Custom);
  setOperationAction(ISD::BlockAddress,     MVT::i16,   Custom);
  setOperationAction(ISD::BR_JT,            MVT::Other, Expand);
  setOperationAction(ISD::BR_CC,            MVT::i8,    Custom);
  setOperationAction(ISD::BR_CC,            MVT::i16,   Custom);
  setOperationAction(ISD::BRCOND,           MVT::Other, Expand);
  setOperationAction(ISD::SETCC,            MVT::i8,    Custom);
  setOperationAction(ISD::SETCC,            MVT::i16,   Custom);
  setOperationAction(ISD::SELECT,           MVT::i8,    Expand);
  setOperationAction(ISD::SELECT,           MVT::i16,   Expand);
  setOperationAction(ISD::SELECT_CC,        MVT::i8,    Custom);
  setOperationAction(ISD::SELECT_CC,        MVT::i16,   Custom);
  setOperationAction(ISD::SIGN_EXTEND,      MVT::i16,   Custom);
  setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i8, Expand);
  setOperationAction(ISD::DYNAMIC_STACKALLOC, MVT::i16, Expand);

  setOperationAction(ISD::CTTZ,             MVT::i8,    Expand);
  setOperationAction(ISD::CTTZ,             MVT::i16,   Expand);
  setOperationAction(ISD::CTLZ,             MVT::i8,    Expand);
  setOperationAction(ISD::CTLZ,             MVT::i16,   Expand);
  setOperationAction(ISD::CTPOP,            MVT::i8,    Expand);
  setOperationAction(ISD::CTPOP,            MVT::i16,   Expand);

  setOperationAction(ISD::SHL_PARTS,        MVT::i8,    Expand);
  setOperationAction(ISD::SHL_PARTS,        MVT::i16,   Expand);
  setOperationAction(ISD::SRL_PARTS,        MVT::i8,    Expand);
  setOperationAction(ISD::SRL_PARTS,        MVT::i16,   Expand);
  setOperationAction(ISD::SRA_PARTS,        MVT::i8,    Expand);
  setOperationAction(ISD::SRA_PARTS,        MVT::i16,   Expand);

  setOperationAction(ISD::SIGN_EXTEND_INREG, MVT::i1,   Expand);

  // FIXME: Implement efficiently multiplication by a constant
  setOperationAction(ISD::MUL,              MVT::i8,    Expand);
  setOperationAction(ISD::MULHS,            MVT::i8,    Expand);
  setOperationAction(ISD::MULHU,            MVT::i8,    Expand);
  setOperationAction(ISD::SMUL_LOHI,        MVT::i8,    Expand);
  setOperationAction(ISD::UMUL_LOHI,        MVT::i8,    Expand);
  setOperationAction(ISD::MUL,              MVT::i16,   Expand);
  setOperationAction(ISD::MULHS,            MVT::i16,   Expand);
  setOperationAction(ISD::MULHU,            MVT::i16,   Expand);
  setOperationAction(ISD::SMUL_LOHI,        MVT::i16,   Expand);
  setOperationAction(ISD::UMUL_LOHI,        MVT::i16,   Expand);

  setOperationAction(ISD::UDIV,             MVT::i8,    Expand);
  setOperationAction(ISD::UDIVREM,          MVT::i8,    Expand);
  setOperationAction(ISD::UREM,             MVT::i8,    Expand);
  setOperationAction(ISD::SDIV,             MVT::i8,    Expand);
  setOperationAction(ISD::SDIVREM,          MVT::i8,    Expand);
  setOperationAction(ISD::SREM,             MVT::i8,    Expand);
  setOperationAction(ISD::UDIV,             MVT::i16,   Expand);
  setOperationAction(ISD::UDIVREM,          MVT::i16,   Expand);
  setOperationAction(ISD::UREM,             MVT::i16,   Expand);
  setOperationAction(ISD::SDIV,             MVT::i16,   Expand);
  setOperationAction(ISD::SDIVREM,          MVT::i16,   Expand);
  setOperationAction(ISD::SREM,             MVT::i16,   Expand);

  // Libcalls names.
  if (HWMultMode == HWMultIntr) {
    setLibcallName(RTLIB::MUL_I8,  "__mulqi3hw");
    setLibcallName(RTLIB::MUL_I16, "__mulhi3hw");
  } else if (HWMultMode == HWMultNoIntr) {
    setLibcallName(RTLIB::MUL_I8,  "__mulqi3hw_noint");
    setLibcallName(RTLIB::MUL_I16, "__mulhi3hw_noint");
  }
}
MSP430TargetLowering::MSP430TargetLowering(MSP430TargetMachine &tm) :
    TargetLowering(tm), Subtarget(*tm.getSubtargetImpl()), TM(tm) {

    // Set up the register classes.
    addRegisterClass(MVT::i8,  MSP430::GR8RegisterClass);
    addRegisterClass(MVT::i16, MSP430::GR16RegisterClass);

    // Compute derived properties from the register classes
    computeRegisterProperties();

    // Provide all sorts of operation actions

    // Division is expensive
    setIntDivIsCheap(false);

    // Even if we have only 1 bit shift here, we can perform
    // shifts of the whole bitwidth 1 bit per step.
    setShiftAmountType(MVT::i8);

    setStackPointerRegisterToSaveRestore(MSP430::SPW);
    setBooleanContents(ZeroOrOneBooleanContent);
    setSchedulingPreference(SchedulingForLatency);

    setLoadExtAction(ISD::EXTLOAD,  MVT::i1, Promote);
    setLoadExtAction(ISD::SEXTLOAD, MVT::i1, Promote);
    setLoadExtAction(ISD::ZEXTLOAD, MVT::i1, Promote);
    setLoadExtAction(ISD::SEXTLOAD, MVT::i8, Expand);
    setLoadExtAction(ISD::SEXTLOAD, MVT::i16, Expand);

    // We don't have any truncstores
    setTruncStoreAction(MVT::i16, MVT::i8, Expand);

    setOperationAction(ISD::SRA,              MVT::i8,    Custom);
    setOperationAction(ISD::SHL,              MVT::i8,    Custom);
    setOperationAction(ISD::SRL,              MVT::i8,    Custom);
    setOperationAction(ISD::SRA,              MVT::i16,   Custom);
    setOperationAction(ISD::SHL,              MVT::i16,   Custom);
    setOperationAction(ISD::SRL,              MVT::i16,   Custom);
    setOperationAction(ISD::ROTL,             MVT::i8,    Expand);
    setOperationAction(ISD::ROTR,             MVT::i8,    Expand);
    setOperationAction(ISD::ROTL,             MVT::i16,   Expand);
    setOperationAction(ISD::ROTR,             MVT::i16,   Expand);
    setOperationAction(ISD::RET,              MVT::Other, Custom);
    setOperationAction(ISD::GlobalAddress,    MVT::i16,   Custom);
    setOperationAction(ISD::ExternalSymbol,   MVT::i16,   Custom);
    setOperationAction(ISD::BR_JT,            MVT::Other, Expand);
    setOperationAction(ISD::BRIND,            MVT::Other, Expand);
    setOperationAction(ISD::BR_CC,            MVT::i8,    Custom);
    setOperationAction(ISD::BR_CC,            MVT::i16,   Custom);
    setOperationAction(ISD::BRCOND,           MVT::Other, Expand);
    setOperationAction(ISD::SETCC,            MVT::i8,    Expand);
    setOperationAction(ISD::SETCC,            MVT::i16,   Expand);
    setOperationAction(ISD::SELECT,           MVT::i8,    Expand);
    setOperationAction(ISD::SELECT,           MVT::i16,   Expand);
    setOperationAction(ISD::SELECT_CC,        MVT::i8,    Custom);
    setOperationAction(ISD::SELECT_CC,        MVT::i16,   Custom);
    setOperationAction(ISD::SIGN_EXTEND,      MVT::i16,   Custom);

    // FIXME: Implement efficiently multiplication by a constant
    setOperationAction(ISD::MUL,              MVT::i16,   Expand);
    setOperationAction(ISD::MULHS,            MVT::i16,   Expand);
    setOperationAction(ISD::MULHU,            MVT::i16,   Expand);
    setOperationAction(ISD::SMUL_LOHI,        MVT::i16,   Expand);
    setOperationAction(ISD::UMUL_LOHI,        MVT::i16,   Expand);

    setOperationAction(ISD::UDIV,             MVT::i16,   Expand);
    setOperationAction(ISD::UDIVREM,          MVT::i16,   Expand);
    setOperationAction(ISD::UREM,             MVT::i16,   Expand);
    setOperationAction(ISD::SDIV,             MVT::i16,   Expand);
    setOperationAction(ISD::SDIVREM,          MVT::i16,   Expand);
    setOperationAction(ISD::SREM,             MVT::i16,   Expand);
}