module GHC.CmmToAsm.Reg.Target (
targetVirtualRegSqueeze,
targetRealRegSqueeze,
targetClassOfRealReg,
targetMkVirtualReg,
targetRegDotColor,
targetClassOfReg,
mapRegFormatSet,
)
where
import GHC.Prelude
import GHC.Platform.Reg
import GHC.Platform.Reg.Class
import GHC.CmmToAsm.Format
import GHC.Utils.Outputable
import GHC.Utils.Misc
import GHC.Utils.Panic
import GHC.Types.Unique
import GHC.Types.Unique.Set
import GHC.Platform
import qualified GHC.CmmToAsm.X86.Regs as X86
import qualified GHC.CmmToAsm.X86.RegInfo as X86
import qualified GHC.CmmToAsm.PPC.Regs as PPC
import qualified GHC.CmmToAsm.AArch64.Regs as AArch64
import qualified GHC.CmmToAsm.RV64.Regs as RV64
targetVirtualRegSqueeze :: Platform -> RegClass -> VirtualReg -> Int
targetVirtualRegSqueeze :: Platform -> RegClass -> VirtualReg -> Int
targetVirtualRegSqueeze Platform
platform
= case Platform -> Arch
platformArch Platform
platform of
Arch
ArchX86 -> RegClass -> VirtualReg -> Int
X86.virtualRegSqueeze
Arch
ArchX86_64 -> RegClass -> VirtualReg -> Int
X86.virtualRegSqueeze
Arch
ArchPPC -> RegClass -> VirtualReg -> Int
PPC.virtualRegSqueeze
Arch
ArchS390X -> String -> RegClass -> VirtualReg -> Int
forall a. HasCallStack => String -> a
panic String
"targetVirtualRegSqueeze ArchS390X"
ArchPPC_64 PPC_64ABI
_ -> RegClass -> VirtualReg -> Int
PPC.virtualRegSqueeze
ArchARM ArmISA
_ [ArmISAExt]
_ ArmABI
_ -> String -> RegClass -> VirtualReg -> Int
forall a. HasCallStack => String -> a
panic String
"targetVirtualRegSqueeze ArchARM"
Arch
ArchAArch64 -> RegClass -> VirtualReg -> Int
AArch64.virtualRegSqueeze
Arch
ArchAlpha -> String -> RegClass -> VirtualReg -> Int
forall a. HasCallStack => String -> a
panic String
"targetVirtualRegSqueeze ArchAlpha"
Arch
ArchMipseb -> String -> RegClass -> VirtualReg -> Int
forall a. HasCallStack => String -> a
panic String
"targetVirtualRegSqueeze ArchMipseb"
Arch
ArchMipsel -> String -> RegClass -> VirtualReg -> Int
forall a. HasCallStack => String -> a
panic String
"targetVirtualRegSqueeze ArchMipsel"
Arch
ArchRISCV64 -> RegClass -> VirtualReg -> Int
RV64.virtualRegSqueeze
Arch
ArchLoongArch64->String -> RegClass -> VirtualReg -> Int
forall a. HasCallStack => String -> a
panic String
"targetVirtualRegSqueeze ArchLoongArch64"
Arch
ArchJavaScript-> String -> RegClass -> VirtualReg -> Int
forall a. HasCallStack => String -> a
panic String
"targetVirtualRegSqueeze ArchJavaScript"
Arch
ArchWasm32 -> String -> RegClass -> VirtualReg -> Int
forall a. HasCallStack => String -> a
panic String
"targetVirtualRegSqueeze ArchWasm32"
Arch
ArchUnknown -> String -> RegClass -> VirtualReg -> Int
forall a. HasCallStack => String -> a
panic String
"targetVirtualRegSqueeze ArchUnknown"
targetRealRegSqueeze :: Platform -> RegClass -> RealReg -> Int
targetRealRegSqueeze :: Platform -> RegClass -> RealReg -> Int
targetRealRegSqueeze Platform
platform
= case Platform -> Arch
platformArch Platform
platform of
Arch
ArchX86 -> RegClass -> RealReg -> Int
X86.realRegSqueeze
Arch
ArchX86_64 -> RegClass -> RealReg -> Int
X86.realRegSqueeze
Arch
ArchPPC -> RegClass -> RealReg -> Int
PPC.realRegSqueeze
Arch
ArchS390X -> String -> RegClass -> RealReg -> Int
forall a. HasCallStack => String -> a
panic String
"targetRealRegSqueeze ArchS390X"
ArchPPC_64 PPC_64ABI
_ -> RegClass -> RealReg -> Int
PPC.realRegSqueeze
ArchARM ArmISA
_ [ArmISAExt]
_ ArmABI
_ -> String -> RegClass -> RealReg -> Int
forall a. HasCallStack => String -> a
panic String
"targetRealRegSqueeze ArchARM"
Arch
ArchAArch64 -> RegClass -> RealReg -> Int
AArch64.realRegSqueeze
Arch
ArchAlpha -> String -> RegClass -> RealReg -> Int
forall a. HasCallStack => String -> a
panic String
"targetRealRegSqueeze ArchAlpha"
Arch
ArchMipseb -> String -> RegClass -> RealReg -> Int
forall a. HasCallStack => String -> a
panic String
"targetRealRegSqueeze ArchMipseb"
Arch
ArchMipsel -> String -> RegClass -> RealReg -> Int
forall a. HasCallStack => String -> a
panic String
"targetRealRegSqueeze ArchMipsel"
Arch
ArchRISCV64 -> RegClass -> RealReg -> Int
RV64.realRegSqueeze
Arch
ArchLoongArch64->String -> RegClass -> RealReg -> Int
forall a. HasCallStack => String -> a
panic String
"targetRealRegSqueeze ArchLoongArch64"
Arch
ArchJavaScript-> String -> RegClass -> RealReg -> Int
forall a. HasCallStack => String -> a
panic String
"targetRealRegSqueeze ArchJavaScript"
Arch
ArchWasm32 -> String -> RegClass -> RealReg -> Int
forall a. HasCallStack => String -> a
panic String
"targetRealRegSqueeze ArchWasm32"
Arch
ArchUnknown -> String -> RegClass -> RealReg -> Int
forall a. HasCallStack => String -> a
panic String
"targetRealRegSqueeze ArchUnknown"
targetClassOfRealReg :: Platform -> RealReg -> RegClass
targetClassOfRealReg :: Platform -> RealReg -> RegClass
targetClassOfRealReg Platform
platform
= case Platform -> Arch
platformArch Platform
platform of
Arch
ArchX86 -> Platform -> RealReg -> RegClass
X86.classOfRealReg Platform
platform
Arch
ArchX86_64 -> Platform -> RealReg -> RegClass
X86.classOfRealReg Platform
platform
Arch
ArchPPC -> RealReg -> RegClass
PPC.classOfRealReg
Arch
ArchS390X -> String -> RealReg -> RegClass
forall a. HasCallStack => String -> a
panic String
"targetClassOfRealReg ArchS390X"
ArchPPC_64 PPC_64ABI
_ -> RealReg -> RegClass
PPC.classOfRealReg
ArchARM ArmISA
_ [ArmISAExt]
_ ArmABI
_ -> String -> RealReg -> RegClass
forall a. HasCallStack => String -> a
panic String
"targetClassOfRealReg ArchARM"
Arch
ArchAArch64 -> RealReg -> RegClass
AArch64.classOfRealReg
Arch
ArchAlpha -> String -> RealReg -> RegClass
forall a. HasCallStack => String -> a
panic String
"targetClassOfRealReg ArchAlpha"
Arch
ArchMipseb -> String -> RealReg -> RegClass
forall a. HasCallStack => String -> a
panic String
"targetClassOfRealReg ArchMipseb"
Arch
ArchMipsel -> String -> RealReg -> RegClass
forall a. HasCallStack => String -> a
panic String
"targetClassOfRealReg ArchMipsel"
Arch
ArchRISCV64 -> RealReg -> RegClass
RV64.classOfRealReg
Arch
ArchLoongArch64->String -> RealReg -> RegClass
forall a. HasCallStack => String -> a
panic String
"targetClassOfRealReg ArchLoongArch64"
Arch
ArchJavaScript-> String -> RealReg -> RegClass
forall a. HasCallStack => String -> a
panic String
"targetClassOfRealReg ArchJavaScript"
Arch
ArchWasm32 -> String -> RealReg -> RegClass
forall a. HasCallStack => String -> a
panic String
"targetClassOfRealReg ArchWasm32"
Arch
ArchUnknown -> String -> RealReg -> RegClass
forall a. HasCallStack => String -> a
panic String
"targetClassOfRealReg ArchUnknown"
targetMkVirtualReg :: Platform -> Unique -> Format -> VirtualReg
targetMkVirtualReg :: Platform -> Unique -> Format -> VirtualReg
targetMkVirtualReg Platform
platform
= case Platform -> Arch
platformArch Platform
platform of
Arch
ArchX86 -> Unique -> Format -> VirtualReg
X86.mkVirtualReg
Arch
ArchX86_64 -> Unique -> Format -> VirtualReg
X86.mkVirtualReg
Arch
ArchPPC -> Unique -> Format -> VirtualReg
PPC.mkVirtualReg
Arch
ArchS390X -> String -> Unique -> Format -> VirtualReg
forall a. HasCallStack => String -> a
panic String
"targetMkVirtualReg ArchS390X"
ArchPPC_64 PPC_64ABI
_ -> Unique -> Format -> VirtualReg
PPC.mkVirtualReg
ArchARM ArmISA
_ [ArmISAExt]
_ ArmABI
_ -> String -> Unique -> Format -> VirtualReg
forall a. HasCallStack => String -> a
panic String
"targetMkVirtualReg ArchARM"
Arch
ArchAArch64 -> Unique -> Format -> VirtualReg
AArch64.mkVirtualReg
Arch
ArchAlpha -> String -> Unique -> Format -> VirtualReg
forall a. HasCallStack => String -> a
panic String
"targetMkVirtualReg ArchAlpha"
Arch
ArchMipseb -> String -> Unique -> Format -> VirtualReg
forall a. HasCallStack => String -> a
panic String
"targetMkVirtualReg ArchMipseb"
Arch
ArchMipsel -> String -> Unique -> Format -> VirtualReg
forall a. HasCallStack => String -> a
panic String
"targetMkVirtualReg ArchMipsel"
Arch
ArchRISCV64 -> Unique -> Format -> VirtualReg
RV64.mkVirtualReg
Arch
ArchLoongArch64->String -> Unique -> Format -> VirtualReg
forall a. HasCallStack => String -> a
panic String
"targetMkVirtualReg ArchLoongArch64"
Arch
ArchJavaScript-> String -> Unique -> Format -> VirtualReg
forall a. HasCallStack => String -> a
panic String
"targetMkVirtualReg ArchJavaScript"
Arch
ArchWasm32 -> String -> Unique -> Format -> VirtualReg
forall a. HasCallStack => String -> a
panic String
"targetMkVirtualReg ArchWasm32"
Arch
ArchUnknown -> String -> Unique -> Format -> VirtualReg
forall a. HasCallStack => String -> a
panic String
"targetMkVirtualReg ArchUnknown"
targetRegDotColor :: Platform -> RealReg -> SDoc
targetRegDotColor :: Platform -> RealReg -> SDoc
targetRegDotColor Platform
platform
= case Platform -> Arch
platformArch Platform
platform of
Arch
ArchX86 -> Platform -> RealReg -> SDoc
X86.regDotColor Platform
platform
Arch
ArchX86_64 -> Platform -> RealReg -> SDoc
X86.regDotColor Platform
platform
Arch
ArchPPC -> RealReg -> SDoc
PPC.regDotColor
Arch
ArchS390X -> String -> RealReg -> SDoc
forall a. HasCallStack => String -> a
panic String
"targetRegDotColor ArchS390X"
ArchPPC_64 PPC_64ABI
_ -> RealReg -> SDoc
PPC.regDotColor
ArchARM ArmISA
_ [ArmISAExt]
_ ArmABI
_ -> String -> RealReg -> SDoc
forall a. HasCallStack => String -> a
panic String
"targetRegDotColor ArchARM"
Arch
ArchAArch64 -> RealReg -> SDoc
AArch64.regDotColor
Arch
ArchAlpha -> String -> RealReg -> SDoc
forall a. HasCallStack => String -> a
panic String
"targetRegDotColor ArchAlpha"
Arch
ArchMipseb -> String -> RealReg -> SDoc
forall a. HasCallStack => String -> a
panic String
"targetRegDotColor ArchMipseb"
Arch
ArchMipsel -> String -> RealReg -> SDoc
forall a. HasCallStack => String -> a
panic String
"targetRegDotColor ArchMipsel"
Arch
ArchRISCV64 -> RealReg -> SDoc
RV64.regDotColor
Arch
ArchLoongArch64->String -> RealReg -> SDoc
forall a. HasCallStack => String -> a
panic String
"targetRegDotColor ArchLoongArch64"
Arch
ArchJavaScript-> String -> RealReg -> SDoc
forall a. HasCallStack => String -> a
panic String
"targetRegDotColor ArchJavaScript"
Arch
ArchWasm32 -> String -> RealReg -> SDoc
forall a. HasCallStack => String -> a
panic String
"targetRegDotColor ArchWasm32"
Arch
ArchUnknown -> String -> RealReg -> SDoc
forall a. HasCallStack => String -> a
panic String
"targetRegDotColor ArchUnknown"
targetClassOfReg :: Platform -> Reg -> RegClass
targetClassOfReg :: Platform -> Reg -> RegClass
targetClassOfReg Platform
platform Reg
reg
= case Reg
reg of
RegVirtual VirtualReg
vr -> Arch -> VirtualReg -> RegClass
classOfVirtualReg (Platform -> Arch
platformArch Platform
platform) VirtualReg
vr
RegReal RealReg
rr -> Platform -> RealReg -> RegClass
targetClassOfRealReg Platform
platform RealReg
rr
mapRegFormatSet :: HasDebugCallStack => (Reg -> Reg) -> UniqSet RegWithFormat -> UniqSet RegWithFormat
mapRegFormatSet :: HasDebugCallStack =>
(Reg -> Reg) -> UniqSet RegWithFormat -> UniqSet RegWithFormat
mapRegFormatSet Reg -> Reg
f = (RegWithFormat -> RegWithFormat)
-> UniqSet RegWithFormat -> UniqSet RegWithFormat
forall b a. Uniquable b => (a -> b) -> UniqSet a -> UniqSet b
mapUniqSet (\ ( RegWithFormat Reg
r Format
fmt ) -> Reg -> Format -> RegWithFormat
RegWithFormat ( Reg -> Reg
f Reg
r ) Format
fmt)