packages feed

ghc-9.14.1: GHC/CmmToAsm/LA64.hs

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

-- | Native code generator for LoongArch64 architectures
module GHC.CmmToAsm.LA64 ( ncgLA64 ) where

import GHC.Prelude

import GHC.CmmToAsm.Config
import GHC.CmmToAsm.Instr
import GHC.CmmToAsm.Monad
import GHC.CmmToAsm.Types
import GHC.Utils.Outputable (ftext)

import qualified GHC.CmmToAsm.LA64.CodeGen  as LA64
import qualified GHC.CmmToAsm.LA64.Instr    as LA64
import qualified GHC.CmmToAsm.LA64.Ppr      as LA64
import qualified GHC.CmmToAsm.LA64.RegInfo  as LA64
import qualified GHC.CmmToAsm.LA64.Regs     as LA64

ncgLA64 :: NCGConfig -> NcgImpl RawCmmStatics LA64.Instr LA64.JumpDest
ncgLA64 config =
  NcgImpl
    { ncgConfig                 = config,
      cmmTopCodeGen             = LA64.cmmTopCodeGen,
      generateJumpTableForInstr = LA64.generateJumpTableForInstr config,
      getJumpDestBlockId        = LA64.getJumpDestBlockId,
      canShortcut               = LA64.canShortcut,
      shortcutStatics           = LA64.shortcutStatics,
      shortcutJump              = LA64.shortcutJump,
      pprNatCmmDeclS            = LA64.pprNatCmmDecl config,
      pprNatCmmDeclH            = LA64.pprNatCmmDecl config,
      maxSpillSlots             = LA64.maxSpillSlots config,
      allocatableRegs           = LA64.allocatableRegs platform,
      ncgAllocMoreStack         = LA64.allocMoreStack platform,
      ncgMakeFarBranches        = LA64.makeFarBranches,
      extractUnwindPoints       = const [],
      invertCondBranches        = \_ _ -> id
    }
  where
    platform = ncgPlatform config

-- | `Instruction` instance for LA64
instance Instruction LA64.Instr where
  regUsageOfInstr       = LA64.regUsageOfInstr
  patchRegsOfInstr _    = LA64.patchRegsOfInstr
  isJumpishInstr        = LA64.isJumpishInstr
  canFallthroughTo      = LA64.canFallthroughTo
  jumpDestsOfInstr      = LA64.jumpDestsOfInstr
  patchJumpInstr        = LA64.patchJumpInstr
  mkSpillInstr          = LA64.mkSpillInstr
  mkLoadInstr           = LA64.mkLoadInstr
  takeDeltaInstr        = LA64.takeDeltaInstr
  isMetaInstr           = LA64.isMetaInstr
  mkRegRegMoveInstr _ _ = LA64.mkRegRegMoveInstr
  takeRegRegMoveInstr _ = LA64.takeRegRegMoveInstr
  mkJumpInstr           = LA64.mkJumpInstr
  mkStackAllocInstr     = LA64.mkStackAllocInstr
  mkStackDeallocInstr   = LA64.mkStackDeallocInstr
  mkComment             = pure . LA64.COMMENT . ftext
  pprInstr              = LA64.pprInstr