10b57cec5SDimitry Andric //===-- MSP430Subtarget.cpp - MSP430 Subtarget Information ----------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This file implements the MSP430 specific subclass of TargetSubtargetInfo.
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric
130b57cec5SDimitry Andric #include "MSP430Subtarget.h"
140b57cec5SDimitry Andric #include "MSP430.h"
15349cc55cSDimitry Andric #include "llvm/MC/TargetRegistry.h"
160b57cec5SDimitry Andric
170b57cec5SDimitry Andric using namespace llvm;
180b57cec5SDimitry Andric
190b57cec5SDimitry Andric #define DEBUG_TYPE "msp430-subtarget"
200b57cec5SDimitry Andric
210b57cec5SDimitry Andric static cl::opt<MSP430Subtarget::HWMultEnum>
220b57cec5SDimitry Andric HWMultModeOption("mhwmult", cl::Hidden,
230b57cec5SDimitry Andric cl::desc("Hardware multiplier use mode for MSP430"),
240b57cec5SDimitry Andric cl::init(MSP430Subtarget::NoHWMult),
250b57cec5SDimitry Andric cl::values(
260b57cec5SDimitry Andric clEnumValN(MSP430Subtarget::NoHWMult, "none",
270b57cec5SDimitry Andric "Do not use hardware multiplier"),
280b57cec5SDimitry Andric clEnumValN(MSP430Subtarget::HWMult16, "16bit",
290b57cec5SDimitry Andric "Use 16-bit hardware multiplier"),
300b57cec5SDimitry Andric clEnumValN(MSP430Subtarget::HWMult32, "32bit",
310b57cec5SDimitry Andric "Use 32-bit hardware multiplier"),
320b57cec5SDimitry Andric clEnumValN(MSP430Subtarget::HWMultF5, "f5series",
330b57cec5SDimitry Andric "Use F5 series hardware multiplier")));
340b57cec5SDimitry Andric
350b57cec5SDimitry Andric #define GET_SUBTARGETINFO_TARGET_DESC
360b57cec5SDimitry Andric #define GET_SUBTARGETINFO_CTOR
370b57cec5SDimitry Andric #include "MSP430GenSubtargetInfo.inc"
380b57cec5SDimitry Andric
anchor()390b57cec5SDimitry Andric void MSP430Subtarget::anchor() { }
400b57cec5SDimitry Andric
410b57cec5SDimitry Andric MSP430Subtarget &
initializeSubtargetDependencies(StringRef CPU,StringRef FS)420b57cec5SDimitry Andric MSP430Subtarget::initializeSubtargetDependencies(StringRef CPU, StringRef FS) {
430b57cec5SDimitry Andric ExtendedInsts = false;
440b57cec5SDimitry Andric HWMultMode = NoHWMult;
450b57cec5SDimitry Andric
465ffd83dbSDimitry Andric StringRef CPUName = CPU;
470b57cec5SDimitry Andric if (CPUName.empty())
480b57cec5SDimitry Andric CPUName = "msp430";
490b57cec5SDimitry Andric
50e8d8bef9SDimitry Andric ParseSubtargetFeatures(CPUName, /*TuneCPU*/ CPUName, FS);
510b57cec5SDimitry Andric
520b57cec5SDimitry Andric if (HWMultModeOption != NoHWMult)
530b57cec5SDimitry Andric HWMultMode = HWMultModeOption;
540b57cec5SDimitry Andric
550b57cec5SDimitry Andric return *this;
560b57cec5SDimitry Andric }
570b57cec5SDimitry Andric
MSP430Subtarget(const Triple & TT,const std::string & CPU,const std::string & FS,const TargetMachine & TM)580b57cec5SDimitry Andric MSP430Subtarget::MSP430Subtarget(const Triple &TT, const std::string &CPU,
590b57cec5SDimitry Andric const std::string &FS, const TargetMachine &TM)
6004eeddc0SDimitry Andric : MSP430GenSubtargetInfo(TT, CPU, /*TuneCPU*/ CPU, FS),
61*06c3fb27SDimitry Andric InstrInfo(initializeSubtargetDependencies(CPU, FS)), TLInfo(TM, *this),
62*06c3fb27SDimitry Andric FrameLowering(*this) {}
63