GHC/CmmToAsm/SPARC.hs

    {-# OPTIONS_GHC -fno-warn-orphans #-}

    -- | Native code generator for SPARC architectures
    module GHC.CmmToAsm.SPARC
       ( ncgSPARC
       )
    where

    import GHC.Prelude
    import GHC.Utils.Panic

    import GHC.CmmToAsm.Monad
    import GHC.CmmToAsm.Config
    import GHC.CmmToAsm.Types
    import GHC.CmmToAsm.Instr

    import qualified GHC.CmmToAsm.SPARC.Instr          as SPARC
    import qualified GHC.CmmToAsm.SPARC.Ppr            as SPARC
    import qualified GHC.CmmToAsm.SPARC.CodeGen        as SPARC
    import qualified GHC.CmmToAsm.SPARC.CodeGen.Expand as SPARC
    import qualified GHC.CmmToAsm.SPARC.Regs           as SPARC
    import qualified GHC.CmmToAsm.SPARC.ShortcutJump   as SPARC

    ncgSPARC :: NCGConfig -> NcgImpl RawCmmStatics SPARC.Instr SPARC.JumpDest
    ncgSPARC config = NcgImpl
       { ncgConfig                 = config
       , cmmTopCodeGen             = SPARC.cmmTopCodeGen
       , generateJumpTableForInstr = SPARC.generateJumpTableForInstr platform
       , getJumpDestBlockId        = SPARC.getJumpDestBlockId
       , canShortcut               = SPARC.canShortcut
       , shortcutStatics           = SPARC.shortcutStatics
       , shortcutJump              = SPARC.shortcutJump
       , pprNatCmmDecl             = SPARC.pprNatCmmDecl config
       , maxSpillSlots             = SPARC.maxSpillSlots config
       , allocatableRegs           = SPARC.allocatableRegs
       , ncgExpandTop              = map SPARC.expandTop
       , ncgMakeFarBranches        = const id
       , extractUnwindPoints       = const []
       , invertCondBranches        = \_ _ -> id
       -- Allocating more stack space for spilling isn't currently supported for the
       -- linear register allocator on SPARC, hence the panic below.
       , ncgAllocMoreStack         = noAllocMoreStack
       }
        where
          platform = ncgPlatform config

          noAllocMoreStack amount _
            = panic $   "Register allocator: out of stack slots (need " ++ show amount ++ ")\n"
                  ++  "   If you are trying to compile SHA1.hs from the crypto library then this\n"
                  ++  "   is a known limitation in the linear allocator.\n"
                  ++  "\n"
                  ++  "   Try enabling the graph colouring allocator with -fregs-graph instead."
                  ++  "   You can still file a bug report if you like.\n"

    -- | instance for sparc instruction set
    instance Instruction SPARC.Instr where
       regUsageOfInstr         = SPARC.regUsageOfInstr
       patchRegsOfInstr        = SPARC.patchRegsOfInstr
       isJumpishInstr          = SPARC.isJumpishInstr
       jumpDestsOfInstr        = SPARC.jumpDestsOfInstr
       patchJumpInstr          = SPARC.patchJumpInstr
       mkSpillInstr            = SPARC.mkSpillInstr
       mkLoadInstr             = SPARC.mkLoadInstr
       takeDeltaInstr          = SPARC.takeDeltaInstr
       isMetaInstr             = SPARC.isMetaInstr
       mkRegRegMoveInstr       = SPARC.mkRegRegMoveInstr
       takeRegRegMoveInstr     = SPARC.takeRegRegMoveInstr
       mkJumpInstr             = SPARC.mkJumpInstr
       pprInstr                = SPARC.pprInstr
       mkStackAllocInstr       = panic "no sparc_mkStackAllocInstr"
       mkStackDeallocInstr     = panic "no sparc_mkStackDeallocInstr"