| //===- Blackfin.td - Describe the Blackfin Target Machine --*- tablegen -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // |
| //===----------------------------------------------------------------------===// |
| |
| //===----------------------------------------------------------------------===// |
| // Target-independent interfaces which we are implementing |
| //===----------------------------------------------------------------------===// |
| |
| include "llvm/Target/Target.td" |
| |
| //===----------------------------------------------------------------------===// |
| // Blackfin Subtarget features. |
| //===----------------------------------------------------------------------===// |
| |
| def FeatureSDRAM : SubtargetFeature<"sdram", "sdram", "true", |
| "Build for SDRAM">; |
| |
| def FeatureICPLB : SubtargetFeature<"icplb", "icplb", "true", |
| "Assume instruction cache lookaside buffers are enabled at runtime">; |
| |
| //===----------------------------------------------------------------------===// |
| // Bugs in the silicon becomes workarounds in the compiler. |
| // See http://www.analog.com/ for the full list of IC anomalies. |
| //===----------------------------------------------------------------------===// |
| |
| def WA_MI_SHIFT : SubtargetFeature<"mi-shift-anomaly","wa_mi_shift", "true", |
| "Work around 05000074 - " |
| "Multi-Issue Instruction with dsp32shiftimm and P-reg Store">; |
| |
| def WA_CSYNC : SubtargetFeature<"csync-anomaly","wa_csync", "true", |
| "Work around 05000244 - " |
| "If I-Cache Is On, CSYNC/SSYNC/IDLE Around Change of Control">; |
| |
| def WA_SPECLD : SubtargetFeature<"specld-anomaly","wa_specld", "true", |
| "Work around 05000245 - " |
| "Access in the Shadow of a Conditional Branch">; |
| |
| def WA_HWLOOP : SubtargetFeature<"hwloop-anomaly","wa_hwloop", "true", |
| "Work around 05000257 - " |
| "Interrupt/Exception During Short Hardware Loop">; |
| |
| def WA_MMR_STALL : SubtargetFeature<"mmr-stall-anomaly","wa_mmr_stall", "true", |
| "Work around 05000283 - " |
| "System MMR Write Is Stalled Indefinitely when Killed">; |
| |
| def WA_LCREGS : SubtargetFeature<"lcregs-anomaly","wa_lcregs", "true", |
| "Work around 05000312 - " |
| "SSYNC, CSYNC, or Loads to LT, LB and LC Registers Are Interrupted">; |
| |
| def WA_KILLED_MMR : SubtargetFeature<"killed-mmr-anomaly", |
| "wa_killed_mmr", "true", |
| "Work around 05000315 - " |
| "Killed System MMR Write Completes Erroneously on Next System MMR Access">; |
| |
| def WA_RETS : SubtargetFeature<"rets-anomaly", "wa_rets", "true", |
| "Work around 05000371 - " |
| "Possible RETS Register Corruption when Subroutine Is under 5 Cycles">; |
| |
| def WA_IND_CALL : SubtargetFeature<"ind-call-anomaly", "wa_ind_call", "true", |
| "Work around 05000426 - " |
| "Speculative Fetches of Indirect-Pointer Instructions">; |
| |
| //===----------------------------------------------------------------------===// |
| // Register File, Calling Conv, Instruction Descriptions |
| //===----------------------------------------------------------------------===// |
| |
| include "BlackfinRegisterInfo.td" |
| include "BlackfinCallingConv.td" |
| include "BlackfinIntrinsics.td" |
| include "BlackfinInstrInfo.td" |
| |
| def BlackfinInstrInfo : InstrInfo {} |
| |
| //===----------------------------------------------------------------------===// |
| // Blackfin processors supported. |
| //===----------------------------------------------------------------------===// |
| |
| class Proc<string Name, string Suffix, list<SubtargetFeature> Features> |
| : Processor<!strconcat(Name, Suffix), NoItineraries, Features>; |
| |
| def : Proc<"generic", "", []>; |
| |
| multiclass Core<string Name,string Suffix, |
| list<SubtargetFeature> Features> { |
| def : Proc<Name, Suffix, Features>; |
| def : Proc<Name, "", Features>; |
| def : Proc<Name, "-none", []>; |
| } |
| |
| multiclass CoreEdinburgh<string Name> |
| : Core<Name, "-0.6", [WA_MI_SHIFT, WA_SPECLD, WA_LCREGS]> { |
| def : Proc<Name, "-0.5", |
| [WA_MI_SHIFT, WA_SPECLD, WA_MMR_STALL, WA_LCREGS, WA_KILLED_MMR, |
| WA_RETS]>; |
| def : Proc<Name, "-0.4", |
| [WA_MI_SHIFT, WA_CSYNC, WA_SPECLD, WA_HWLOOP, WA_MMR_STALL, WA_LCREGS, |
| WA_KILLED_MMR, WA_RETS]>; |
| def : Proc<Name, "-0.3", |
| [WA_MI_SHIFT, WA_CSYNC, WA_SPECLD, WA_HWLOOP, WA_MMR_STALL, WA_LCREGS, |
| WA_KILLED_MMR, WA_RETS]>; |
| def : Proc<Name, "-any", |
| [WA_MI_SHIFT, WA_CSYNC, WA_SPECLD, WA_HWLOOP, WA_MMR_STALL, WA_LCREGS, |
| WA_KILLED_MMR, WA_RETS]>; |
| } |
| multiclass CoreBraemar<string Name> |
| : Core<Name, "-0.3", |
| [WA_MI_SHIFT, WA_SPECLD, WA_LCREGS, WA_RETS, WA_IND_CALL]> { |
| def : Proc<Name, "-0.2", |
| [WA_MI_SHIFT, WA_CSYNC, WA_SPECLD, WA_HWLOOP, WA_MMR_STALL, WA_LCREGS, |
| WA_KILLED_MMR, WA_RETS, WA_IND_CALL]>; |
| def : Proc<Name, "-any", |
| [WA_MI_SHIFT, WA_CSYNC, WA_SPECLD, WA_HWLOOP, WA_MMR_STALL, WA_LCREGS, |
| WA_KILLED_MMR, WA_RETS, WA_IND_CALL]>; |
| } |
| multiclass CoreStirling<string Name> |
| : Core<Name, "-0.5", [WA_MI_SHIFT, WA_SPECLD, WA_IND_CALL]> { |
| def : Proc<Name, "-0.4", |
| [WA_MI_SHIFT, WA_SPECLD, WA_LCREGS, WA_RETS, WA_IND_CALL]>; |
| def : Proc<Name, "-0.3", |
| [WA_MI_SHIFT, WA_SPECLD, WA_MMR_STALL, WA_LCREGS, WA_KILLED_MMR, |
| WA_RETS, WA_IND_CALL]>; |
| def : Proc<Name, "-any", |
| [WA_MI_SHIFT, WA_SPECLD, WA_MMR_STALL, WA_LCREGS, WA_KILLED_MMR, |
| WA_RETS, WA_IND_CALL]>; |
| } |
| multiclass CoreMoab<string Name> |
| : Core<Name, "-0.3", [WA_MI_SHIFT, WA_SPECLD, WA_IND_CALL]> { |
| def : Proc<Name, "-0.2", [WA_MI_SHIFT, WA_SPECLD, WA_IND_CALL]>; |
| def : Proc<Name, "-0.1", [WA_MI_SHIFT, WA_SPECLD, WA_RETS, WA_IND_CALL]>; |
| def : Proc<Name, "-0.0", |
| [WA_MI_SHIFT, WA_SPECLD, WA_LCREGS, WA_RETS, WA_IND_CALL]>; |
| def : Proc<Name, "-any", |
| [WA_MI_SHIFT, WA_SPECLD, WA_LCREGS, WA_RETS, WA_IND_CALL]>; |
| } |
| multiclass CoreTeton<string Name> |
| : Core<Name, "-0.5", |
| [WA_MI_SHIFT, WA_SPECLD, WA_MMR_STALL, WA_LCREGS, WA_KILLED_MMR, |
| WA_RETS, WA_IND_CALL]> { |
| def : Proc<Name, "-0.3", |
| [WA_MI_SHIFT, WA_CSYNC, WA_SPECLD, WA_HWLOOP, WA_MMR_STALL, WA_LCREGS, |
| WA_KILLED_MMR, WA_RETS, WA_IND_CALL]>; |
| def : Proc<Name, "-any", |
| [WA_MI_SHIFT, WA_CSYNC, WA_SPECLD, WA_HWLOOP, WA_MMR_STALL, WA_LCREGS, |
| WA_KILLED_MMR, WA_RETS, WA_IND_CALL]>; |
| } |
| multiclass CoreKookaburra<string Name> |
| : Core<Name, "-0.2", [WA_MI_SHIFT, WA_SPECLD, WA_IND_CALL]> { |
| def : Proc<Name, "-0.1", [WA_MI_SHIFT, WA_SPECLD, WA_RETS, WA_IND_CALL]>; |
| def : Proc<Name, "-0.0", [WA_MI_SHIFT, WA_SPECLD, WA_RETS, WA_IND_CALL]>; |
| def : Proc<Name, "-any", [WA_MI_SHIFT, WA_SPECLD, WA_RETS, WA_IND_CALL]>; |
| } |
| multiclass CoreMockingbird<string Name> |
| : Core<Name, "-0.1", [WA_MI_SHIFT, WA_SPECLD, WA_IND_CALL]> { |
| def : Proc<Name, "-0.0", [WA_MI_SHIFT, WA_SPECLD, WA_IND_CALL]>; |
| def : Proc<Name, "-any", [WA_MI_SHIFT, WA_SPECLD, WA_IND_CALL]>; |
| } |
| multiclass CoreBrodie<string Name> |
| : Core<Name, "-0.1", [WA_MI_SHIFT, WA_SPECLD, WA_IND_CALL]> { |
| def : Proc<Name, "-0.0", [WA_MI_SHIFT, WA_SPECLD, WA_IND_CALL]>; |
| def : Proc<Name, "-any", [WA_MI_SHIFT, WA_SPECLD, WA_IND_CALL]>; |
| } |
| |
| defm BF512 : CoreBrodie<"bf512">; |
| defm BF514 : CoreBrodie<"bf514">; |
| defm BF516 : CoreBrodie<"bf516">; |
| defm BF518 : CoreBrodie<"bf518">; |
| defm BF522 : CoreMockingbird<"bf522">; |
| defm BF523 : CoreKookaburra<"bf523">; |
| defm BF524 : CoreMockingbird<"bf524">; |
| defm BF525 : CoreKookaburra<"bf525">; |
| defm BF526 : CoreMockingbird<"bf526">; |
| defm BF527 : CoreKookaburra<"bf527">; |
| defm BF531 : CoreEdinburgh<"bf531">; |
| defm BF532 : CoreEdinburgh<"bf532">; |
| defm BF533 : CoreEdinburgh<"bf533">; |
| defm BF534 : CoreBraemar<"bf534">; |
| defm BF536 : CoreBraemar<"bf536">; |
| defm BF537 : CoreBraemar<"bf537">; |
| defm BF538 : CoreStirling<"bf538">; |
| defm BF539 : CoreStirling<"bf539">; |
| defm BF542 : CoreMoab<"bf542">; |
| defm BF544 : CoreMoab<"bf544">; |
| defm BF548 : CoreMoab<"bf548">; |
| defm BF549 : CoreMoab<"bf549">; |
| defm BF561 : CoreTeton<"bf561">; |
| |
| //===----------------------------------------------------------------------===// |
| // Declare the target which we are implementing |
| //===----------------------------------------------------------------------===// |
| |
| def Blackfin : Target { |
| // Pull in Instruction Info: |
| let InstructionSet = BlackfinInstrInfo; |
| } |