|
@@ -26,19 +26,21 @@
|
|
|
|
|
|
#include "AVR.h"
|
|
|
#include "AVRMachineFunctionInfo.h"
|
|
|
+#include "AVRSubtarget.h"
|
|
|
#include "AVRTargetMachine.h"
|
|
|
#include "MCTargetDesc/AVRMCTargetDesc.h"
|
|
|
|
|
|
namespace llvm {
|
|
|
|
|
|
-AVRTargetLowering::AVRTargetLowering(AVRTargetMachine &tm)
|
|
|
- : TargetLowering(tm) {
|
|
|
+AVRTargetLowering::AVRTargetLowering(const AVRTargetMachine &TM,
|
|
|
+ const AVRSubtarget &STI)
|
|
|
+ : TargetLowering(TM), Subtarget(STI) {
|
|
|
// Set up the register classes.
|
|
|
addRegisterClass(MVT::i8, &AVR::GPR8RegClass);
|
|
|
addRegisterClass(MVT::i16, &AVR::DREGSRegClass);
|
|
|
|
|
|
// Compute derived properties from the register classes.
|
|
|
- computeRegisterProperties(tm.getSubtargetImpl()->getRegisterInfo());
|
|
|
+ computeRegisterProperties(Subtarget.getRegisterInfo());
|
|
|
|
|
|
setBooleanContents(ZeroOrOneBooleanContent);
|
|
|
setBooleanVectorContents(ZeroOrOneBooleanContent);
|
|
@@ -163,6 +165,13 @@ AVRTargetLowering::AVRTargetLowering(AVRTargetMachine &tm)
|
|
|
setOperationAction(ISD::SMUL_LOHI, MVT::i16, Expand);
|
|
|
setOperationAction(ISD::UMUL_LOHI, MVT::i16, Expand);
|
|
|
|
|
|
+ // Expand multiplications to libcalls when there is
|
|
|
+ // no hardware MUL.
|
|
|
+ if (!Subtarget.supportsMultiplication()) {
|
|
|
+ setOperationAction(ISD::SMUL_LOHI, MVT::i8, Expand);
|
|
|
+ setOperationAction(ISD::UMUL_LOHI, MVT::i8, Expand);
|
|
|
+ }
|
|
|
+
|
|
|
for (MVT VT : MVT::integer_valuetypes()) {
|
|
|
setOperationAction(ISD::MULHS, VT, Expand);
|
|
|
setOperationAction(ISD::MULHU, VT, Expand);
|
|
@@ -1271,7 +1280,7 @@ SDValue AVRTargetLowering::LowerCall(TargetLowering::CallLoweringInfo &CLI,
|
|
|
|
|
|
// Add a register mask operand representing the call-preserved registers.
|
|
|
const AVRTargetMachine &TM = (const AVRTargetMachine &)getTargetMachine();
|
|
|
- const TargetRegisterInfo *TRI = TM.getSubtargetImpl()->getRegisterInfo();
|
|
|
+ const TargetRegisterInfo *TRI = Subtarget.getRegisterInfo();
|
|
|
const uint32_t *Mask =
|
|
|
TRI->getCallPreservedMask(DAG.getMachineFunction(), CallConv);
|
|
|
assert(Mask && "Missing call preserved mask for calling convention");
|
|
@@ -1434,7 +1443,7 @@ MachineBasicBlock *AVRTargetLowering::insertShift(MachineInstr &MI,
|
|
|
MachineFunction *F = BB->getParent();
|
|
|
MachineRegisterInfo &RI = F->getRegInfo();
|
|
|
const AVRTargetMachine &TM = (const AVRTargetMachine &)getTargetMachine();
|
|
|
- const TargetInstrInfo &TII = *TM.getSubtargetImpl()->getInstrInfo();
|
|
|
+ const TargetInstrInfo &TII = *Subtarget.getInstrInfo();
|
|
|
DebugLoc dl = MI.getDebugLoc();
|
|
|
|
|
|
switch (MI.getOpcode()) {
|
|
@@ -1575,7 +1584,7 @@ static bool isCopyMulResult(MachineBasicBlock::iterator const &I) {
|
|
|
MachineBasicBlock *AVRTargetLowering::insertMul(MachineInstr &MI,
|
|
|
MachineBasicBlock *BB) const {
|
|
|
const AVRTargetMachine &TM = (const AVRTargetMachine &)getTargetMachine();
|
|
|
- const TargetInstrInfo &TII = *TM.getSubtargetImpl()->getInstrInfo();
|
|
|
+ const TargetInstrInfo &TII = *Subtarget.getInstrInfo();
|
|
|
MachineBasicBlock::iterator I(MI);
|
|
|
++I; // in any case insert *after* the mul instruction
|
|
|
if (isCopyMulResult(I))
|
|
@@ -1838,9 +1847,6 @@ std::pair<unsigned, const TargetRegisterClass *>
|
|
|
AVRTargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
|
|
|
StringRef Constraint,
|
|
|
MVT VT) const {
|
|
|
- auto STI = static_cast<const AVRTargetMachine &>(this->getTargetMachine())
|
|
|
- .getSubtargetImpl();
|
|
|
-
|
|
|
// We only support i8 and i16.
|
|
|
//
|
|
|
//:FIXME: remove this assert for now since it gets sometimes executed
|
|
@@ -1884,8 +1890,8 @@ AVRTargetLowering::getRegForInlineAsmConstraint(const TargetRegisterInfo *TRI,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- return TargetLowering::getRegForInlineAsmConstraint(STI->getRegisterInfo(),
|
|
|
- Constraint, VT);
|
|
|
+ return TargetLowering::getRegForInlineAsmConstraint(
|
|
|
+ Subtarget.getRegisterInfo(), Constraint, VT);
|
|
|
}
|
|
|
|
|
|
void AVRTargetLowering::LowerAsmOperandForConstraint(SDValue Op,
|