//===-- LeonFeatures.td - Describe the Leon Features -------*- tablegen -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//
//
//===----------------------------------------------------------------------===//

//===----------------------------------------------------------------------===//
// CASA Support differs between LEON3-FT GR712RC and LEON3-FT UT699
// We need to have the option to switch this on and off.
//===----------------------------------------------------------------------===//

// support to casa instruction; for leon3 subtarget only
def LeonCASA : SubtargetFeature<
                   "hasleoncasa", "HasLeonCasa", "true",
                   "Enable CASA instruction for LEON3 and LEON4 processors">;

//===----------------------------------------------------------------------===//
// UMAC and SMAC support for LEON3 and LEON4 processors.
//===----------------------------------------------------------------------===//

// support to casa instruction; for leon3 subtarget only
def UMACSMACSupport
    : SubtargetFeature<"hasumacsmac", "HasUmacSmac", "true",
                       "Enable UMAC and SMAC for LEON3 and LEON4 processors">;

//===----------------------------------------------------------------------===//
// LEON Erratum fixes
//===----------------------------------------------------------------------===//

def ReplaceSDIV
    : SubtargetFeature<
          "replacesdiv", "PerformSDIVReplace", "true",
          "AT697E erratum fix: Do not emit SDIV, emit SDIVCC instead">;

def FixCALL
    : SubtargetFeature<"fixcall", "FixCallImmediates", "true",
                       "AT697E erratum fix: Restrict the size of the immediate "
                       "operand of the CALL instruction to 20 bits">;

def IgnoreZeroFlag
    : SubtargetFeature<"ignrzeroflag", "IgnoreZeroFlag", "true",
                       "AT697E erratum fix: Do not rely on the zero bit flag "
                       "on a divide overflow for SDIVCC and UDIVCC">;

def InsertNOPDoublePrecision
    : SubtargetFeature<"insrtnopdblprcsn", "InsertNOPDoublePrecision", "true",
                       "LEON2 erratum fix: Insert a NOP before the double "
                       "precision floating point instruction">;

def FixFSMULD : SubtargetFeature<"fixfsmuld", "FixFSMULD", "true",
                                 "LEON3 erratum fix: Do not select FSMULD">;

def ReplaceFMULS
    : SubtargetFeature<"replacefmuls", "ReplaceFMULS", "true",
                       "LEON3 erratum fix: Replace FMULS instruction with a "
                       "routine using conversions/double precision operations "
                       "to replace FMULS">;

def PreventRoundChange
    : SubtargetFeature<"prvntroundchange", "PreventRoundChange", "true",
                       "LEON3 erratum fix: Prevent any rounding mode change "
                       "request: use only the round-to-nearest rounding mode">;

def FixAllFDIVSQRT
    : SubtargetFeature<"fixallfdivsqrt", "FixAllFDIVSQRT", "true",
                       "LEON3 erratum fix: Fix FDIVS/FDIVD/FSQRTS/FSQRTD "
                       "instructions with NOPs and floating-point store">;

def InsertNOPLoad
    : SubtargetFeature<"insertnopload", "InsertNOPLoad", "true",
                       "LEON3 erratum fix: Insert a NOP instruction after "
                       "every single-cycle load instruction when the next "
                       "instruction is another load/store instruction">;

def FlushCacheLineSWAP
    : SubtargetFeature<"flshcachelineswap", "FlushCacheLineSWAP", "true",
                       "LEON3 erratum fix: Flush cache line containing the "
                       "lock before performing any of the atomic instructions "
                       "SWAP and LDSTUB">;

def InsertNOPsLoadStore
    : SubtargetFeature<"insertnopsloadstore", "InsertNOPsLoadStore", "true",
                       "LEON3 erratum fix: Insert NOPs between "
                       "single-precision loads and the store, so the number of "
                       "instructions between is 4">;