content: {-# LANGUAGE LambdaCase #-}
  module GHC.Platform.Reg.Class
    ( RegClass (..), RegArch(..), registerArch )
  where
  
  import GHC.Prelude
  
  import GHC.Types.Unique
  import GHC.Builtin.Uniques ( mkRegClassUnique )
  import GHC.Platform.ArchOS
  import GHC.Utils.Outputable ( Outputable(ppr), text )
  
  
  -- | The class of a register.
  --      Used in the register allocator.
  --      We treat all registers in a class as being interchangeable.
  --
  newtype RegClass = RegClass Int
    deriving ( Eq, Ord, Show )
  
  instance Uniquable RegClass where
    getUnique ( RegClass i ) = mkRegClassUnique i
  
  -- | This instance is just used for the graph colouring register allocator.
  -- Prefer using either 'GHC.Platform.Reg.Class.Separate.pprRegClass'
  -- or 'GHC.Platform.Reg.Class.Unified.pprRegClass', which is more informative.
  instance Outputable RegClass where
    ppr (RegClass i) = ppr i
  
  -- | The register architecture of a given machine.
  data RegArch
    -- | Floating-point and vector registers are unified (e.g. X86, AArch64).
    = Unified
    -- | Floating-point and vector registers are separate (e.g. RISC-V).
    | Separate
    -- | No vector registers.
    | NoVectors
    deriving ( Eq, Ord, Show )
  
  instance Outputable RegArch where
    ppr regArch = text (show regArch)
  
  -- | What is the register architecture of the given architecture?
  registerArch :: Arch -> RegArch
  registerArch arch =
    case arch of
      ArchX86       -> Unified
      ArchX86_64    -> Unified
      ArchPPC       -> Unified
      ArchPPC_64 {} -> Unified
      ArchAArch64   -> Unified
      -- Support for vector registers not yet implemented for RISC-V
      -- see panic in `getFreeRegs`.
      --ArchRISCV64   -> Separate
      ArchRISCV64   -> NoVectors
      _             -> NoVectors
  