1dff0c46cSDimitry Andric //===-- MSP430Subtarget.cpp - MSP430 Subtarget Information ----------------===//
2f22ef01cSRoman Divacky //
3f22ef01cSRoman Divacky // The LLVM Compiler Infrastructure
4f22ef01cSRoman Divacky //
5f22ef01cSRoman Divacky // This file is distributed under the University of Illinois Open Source
6f22ef01cSRoman Divacky // License. See LICENSE.TXT for details.
7f22ef01cSRoman Divacky //
8f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
9f22ef01cSRoman Divacky //
1017a519f9SDimitry Andric // This file implements the MSP430 specific subclass of TargetSubtargetInfo.
11f22ef01cSRoman Divacky //
12f22ef01cSRoman Divacky //===----------------------------------------------------------------------===//
13f22ef01cSRoman Divacky
14f22ef01cSRoman Divacky #include "MSP430Subtarget.h"
15f22ef01cSRoman Divacky #include "MSP430.h"
166122f3e6SDimitry Andric #include "llvm/Support/TargetRegistry.h"
1717a519f9SDimitry Andric
1891bc56edSDimitry Andric using namespace llvm;
1991bc56edSDimitry Andric
2091bc56edSDimitry Andric #define DEBUG_TYPE "msp430-subtarget"
2191bc56edSDimitry Andric
22*302affcbSDimitry Andric static cl::opt<MSP430Subtarget::HWMultEnum>
23*302affcbSDimitry Andric HWMultModeOption("mhwmult", cl::Hidden,
24*302affcbSDimitry Andric cl::desc("Hardware multiplier use mode for MSP430"),
25*302affcbSDimitry Andric cl::init(MSP430Subtarget::NoHWMult),
26*302affcbSDimitry Andric cl::values(
27*302affcbSDimitry Andric clEnumValN(MSP430Subtarget::NoHWMult, "none",
28*302affcbSDimitry Andric "Do not use hardware multiplier"),
29*302affcbSDimitry Andric clEnumValN(MSP430Subtarget::HWMult16, "16bit",
30*302affcbSDimitry Andric "Use 16-bit hardware multiplier"),
31*302affcbSDimitry Andric clEnumValN(MSP430Subtarget::HWMult32, "32bit",
32*302affcbSDimitry Andric "Use 32-bit hardware multiplier"),
33*302affcbSDimitry Andric clEnumValN(MSP430Subtarget::HWMultF5, "f5series",
34*302affcbSDimitry Andric "Use F5 series hardware multiplier")));
35*302affcbSDimitry Andric
3617a519f9SDimitry Andric #define GET_SUBTARGETINFO_TARGET_DESC
3717a519f9SDimitry Andric #define GET_SUBTARGETINFO_CTOR
3817a519f9SDimitry Andric #include "MSP430GenSubtargetInfo.inc"
39f22ef01cSRoman Divacky
anchor()40dff0c46cSDimitry Andric void MSP430Subtarget::anchor() { }
41dff0c46cSDimitry Andric
42ff0cc061SDimitry Andric MSP430Subtarget &
initializeSubtargetDependencies(StringRef CPU,StringRef FS)43ff0cc061SDimitry Andric MSP430Subtarget::initializeSubtargetDependencies(StringRef CPU, StringRef FS) {
44*302affcbSDimitry Andric ExtendedInsts = false;
45*302affcbSDimitry Andric HWMultMode = NoHWMult;
46*302affcbSDimitry Andric
47*302affcbSDimitry Andric std::string CPUName = CPU;
48*302affcbSDimitry Andric if (CPUName.empty())
49*302affcbSDimitry Andric CPUName = "msp430";
50*302affcbSDimitry Andric
51*302affcbSDimitry Andric ParseSubtargetFeatures(CPUName, FS);
52*302affcbSDimitry Andric
53*302affcbSDimitry Andric if (HWMultModeOption != NoHWMult)
54*302affcbSDimitry Andric HWMultMode = HWMultModeOption;
55*302affcbSDimitry Andric
5691bc56edSDimitry Andric return *this;
57f22ef01cSRoman Divacky }
5891bc56edSDimitry Andric
MSP430Subtarget(const Triple & TT,const std::string & CPU,const std::string & FS,const TargetMachine & TM)598f0fd8f6SDimitry Andric MSP430Subtarget::MSP430Subtarget(const Triple &TT, const std::string &CPU,
6091bc56edSDimitry Andric const std::string &FS, const TargetMachine &TM)
61ff0cc061SDimitry Andric : MSP430GenSubtargetInfo(TT, CPU, FS), FrameLowering(),
62875ed548SDimitry Andric InstrInfo(initializeSubtargetDependencies(CPU, FS)), TLInfo(TM, *this) {}
63