ghc-9.12.1: GHC/Platform/Reg/Class.hs
{-# 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