content: {-# OPTIONS_GHC -fno-warn-orphans #-}
  
  -- | Native code generator for RiscV64 architectures
  module GHC.CmmToAsm.RV64 (ncgRV64) where
  
  import GHC.CmmToAsm.Config
  import GHC.CmmToAsm.Instr
  import GHC.CmmToAsm.Monad
  import GHC.CmmToAsm.RV64.CodeGen qualified as RV64
  import GHC.CmmToAsm.RV64.Instr qualified as RV64
  import GHC.CmmToAsm.RV64.Ppr qualified as RV64
  import GHC.CmmToAsm.RV64.RegInfo qualified as RV64
  import GHC.CmmToAsm.RV64.Regs qualified as RV64
  import GHC.CmmToAsm.Types
  import GHC.Prelude
  import GHC.Utils.Outputable (ftext)
  
  ncgRV64 :: NCGConfig -> NcgImpl RawCmmStatics RV64.Instr RV64.JumpDest
  ncgRV64 config =
    NcgImpl
      { ncgConfig = config,
        cmmTopCodeGen = RV64.cmmTopCodeGen,
        generateJumpTableForInstr = RV64.generateJumpTableForInstr config,
        getJumpDestBlockId = RV64.getJumpDestBlockId,
        canShortcut = RV64.canShortcut,
        shortcutStatics = RV64.shortcutStatics,
        shortcutJump = RV64.shortcutJump,
        pprNatCmmDeclS = RV64.pprNatCmmDecl config,
        pprNatCmmDeclH = RV64.pprNatCmmDecl config,
        maxSpillSlots = RV64.maxSpillSlots config,
        allocatableRegs = RV64.allocatableRegs platform,
        ncgAllocMoreStack = RV64.allocMoreStack platform,
        ncgMakeFarBranches = RV64.makeFarBranches,
        extractUnwindPoints = const [],
        invertCondBranches = \_ _ -> id
      }
    where
      platform = ncgPlatform config
  
  -- | `Instruction` instance for RV64
  instance Instruction RV64.Instr where
    regUsageOfInstr = RV64.regUsageOfInstr
    patchRegsOfInstr _ = RV64.patchRegsOfInstr
    isJumpishInstr = RV64.isJumpishInstr
    canFallthroughTo = RV64.canFallthroughTo
    jumpDestsOfInstr = RV64.jumpDestsOfInstr
    patchJumpInstr = RV64.patchJumpInstr
    mkSpillInstr = RV64.mkSpillInstr
    mkLoadInstr = RV64.mkLoadInstr
    takeDeltaInstr = RV64.takeDeltaInstr
    isMetaInstr = RV64.isMetaInstr
    mkRegRegMoveInstr _ _ = RV64.mkRegRegMoveInstr
    takeRegRegMoveInstr _ = RV64.takeRegRegMoveInstr
    mkJumpInstr = RV64.mkJumpInstr
    mkStackAllocInstr = RV64.mkStackAllocInstr
    mkStackDeallocInstr = RV64.mkStackDeallocInstr
    mkComment = pure . RV64.COMMENT . ftext
    pprInstr = RV64.pprInstr
  