Created
May 18, 2017 17:52
-
-
Save pftbest/38e2bdb46a42f9ac7833fd23ed73f6cb to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| From b239677c8dd4a574ab7407a4a2539d3f15857c91 Mon Sep 17 00:00:00 2001 | |
| From: Vadzim Dambrouski <vadzim.dambrouski@promwad.com> | |
| Date: Thu, 18 May 2017 20:51:55 +0300 | |
| Subject: [PATCH] [MSP430] Add subtarget features for hardware multiplier. | |
| --- | |
| lib/Target/MSP430/MSP430.td | 15 ++++++++++++++- | |
| lib/Target/MSP430/MSP430ISelLowering.cpp | 27 +++------------------------ | |
| lib/Target/MSP430/MSP430Subtarget.cpp | 27 ++++++++++++++++++++++++++- | |
| lib/Target/MSP430/MSP430Subtarget.h | 11 +++++++++++ | |
| test/CodeGen/MSP430/hwmult16.ll | 1 + | |
| test/CodeGen/MSP430/hwmult32.ll | 1 + | |
| test/CodeGen/MSP430/hwmultf5.ll | 1 + | |
| 7 files changed, 57 insertions(+), 26 deletions(-) | |
| diff --git a/lib/Target/MSP430/MSP430.td b/lib/Target/MSP430/MSP430.td | |
| index dfea669f3ba..bf1878bbcf1 100644 | |
| --- a/lib/Target/MSP430/MSP430.td | |
| +++ b/lib/Target/MSP430/MSP430.td | |
| @@ -22,13 +22,26 @@ def FeatureX | |
| : SubtargetFeature<"ext", "ExtendedInsts", "true", | |
| "Enable MSP430-X extensions">; | |
| +def FeatureHWMult16 | |
| + : SubtargetFeature<"hwmult16", "HWMultMode", "HWMult16", | |
| + "Enable 16-bit hardware multiplier">; | |
| + | |
| +def FeatureHWMult32 | |
| + : SubtargetFeature<"hwmult32", "HWMultMode", "HWMult32", | |
| + "Enable 32-bit hardware multiplier">; | |
| + | |
| +def FeatureHWMultF5 | |
| + : SubtargetFeature<"hwmultf5", "HWMultMode", "HWMultF5", | |
| + "Enable F5 series hardware multiplier">; | |
| + | |
| //===----------------------------------------------------------------------===// | |
| // MSP430 supported processors. | |
| //===----------------------------------------------------------------------===// | |
| class Proc<string Name, list<SubtargetFeature> Features> | |
| : Processor<Name, NoItineraries, Features>; | |
| -def : Proc<"generic", []>; | |
| +def : Proc<"msp430", []>; | |
| +def : Proc<"msp430x", [FeatureX]>; | |
| //===----------------------------------------------------------------------===// | |
| // Register File Description | |
| diff --git a/lib/Target/MSP430/MSP430ISelLowering.cpp b/lib/Target/MSP430/MSP430ISelLowering.cpp | |
| index cc6e64043f5..dae14fd301e 100644 | |
| --- a/lib/Target/MSP430/MSP430ISelLowering.cpp | |
| +++ b/lib/Target/MSP430/MSP430ISelLowering.cpp | |
| @@ -38,27 +38,6 @@ using namespace llvm; | |
| #define DEBUG_TYPE "msp430-lower" | |
| -typedef enum { | |
| - NoHWMult, | |
| - HWMult16, | |
| - HWMult32, | |
| - HWMultF5 | |
| -} HWMultUseMode; | |
| - | |
| -static cl::opt<HWMultUseMode> | |
| -HWMultMode("mhwmult", cl::Hidden, | |
| - cl::desc("Hardware multiplier use mode"), | |
| - cl::init(NoHWMult), | |
| - cl::values( | |
| - clEnumValN(NoHWMult, "none", | |
| - "Do not use hardware multiplier"), | |
| - clEnumValN(HWMult16, "16bit", | |
| - "Use 16-bit hardware multiplier"), | |
| - clEnumValN(HWMult32, "32bit", | |
| - "Use 32-bit hardware multiplier"), | |
| - clEnumValN(HWMultF5, "f5series", | |
| - "Use F5 series hardware multiplier"))); | |
| - | |
| MSP430TargetLowering::MSP430TargetLowering(const TargetMachine &TM, | |
| const MSP430Subtarget &STI) | |
| : TargetLowering(TM) { | |
| @@ -262,7 +241,7 @@ MSP430TargetLowering::MSP430TargetLowering(const TargetMachine &TM, | |
| setCmpLibcallCC(LC.Op, LC.Cond); | |
| } | |
| - if (HWMultMode == HWMult16) { | |
| + if (STI.hasHWMult16()) { | |
| const struct { | |
| const RTLIB::Libcall Op; | |
| const char * const Name; | |
| @@ -277,7 +256,7 @@ MSP430TargetLowering::MSP430TargetLowering(const TargetMachine &TM, | |
| for (const auto &LC : LibraryCalls) { | |
| setLibcallName(LC.Op, LC.Name); | |
| } | |
| - } else if (HWMultMode == HWMult32) { | |
| + } else if (STI.hasHWMult32()) { | |
| const struct { | |
| const RTLIB::Libcall Op; | |
| const char * const Name; | |
| @@ -292,7 +271,7 @@ MSP430TargetLowering::MSP430TargetLowering(const TargetMachine &TM, | |
| for (const auto &LC : LibraryCalls) { | |
| setLibcallName(LC.Op, LC.Name); | |
| } | |
| - } else if (HWMultMode == HWMultF5) { | |
| + } else if (STI.hasHWMultF5()) { | |
| const struct { | |
| const RTLIB::Libcall Op; | |
| const char * const Name; | |
| diff --git a/lib/Target/MSP430/MSP430Subtarget.cpp b/lib/Target/MSP430/MSP430Subtarget.cpp | |
| index 6216348e4d7..776a9dcb11d 100644 | |
| --- a/lib/Target/MSP430/MSP430Subtarget.cpp | |
| +++ b/lib/Target/MSP430/MSP430Subtarget.cpp | |
| @@ -19,6 +19,20 @@ using namespace llvm; | |
| #define DEBUG_TYPE "msp430-subtarget" | |
| +static cl::opt<MSP430Subtarget::HWMultEnum> | |
| +HWMultModeOption("mhwmult", cl::Hidden, | |
| + cl::desc("Hardware multiplier use mode for MSP430"), | |
| + cl::init(MSP430Subtarget::NoHWMult), | |
| + cl::values( | |
| + clEnumValN(MSP430Subtarget::NoHWMult, "none", | |
| + "Do not use hardware multiplier"), | |
| + clEnumValN(MSP430Subtarget::HWMult16, "16bit", | |
| + "Use 16-bit hardware multiplier"), | |
| + clEnumValN(MSP430Subtarget::HWMult32, "32bit", | |
| + "Use 32-bit hardware multiplier"), | |
| + clEnumValN(MSP430Subtarget::HWMultF5, "f5series", | |
| + "Use F5 series hardware multiplier"))); | |
| + | |
| #define GET_SUBTARGETINFO_TARGET_DESC | |
| #define GET_SUBTARGETINFO_CTOR | |
| #include "MSP430GenSubtargetInfo.inc" | |
| @@ -27,7 +41,18 @@ void MSP430Subtarget::anchor() { } | |
| MSP430Subtarget & | |
| MSP430Subtarget::initializeSubtargetDependencies(StringRef CPU, StringRef FS) { | |
| - ParseSubtargetFeatures("generic", FS); | |
| + ExtendedInsts = false; | |
| + HWMultMode = NoHWMult; | |
| + | |
| + std::string CPUName = CPU; | |
| + if (CPUName.empty()) | |
| + CPUName = "msp430"; | |
| + | |
| + ParseSubtargetFeatures(CPUName, FS); | |
| + | |
| + if (HWMultModeOption != NoHWMult) | |
| + HWMultMode = HWMultModeOption; | |
| + | |
| return *this; | |
| } | |
| diff --git a/lib/Target/MSP430/MSP430Subtarget.h b/lib/Target/MSP430/MSP430Subtarget.h | |
| index 1a00d85e01c..8828dfd6587 100644 | |
| --- a/lib/Target/MSP430/MSP430Subtarget.h | |
| +++ b/lib/Target/MSP430/MSP430Subtarget.h | |
| @@ -30,8 +30,15 @@ namespace llvm { | |
| class StringRef; | |
| class MSP430Subtarget : public MSP430GenSubtargetInfo { | |
| +public: | |
| + enum HWMultEnum { | |
| + NoHWMult, HWMult16, HWMult32, HWMultF5 | |
| + }; | |
| + | |
| +private: | |
| virtual void anchor(); | |
| bool ExtendedInsts; | |
| + HWMultEnum HWMultMode; | |
| MSP430FrameLowering FrameLowering; | |
| MSP430InstrInfo InstrInfo; | |
| MSP430TargetLowering TLInfo; | |
| @@ -50,6 +57,10 @@ public: | |
| /// subtarget options. Definition of function is auto generated by tblgen. | |
| void ParseSubtargetFeatures(StringRef CPU, StringRef FS); | |
| + bool hasHWMult16() const { return HWMultMode == HWMult16; } | |
| + bool hasHWMult32() const { return HWMultMode == HWMult32; } | |
| + bool hasHWMultF5() const { return HWMultMode == HWMultF5; } | |
| + | |
| const TargetFrameLowering *getFrameLowering() const override { | |
| return &FrameLowering; | |
| } | |
| diff --git a/test/CodeGen/MSP430/hwmult16.ll b/test/CodeGen/MSP430/hwmult16.ll | |
| index b23f1ad37d8..87b6a7aeacf 100644 | |
| --- a/test/CodeGen/MSP430/hwmult16.ll | |
| +++ b/test/CodeGen/MSP430/hwmult16.ll | |
| @@ -1,4 +1,5 @@ | |
| ; RUN: llc -O0 -mhwmult=16bit < %s | FileCheck %s | |
| +; RUN: llc -O0 -mattr=+hwmult16 < %s | FileCheck %s | |
| target datalayout = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16-a0:16:16" | |
| target triple = "msp430---elf" | |
| diff --git a/test/CodeGen/MSP430/hwmult32.ll b/test/CodeGen/MSP430/hwmult32.ll | |
| index 6ffeb969886..10c831e77ff 100644 | |
| --- a/test/CodeGen/MSP430/hwmult32.ll | |
| +++ b/test/CodeGen/MSP430/hwmult32.ll | |
| @@ -1,4 +1,5 @@ | |
| ; RUN: llc -O0 -mhwmult=32bit < %s | FileCheck %s | |
| +; RUN: llc -O0 -mattr=+hwmult32 < %s | FileCheck %s | |
| target datalayout = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16-a0:16:16" | |
| target triple = "msp430---elf" | |
| diff --git a/test/CodeGen/MSP430/hwmultf5.ll b/test/CodeGen/MSP430/hwmultf5.ll | |
| index 51ca4be4a65..c57922ece7d 100644 | |
| --- a/test/CodeGen/MSP430/hwmultf5.ll | |
| +++ b/test/CodeGen/MSP430/hwmultf5.ll | |
| @@ -1,4 +1,5 @@ | |
| ; RUN: llc -O0 -mhwmult=f5series < %s | FileCheck %s | |
| +; RUN: llc -O0 -mattr=+hwmultf5 < %s | FileCheck %s | |
| target datalayout = "e-p:16:16:16-i8:8:8-i16:16:16-i32:16:32-n8:16-a0:16:16" | |
| target triple = "msp430---elf" | |
| -- | |
| 2.13.0 | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment