{-# LANGUAGE BangPatterns #-}
{-# LANGUAGE FlexibleContexts #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE UndecidableInstances #-}
module CmmExpr
( CmmExpr(..), cmmExprType, cmmExprWidth, maybeInvertCmmExpr
, CmmReg(..), cmmRegType, cmmRegWidth
, CmmLit(..), cmmLitType
, LocalReg(..), localRegType
, GlobalReg(..), isArgReg, globalRegType
, spReg, hpReg, spLimReg, hpLimReg, nodeReg
, currentTSOReg, currentNurseryReg, hpAllocReg, cccsReg
, node, baseReg
, VGcPtr(..)
, DefinerOfRegs, UserOfRegs
, foldRegsDefd, foldRegsUsed
, foldLocalRegsDefd, foldLocalRegsUsed
, RegSet, LocalRegSet, GlobalRegSet
, emptyRegSet, elemRegSet, extendRegSet, deleteFromRegSet, mkRegSet
, plusRegSet, minusRegSet, timesRegSet, sizeRegSet, nullRegSet
, regSetToList
, Area(..)
, module CmmMachOp
, module CmmType
)
where
import GhcPrelude
import BlockId
import CLabel
import CmmMachOp
import CmmType
import DynFlags
import Outputable (panic)
import Unique
import Data.Set (Set)
import qualified Data.Set as Set
data CmmExpr
= CmmLit CmmLit
| CmmLoad !CmmExpr !CmmType
| CmmReg !CmmReg
| CmmMachOp MachOp [CmmExpr]
| CmmStackSlot Area {-# UNPACK #-} !Int
| CmmRegOff !CmmReg Int
instance Eq CmmExpr where
CmmLit l1 :: CmmLit
l1 == :: CmmExpr -> CmmExpr -> Bool
== CmmLit l2 :: CmmLit
l2 = CmmLit
l1CmmLit -> CmmLit -> Bool
forall a. Eq a => a -> a -> Bool
==CmmLit
l2
CmmLoad e1 :: CmmExpr
e1 _ == CmmLoad e2 :: CmmExpr
e2 _ = CmmExpr
e1CmmExpr -> CmmExpr -> Bool
forall a. Eq a => a -> a -> Bool
==CmmExpr
e2
CmmReg r1 :: CmmReg
r1 == CmmReg r2 :: CmmReg
r2 = CmmReg
r1CmmReg -> CmmReg -> Bool
forall a. Eq a => a -> a -> Bool
==CmmReg
r2
CmmRegOff r1 :: CmmReg
r1 i1 :: Int
i1 == CmmRegOff r2 :: CmmReg
r2 i2 :: Int
i2 = CmmReg
r1CmmReg -> CmmReg -> Bool
forall a. Eq a => a -> a -> Bool
==CmmReg
r2 Bool -> Bool -> Bool
&& Int
i1Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==Int
i2
CmmMachOp op1 :: MachOp
op1 es1 :: [CmmExpr]
es1 == CmmMachOp op2 :: MachOp
op2 es2 :: [CmmExpr]
es2 = MachOp
op1MachOp -> MachOp -> Bool
forall a. Eq a => a -> a -> Bool
==MachOp
op2 Bool -> Bool -> Bool
&& [CmmExpr]
es1[CmmExpr] -> [CmmExpr] -> Bool
forall a. Eq a => a -> a -> Bool
==[CmmExpr]
es2
CmmStackSlot a1 :: Area
a1 i1 :: Int
i1 == CmmStackSlot a2 :: Area
a2 i2 :: Int
i2 = Area
a1Area -> Area -> Bool
forall a. Eq a => a -> a -> Bool
==Area
a2 Bool -> Bool -> Bool
&& Int
i1Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==Int
i2
_e1 :: CmmExpr
_e1 == _e2 :: CmmExpr
_e2 = Bool
False
data CmmReg
= CmmLocal {-# UNPACK #-} !LocalReg
| CmmGlobal GlobalReg
deriving( CmmReg -> CmmReg -> Bool
(CmmReg -> CmmReg -> Bool)
-> (CmmReg -> CmmReg -> Bool) -> Eq CmmReg
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CmmReg -> CmmReg -> Bool
$c/= :: CmmReg -> CmmReg -> Bool
== :: CmmReg -> CmmReg -> Bool
$c== :: CmmReg -> CmmReg -> Bool
Eq, Eq CmmReg
Eq CmmReg =>
(CmmReg -> CmmReg -> Ordering)
-> (CmmReg -> CmmReg -> Bool)
-> (CmmReg -> CmmReg -> Bool)
-> (CmmReg -> CmmReg -> Bool)
-> (CmmReg -> CmmReg -> Bool)
-> (CmmReg -> CmmReg -> CmmReg)
-> (CmmReg -> CmmReg -> CmmReg)
-> Ord CmmReg
CmmReg -> CmmReg -> Bool
CmmReg -> CmmReg -> Ordering
CmmReg -> CmmReg -> CmmReg
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: CmmReg -> CmmReg -> CmmReg
$cmin :: CmmReg -> CmmReg -> CmmReg
max :: CmmReg -> CmmReg -> CmmReg
$cmax :: CmmReg -> CmmReg -> CmmReg
>= :: CmmReg -> CmmReg -> Bool
$c>= :: CmmReg -> CmmReg -> Bool
> :: CmmReg -> CmmReg -> Bool
$c> :: CmmReg -> CmmReg -> Bool
<= :: CmmReg -> CmmReg -> Bool
$c<= :: CmmReg -> CmmReg -> Bool
< :: CmmReg -> CmmReg -> Bool
$c< :: CmmReg -> CmmReg -> Bool
compare :: CmmReg -> CmmReg -> Ordering
$ccompare :: CmmReg -> CmmReg -> Ordering
$cp1Ord :: Eq CmmReg
Ord )
data Area
= Old
| Young {-# UNPACK #-} !BlockId
deriving (Area -> Area -> Bool
(Area -> Area -> Bool) -> (Area -> Area -> Bool) -> Eq Area
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Area -> Area -> Bool
$c/= :: Area -> Area -> Bool
== :: Area -> Area -> Bool
$c== :: Area -> Area -> Bool
Eq, Eq Area
Eq Area =>
(Area -> Area -> Ordering)
-> (Area -> Area -> Bool)
-> (Area -> Area -> Bool)
-> (Area -> Area -> Bool)
-> (Area -> Area -> Bool)
-> (Area -> Area -> Area)
-> (Area -> Area -> Area)
-> Ord Area
Area -> Area -> Bool
Area -> Area -> Ordering
Area -> Area -> Area
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Area -> Area -> Area
$cmin :: Area -> Area -> Area
max :: Area -> Area -> Area
$cmax :: Area -> Area -> Area
>= :: Area -> Area -> Bool
$c>= :: Area -> Area -> Bool
> :: Area -> Area -> Bool
$c> :: Area -> Area -> Bool
<= :: Area -> Area -> Bool
$c<= :: Area -> Area -> Bool
< :: Area -> Area -> Bool
$c< :: Area -> Area -> Bool
compare :: Area -> Area -> Ordering
$ccompare :: Area -> Area -> Ordering
$cp1Ord :: Eq Area
Ord)
data CmmLit
= CmmInt !Integer Width
| CmmFloat Rational Width
| CmmVec [CmmLit]
| CmmLabel CLabel
| CmmLabelOff CLabel Int
| CmmLabelDiffOff CLabel CLabel Int Width
| CmmBlock {-# UNPACK #-} !BlockId
| CmmHighStackMark
deriving CmmLit -> CmmLit -> Bool
(CmmLit -> CmmLit -> Bool)
-> (CmmLit -> CmmLit -> Bool) -> Eq CmmLit
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CmmLit -> CmmLit -> Bool
$c/= :: CmmLit -> CmmLit -> Bool
== :: CmmLit -> CmmLit -> Bool
$c== :: CmmLit -> CmmLit -> Bool
Eq
cmmExprType :: DynFlags -> CmmExpr -> CmmType
cmmExprType :: DynFlags -> CmmExpr -> CmmType
cmmExprType dflags :: DynFlags
dflags (CmmLit lit :: CmmLit
lit) = DynFlags -> CmmLit -> CmmType
cmmLitType DynFlags
dflags CmmLit
lit
cmmExprType _ (CmmLoad _ rep :: CmmType
rep) = CmmType
rep
cmmExprType dflags :: DynFlags
dflags (CmmReg reg :: CmmReg
reg) = DynFlags -> CmmReg -> CmmType
cmmRegType DynFlags
dflags CmmReg
reg
cmmExprType dflags :: DynFlags
dflags (CmmMachOp op :: MachOp
op args :: [CmmExpr]
args) = DynFlags -> MachOp -> [CmmType] -> CmmType
machOpResultType DynFlags
dflags MachOp
op ((CmmExpr -> CmmType) -> [CmmExpr] -> [CmmType]
forall a b. (a -> b) -> [a] -> [b]
map (DynFlags -> CmmExpr -> CmmType
cmmExprType DynFlags
dflags) [CmmExpr]
args)
cmmExprType dflags :: DynFlags
dflags (CmmRegOff reg :: CmmReg
reg _) = DynFlags -> CmmReg -> CmmType
cmmRegType DynFlags
dflags CmmReg
reg
cmmExprType dflags :: DynFlags
dflags (CmmStackSlot _ _) = DynFlags -> CmmType
bWord DynFlags
dflags
cmmLitType :: DynFlags -> CmmLit -> CmmType
cmmLitType :: DynFlags -> CmmLit -> CmmType
cmmLitType _ (CmmInt _ width :: Width
width) = Width -> CmmType
cmmBits Width
width
cmmLitType _ (CmmFloat _ width :: Width
width) = Width -> CmmType
cmmFloat Width
width
cmmLitType _ (CmmVec []) = String -> CmmType
forall a. String -> a
panic "cmmLitType: CmmVec []"
cmmLitType cflags :: DynFlags
cflags (CmmVec (l :: CmmLit
l:ls :: [CmmLit]
ls)) = let ty :: CmmType
ty = DynFlags -> CmmLit -> CmmType
cmmLitType DynFlags
cflags CmmLit
l
in if (CmmType -> Bool) -> [CmmType] -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all (CmmType -> CmmType -> Bool
`cmmEqType` CmmType
ty) ((CmmLit -> CmmType) -> [CmmLit] -> [CmmType]
forall a b. (a -> b) -> [a] -> [b]
map (DynFlags -> CmmLit -> CmmType
cmmLitType DynFlags
cflags) [CmmLit]
ls)
then Int -> CmmType -> CmmType
cmmVec (1Int -> Int -> Int
forall a. Num a => a -> a -> a
+[CmmLit] -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length [CmmLit]
ls) CmmType
ty
else String -> CmmType
forall a. String -> a
panic "cmmLitType: CmmVec"
cmmLitType dflags :: DynFlags
dflags (CmmLabel lbl :: CLabel
lbl) = DynFlags -> CLabel -> CmmType
cmmLabelType DynFlags
dflags CLabel
lbl
cmmLitType dflags :: DynFlags
dflags (CmmLabelOff lbl :: CLabel
lbl _) = DynFlags -> CLabel -> CmmType
cmmLabelType DynFlags
dflags CLabel
lbl
cmmLitType _ (CmmLabelDiffOff _ _ _ width :: Width
width) = Width -> CmmType
cmmBits Width
width
cmmLitType dflags :: DynFlags
dflags (CmmBlock _) = DynFlags -> CmmType
bWord DynFlags
dflags
cmmLitType dflags :: DynFlags
dflags (CmmLit
CmmHighStackMark) = DynFlags -> CmmType
bWord DynFlags
dflags
cmmLabelType :: DynFlags -> CLabel -> CmmType
cmmLabelType :: DynFlags -> CLabel -> CmmType
cmmLabelType dflags :: DynFlags
dflags lbl :: CLabel
lbl
| CLabel -> Bool
isGcPtrLabel CLabel
lbl = DynFlags -> CmmType
gcWord DynFlags
dflags
| Bool
otherwise = DynFlags -> CmmType
bWord DynFlags
dflags
cmmExprWidth :: DynFlags -> CmmExpr -> Width
cmmExprWidth :: DynFlags -> CmmExpr -> Width
cmmExprWidth dflags :: DynFlags
dflags e :: CmmExpr
e = CmmType -> Width
typeWidth (DynFlags -> CmmExpr -> CmmType
cmmExprType DynFlags
dflags CmmExpr
e)
maybeInvertCmmExpr :: CmmExpr -> Maybe CmmExpr
maybeInvertCmmExpr :: CmmExpr -> Maybe CmmExpr
maybeInvertCmmExpr (CmmMachOp op :: MachOp
op args :: [CmmExpr]
args) = do MachOp
op' <- MachOp -> Maybe MachOp
maybeInvertComparison MachOp
op
CmmExpr -> Maybe CmmExpr
forall (m :: * -> *) a. Monad m => a -> m a
return (MachOp -> [CmmExpr] -> CmmExpr
CmmMachOp MachOp
op' [CmmExpr]
args)
maybeInvertCmmExpr _ = Maybe CmmExpr
forall a. Maybe a
Nothing
data LocalReg
= LocalReg {-# UNPACK #-} !Unique CmmType
instance Eq LocalReg where
(LocalReg u1 :: Unique
u1 _) == :: LocalReg -> LocalReg -> Bool
== (LocalReg u2 :: Unique
u2 _) = Unique
u1 Unique -> Unique -> Bool
forall a. Eq a => a -> a -> Bool
== Unique
u2
instance Ord LocalReg where
compare :: LocalReg -> LocalReg -> Ordering
compare (LocalReg u1 :: Unique
u1 _) (LocalReg u2 :: Unique
u2 _) = Unique -> Unique -> Ordering
nonDetCmpUnique Unique
u1 Unique
u2
instance Uniquable LocalReg where
getUnique :: LocalReg -> Unique
getUnique (LocalReg uniq :: Unique
uniq _) = Unique
uniq
cmmRegType :: DynFlags -> CmmReg -> CmmType
cmmRegType :: DynFlags -> CmmReg -> CmmType
cmmRegType _ (CmmLocal reg :: LocalReg
reg) = LocalReg -> CmmType
localRegType LocalReg
reg
cmmRegType dflags :: DynFlags
dflags (CmmGlobal reg :: GlobalReg
reg) = DynFlags -> GlobalReg -> CmmType
globalRegType DynFlags
dflags GlobalReg
reg
cmmRegWidth :: DynFlags -> CmmReg -> Width
cmmRegWidth :: DynFlags -> CmmReg -> Width
cmmRegWidth dflags :: DynFlags
dflags = CmmType -> Width
typeWidth (CmmType -> Width) -> (CmmReg -> CmmType) -> CmmReg -> Width
forall b c a. (b -> c) -> (a -> b) -> a -> c
. DynFlags -> CmmReg -> CmmType
cmmRegType DynFlags
dflags
localRegType :: LocalReg -> CmmType
localRegType :: LocalReg -> CmmType
localRegType (LocalReg _ rep :: CmmType
rep) = CmmType
rep
type RegSet r = Set r
type LocalRegSet = RegSet LocalReg
type GlobalRegSet = RegSet GlobalReg
emptyRegSet :: RegSet r
nullRegSet :: RegSet r -> Bool
elemRegSet :: Ord r => r -> RegSet r -> Bool
extendRegSet :: Ord r => RegSet r -> r -> RegSet r
deleteFromRegSet :: Ord r => RegSet r -> r -> RegSet r
mkRegSet :: Ord r => [r] -> RegSet r
minusRegSet, plusRegSet, timesRegSet :: Ord r => RegSet r -> RegSet r -> RegSet r
sizeRegSet :: RegSet r -> Int
regSetToList :: RegSet r -> [r]
emptyRegSet :: RegSet r
emptyRegSet = RegSet r
forall a. Set a
Set.empty
nullRegSet :: RegSet r -> Bool
nullRegSet = RegSet r -> Bool
forall a. Set a -> Bool
Set.null
elemRegSet :: r -> RegSet r -> Bool
elemRegSet = r -> RegSet r -> Bool
forall a. Ord a => a -> Set a -> Bool
Set.member
extendRegSet :: RegSet r -> r -> RegSet r
extendRegSet = (r -> RegSet r -> RegSet r) -> RegSet r -> r -> RegSet r
forall a b c. (a -> b -> c) -> b -> a -> c
flip r -> RegSet r -> RegSet r
forall a. Ord a => a -> Set a -> Set a
Set.insert
deleteFromRegSet :: RegSet r -> r -> RegSet r
deleteFromRegSet = (r -> RegSet r -> RegSet r) -> RegSet r -> r -> RegSet r
forall a b c. (a -> b -> c) -> b -> a -> c
flip r -> RegSet r -> RegSet r
forall a. Ord a => a -> Set a -> Set a
Set.delete
mkRegSet :: [r] -> RegSet r
mkRegSet = [r] -> RegSet r
forall a. Ord a => [a] -> Set a
Set.fromList
minusRegSet :: RegSet r -> RegSet r -> RegSet r
minusRegSet = RegSet r -> RegSet r -> RegSet r
forall a. Ord a => Set a -> Set a -> Set a
Set.difference
plusRegSet :: RegSet r -> RegSet r -> RegSet r
plusRegSet = RegSet r -> RegSet r -> RegSet r
forall a. Ord a => Set a -> Set a -> Set a
Set.union
timesRegSet :: RegSet r -> RegSet r -> RegSet r
timesRegSet = RegSet r -> RegSet r -> RegSet r
forall a. Ord a => Set a -> Set a -> Set a
Set.intersection
sizeRegSet :: RegSet r -> Int
sizeRegSet = RegSet r -> Int
forall a. Set a -> Int
Set.size
regSetToList :: RegSet r -> [r]
regSetToList = RegSet r -> [r]
forall a. Set a -> [a]
Set.toList
class Ord r => UserOfRegs r a where
foldRegsUsed :: DynFlags -> (b -> r -> b) -> b -> a -> b
foldLocalRegsUsed :: UserOfRegs LocalReg a
=> DynFlags -> (b -> LocalReg -> b) -> b -> a -> b
foldLocalRegsUsed :: DynFlags -> (b -> LocalReg -> b) -> b -> a -> b
foldLocalRegsUsed = DynFlags -> (b -> LocalReg -> b) -> b -> a -> b
forall r a b.
UserOfRegs r a =>
DynFlags -> (b -> r -> b) -> b -> a -> b
foldRegsUsed
class Ord r => DefinerOfRegs r a where
foldRegsDefd :: DynFlags -> (b -> r -> b) -> b -> a -> b
foldLocalRegsDefd :: DefinerOfRegs LocalReg a
=> DynFlags -> (b -> LocalReg -> b) -> b -> a -> b
foldLocalRegsDefd :: DynFlags -> (b -> LocalReg -> b) -> b -> a -> b
foldLocalRegsDefd = DynFlags -> (b -> LocalReg -> b) -> b -> a -> b
forall r a b.
DefinerOfRegs r a =>
DynFlags -> (b -> r -> b) -> b -> a -> b
foldRegsDefd
instance UserOfRegs LocalReg CmmReg where
foldRegsUsed :: DynFlags -> (b -> LocalReg -> b) -> b -> CmmReg -> b
foldRegsUsed _ f :: b -> LocalReg -> b
f z :: b
z (CmmLocal reg :: LocalReg
reg) = b -> LocalReg -> b
f b
z LocalReg
reg
foldRegsUsed _ _ z :: b
z (CmmGlobal _) = b
z
instance DefinerOfRegs LocalReg CmmReg where
foldRegsDefd :: DynFlags -> (b -> LocalReg -> b) -> b -> CmmReg -> b
foldRegsDefd _ f :: b -> LocalReg -> b
f z :: b
z (CmmLocal reg :: LocalReg
reg) = b -> LocalReg -> b
f b
z LocalReg
reg
foldRegsDefd _ _ z :: b
z (CmmGlobal _) = b
z
instance UserOfRegs GlobalReg CmmReg where
foldRegsUsed :: DynFlags -> (b -> GlobalReg -> b) -> b -> CmmReg -> b
foldRegsUsed _ _ z :: b
z (CmmLocal _) = b
z
foldRegsUsed _ f :: b -> GlobalReg -> b
f z :: b
z (CmmGlobal reg :: GlobalReg
reg) = b -> GlobalReg -> b
f b
z GlobalReg
reg
instance DefinerOfRegs GlobalReg CmmReg where
foldRegsDefd :: DynFlags -> (b -> GlobalReg -> b) -> b -> CmmReg -> b
foldRegsDefd _ _ z :: b
z (CmmLocal _) = b
z
foldRegsDefd _ f :: b -> GlobalReg -> b
f z :: b
z (CmmGlobal reg :: GlobalReg
reg) = b -> GlobalReg -> b
f b
z GlobalReg
reg
instance Ord r => UserOfRegs r r where
foldRegsUsed :: DynFlags -> (b -> r -> b) -> b -> r -> b
foldRegsUsed _ f :: b -> r -> b
f z :: b
z r :: r
r = b -> r -> b
f b
z r
r
instance Ord r => DefinerOfRegs r r where
foldRegsDefd :: DynFlags -> (b -> r -> b) -> b -> r -> b
foldRegsDefd _ f :: b -> r -> b
f z :: b
z r :: r
r = b -> r -> b
f b
z r
r
instance (Ord r, UserOfRegs r CmmReg) => UserOfRegs r CmmExpr where
foldRegsUsed :: DynFlags -> (b -> r -> b) -> b -> CmmExpr -> b
foldRegsUsed dflags :: DynFlags
dflags f :: b -> r -> b
f !b
z e :: CmmExpr
e = b -> CmmExpr -> b
expr b
z CmmExpr
e
where expr :: b -> CmmExpr -> b
expr z :: b
z (CmmLit _) = b
z
expr z :: b
z (CmmLoad addr :: CmmExpr
addr _) = DynFlags -> (b -> r -> b) -> b -> CmmExpr -> b
forall r a b.
UserOfRegs r a =>
DynFlags -> (b -> r -> b) -> b -> a -> b
foldRegsUsed DynFlags
dflags b -> r -> b
f b
z CmmExpr
addr
expr z :: b
z (CmmReg r :: CmmReg
r) = DynFlags -> (b -> r -> b) -> b -> CmmReg -> b
forall r a b.
UserOfRegs r a =>
DynFlags -> (b -> r -> b) -> b -> a -> b
foldRegsUsed DynFlags
dflags b -> r -> b
f b
z CmmReg
r
expr z :: b
z (CmmMachOp _ exprs :: [CmmExpr]
exprs) = DynFlags -> (b -> r -> b) -> b -> [CmmExpr] -> b
forall r a b.
UserOfRegs r a =>
DynFlags -> (b -> r -> b) -> b -> a -> b
foldRegsUsed DynFlags
dflags b -> r -> b
f b
z [CmmExpr]
exprs
expr z :: b
z (CmmRegOff r :: CmmReg
r _) = DynFlags -> (b -> r -> b) -> b -> CmmReg -> b
forall r a b.
UserOfRegs r a =>
DynFlags -> (b -> r -> b) -> b -> a -> b
foldRegsUsed DynFlags
dflags b -> r -> b
f b
z CmmReg
r
expr z :: b
z (CmmStackSlot _ _) = b
z
instance UserOfRegs r a => UserOfRegs r [a] where
foldRegsUsed :: DynFlags -> (b -> r -> b) -> b -> [a] -> b
foldRegsUsed dflags :: DynFlags
dflags f :: b -> r -> b
f set :: b
set as :: [a]
as = (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (DynFlags -> (b -> r -> b) -> b -> a -> b
forall r a b.
UserOfRegs r a =>
DynFlags -> (b -> r -> b) -> b -> a -> b
foldRegsUsed DynFlags
dflags b -> r -> b
f) b
set [a]
as
{-# INLINABLE foldRegsUsed #-}
instance DefinerOfRegs r a => DefinerOfRegs r [a] where
foldRegsDefd :: DynFlags -> (b -> r -> b) -> b -> [a] -> b
foldRegsDefd dflags :: DynFlags
dflags f :: b -> r -> b
f set :: b
set as :: [a]
as = (b -> a -> b) -> b -> [a] -> b
forall (t :: * -> *) b a.
Foldable t =>
(b -> a -> b) -> b -> t a -> b
foldl' (DynFlags -> (b -> r -> b) -> b -> a -> b
forall r a b.
DefinerOfRegs r a =>
DynFlags -> (b -> r -> b) -> b -> a -> b
foldRegsDefd DynFlags
dflags b -> r -> b
f) b
set [a]
as
{-# INLINABLE foldRegsDefd #-}
data VGcPtr = VGcPtr | VNonGcPtr deriving( VGcPtr -> VGcPtr -> Bool
(VGcPtr -> VGcPtr -> Bool)
-> (VGcPtr -> VGcPtr -> Bool) -> Eq VGcPtr
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: VGcPtr -> VGcPtr -> Bool
$c/= :: VGcPtr -> VGcPtr -> Bool
== :: VGcPtr -> VGcPtr -> Bool
$c== :: VGcPtr -> VGcPtr -> Bool
Eq, Int -> VGcPtr -> ShowS
[VGcPtr] -> ShowS
VGcPtr -> String
(Int -> VGcPtr -> ShowS)
-> (VGcPtr -> String) -> ([VGcPtr] -> ShowS) -> Show VGcPtr
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [VGcPtr] -> ShowS
$cshowList :: [VGcPtr] -> ShowS
show :: VGcPtr -> String
$cshow :: VGcPtr -> String
showsPrec :: Int -> VGcPtr -> ShowS
$cshowsPrec :: Int -> VGcPtr -> ShowS
Show )
data GlobalReg
= VanillaReg
{-# UNPACK #-} !Int
VGcPtr
| FloatReg
{-# UNPACK #-} !Int
| DoubleReg
{-# UNPACK #-} !Int
| LongReg
{-# UNPACK #-} !Int
| XmmReg
{-# UNPACK #-} !Int
| YmmReg
{-# UNPACK #-} !Int
| ZmmReg
{-# UNPACK #-} !Int
| Sp
| SpLim
| Hp
| HpLim
| CCCS
| CurrentTSO
| CurrentNursery
| HpAlloc
| EagerBlackholeInfo
| GCEnter1
| GCFun
| BaseReg
| MachSp
| UnwindReturnReg
| PicBaseReg
deriving( Int -> GlobalReg -> ShowS
[GlobalReg] -> ShowS
GlobalReg -> String
(Int -> GlobalReg -> ShowS)
-> (GlobalReg -> String)
-> ([GlobalReg] -> ShowS)
-> Show GlobalReg
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [GlobalReg] -> ShowS
$cshowList :: [GlobalReg] -> ShowS
show :: GlobalReg -> String
$cshow :: GlobalReg -> String
showsPrec :: Int -> GlobalReg -> ShowS
$cshowsPrec :: Int -> GlobalReg -> ShowS
Show )
instance Eq GlobalReg where
VanillaReg i :: Int
i _ == :: GlobalReg -> GlobalReg -> Bool
== VanillaReg j :: Int
j _ = Int
iInt -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==Int
j
FloatReg i :: Int
i == FloatReg j :: Int
j = Int
iInt -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==Int
j
DoubleReg i :: Int
i == DoubleReg j :: Int
j = Int
iInt -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==Int
j
LongReg i :: Int
i == LongReg j :: Int
j = Int
iInt -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==Int
j
XmmReg i :: Int
i == XmmReg j :: Int
j = Int
iInt -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==Int
j
YmmReg i :: Int
i == YmmReg j :: Int
j = Int
iInt -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==Int
j
ZmmReg i :: Int
i == ZmmReg j :: Int
j = Int
iInt -> Int -> Bool
forall a. Eq a => a -> a -> Bool
==Int
j
Sp == Sp = Bool
True
SpLim == SpLim = Bool
True
Hp == Hp = Bool
True
HpLim == HpLim = Bool
True
CCCS == CCCS = Bool
True
CurrentTSO == CurrentTSO = Bool
True
CurrentNursery == CurrentNursery = Bool
True
HpAlloc == HpAlloc = Bool
True
EagerBlackholeInfo == EagerBlackholeInfo = Bool
True
GCEnter1 == GCEnter1 = Bool
True
GCFun == GCFun = Bool
True
BaseReg == BaseReg = Bool
True
MachSp == MachSp = Bool
True
UnwindReturnReg == UnwindReturnReg = Bool
True
PicBaseReg == PicBaseReg = Bool
True
_r1 :: GlobalReg
_r1 == _r2 :: GlobalReg
_r2 = Bool
False
instance Ord GlobalReg where
compare :: GlobalReg -> GlobalReg -> Ordering
compare (VanillaReg i :: Int
i _) (VanillaReg j :: Int
j _) = Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Int
i Int
j
compare (FloatReg i :: Int
i) (FloatReg j :: Int
j) = Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Int
i Int
j
compare (DoubleReg i :: Int
i) (DoubleReg j :: Int
j) = Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Int
i Int
j
compare (LongReg i :: Int
i) (LongReg j :: Int
j) = Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Int
i Int
j
compare (XmmReg i :: Int
i) (XmmReg j :: Int
j) = Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Int
i Int
j
compare (YmmReg i :: Int
i) (YmmReg j :: Int
j) = Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Int
i Int
j
compare (ZmmReg i :: Int
i) (ZmmReg j :: Int
j) = Int -> Int -> Ordering
forall a. Ord a => a -> a -> Ordering
compare Int
i Int
j
compare Sp Sp = Ordering
EQ
compare SpLim SpLim = Ordering
EQ
compare Hp Hp = Ordering
EQ
compare HpLim HpLim = Ordering
EQ
compare CCCS CCCS = Ordering
EQ
compare CurrentTSO CurrentTSO = Ordering
EQ
compare CurrentNursery CurrentNursery = Ordering
EQ
compare HpAlloc HpAlloc = Ordering
EQ
compare EagerBlackholeInfo EagerBlackholeInfo = Ordering
EQ
compare GCEnter1 GCEnter1 = Ordering
EQ
compare GCFun GCFun = Ordering
EQ
compare BaseReg BaseReg = Ordering
EQ
compare MachSp MachSp = Ordering
EQ
compare UnwindReturnReg UnwindReturnReg = Ordering
EQ
compare PicBaseReg PicBaseReg = Ordering
EQ
compare (VanillaReg _ _) _ = Ordering
LT
compare _ (VanillaReg _ _) = Ordering
GT
compare (FloatReg _) _ = Ordering
LT
compare _ (FloatReg _) = Ordering
GT
compare (DoubleReg _) _ = Ordering
LT
compare _ (DoubleReg _) = Ordering
GT
compare (LongReg _) _ = Ordering
LT
compare _ (LongReg _) = Ordering
GT
compare (XmmReg _) _ = Ordering
LT
compare _ (XmmReg _) = Ordering
GT
compare (YmmReg _) _ = Ordering
LT
compare _ (YmmReg _) = Ordering
GT
compare (ZmmReg _) _ = Ordering
LT
compare _ (ZmmReg _) = Ordering
GT
compare Sp _ = Ordering
LT
compare _ Sp = Ordering
GT
compare SpLim _ = Ordering
LT
compare _ SpLim = Ordering
GT
compare Hp _ = Ordering
LT
compare _ Hp = Ordering
GT
compare HpLim _ = Ordering
LT
compare _ HpLim = Ordering
GT
compare CCCS _ = Ordering
LT
compare _ CCCS = Ordering
GT
compare CurrentTSO _ = Ordering
LT
compare _ CurrentTSO = Ordering
GT
compare CurrentNursery _ = Ordering
LT
compare _ CurrentNursery = Ordering
GT
compare HpAlloc _ = Ordering
LT
compare _ HpAlloc = Ordering
GT
compare GCEnter1 _ = Ordering
LT
compare _ GCEnter1 = Ordering
GT
compare GCFun _ = Ordering
LT
compare _ GCFun = Ordering
GT
compare BaseReg _ = Ordering
LT
compare _ BaseReg = Ordering
GT
compare MachSp _ = Ordering
LT
compare _ MachSp = Ordering
GT
compare UnwindReturnReg _ = Ordering
LT
compare _ UnwindReturnReg = Ordering
GT
compare EagerBlackholeInfo _ = Ordering
LT
compare _ EagerBlackholeInfo = Ordering
GT
baseReg, spReg, hpReg, spLimReg, hpLimReg, nodeReg,
currentTSOReg, currentNurseryReg, hpAllocReg, cccsReg :: CmmReg
baseReg :: CmmReg
baseReg = GlobalReg -> CmmReg
CmmGlobal GlobalReg
BaseReg
spReg :: CmmReg
spReg = GlobalReg -> CmmReg
CmmGlobal GlobalReg
Sp
hpReg :: CmmReg
hpReg = GlobalReg -> CmmReg
CmmGlobal GlobalReg
Hp
hpLimReg :: CmmReg
hpLimReg = GlobalReg -> CmmReg
CmmGlobal GlobalReg
HpLim
spLimReg :: CmmReg
spLimReg = GlobalReg -> CmmReg
CmmGlobal GlobalReg
SpLim
nodeReg :: CmmReg
nodeReg = GlobalReg -> CmmReg
CmmGlobal GlobalReg
node
currentTSOReg :: CmmReg
currentTSOReg = GlobalReg -> CmmReg
CmmGlobal GlobalReg
CurrentTSO
currentNurseryReg :: CmmReg
currentNurseryReg = GlobalReg -> CmmReg
CmmGlobal GlobalReg
CurrentNursery
hpAllocReg :: CmmReg
hpAllocReg = GlobalReg -> CmmReg
CmmGlobal GlobalReg
HpAlloc
cccsReg :: CmmReg
cccsReg = GlobalReg -> CmmReg
CmmGlobal GlobalReg
CCCS
node :: GlobalReg
node :: GlobalReg
node = Int -> VGcPtr -> GlobalReg
VanillaReg 1 VGcPtr
VGcPtr
globalRegType :: DynFlags -> GlobalReg -> CmmType
globalRegType :: DynFlags -> GlobalReg -> CmmType
globalRegType dflags :: DynFlags
dflags (VanillaReg _ VGcPtr) = DynFlags -> CmmType
gcWord DynFlags
dflags
globalRegType dflags :: DynFlags
dflags (VanillaReg _ VNonGcPtr) = DynFlags -> CmmType
bWord DynFlags
dflags
globalRegType _ (FloatReg _) = Width -> CmmType
cmmFloat Width
W32
globalRegType _ (DoubleReg _) = Width -> CmmType
cmmFloat Width
W64
globalRegType _ (LongReg _) = Width -> CmmType
cmmBits Width
W64
globalRegType _ (XmmReg _) = Int -> CmmType -> CmmType
cmmVec 4 (Width -> CmmType
cmmBits Width
W32)
globalRegType _ (YmmReg _) = Int -> CmmType -> CmmType
cmmVec 8 (Width -> CmmType
cmmBits Width
W32)
globalRegType _ (ZmmReg _) = Int -> CmmType -> CmmType
cmmVec 16 (Width -> CmmType
cmmBits Width
W32)
globalRegType dflags :: DynFlags
dflags Hp = DynFlags -> CmmType
gcWord DynFlags
dflags
globalRegType dflags :: DynFlags
dflags _ = DynFlags -> CmmType
bWord DynFlags
dflags
isArgReg :: GlobalReg -> Bool
isArgReg :: GlobalReg -> Bool
isArgReg (VanillaReg {}) = Bool
True
isArgReg (FloatReg {}) = Bool
True
isArgReg (DoubleReg {}) = Bool
True
isArgReg (LongReg {}) = Bool
True
isArgReg (XmmReg {}) = Bool
True
isArgReg (YmmReg {}) = Bool
True
isArgReg (ZmmReg {}) = Bool
True
isArgReg _ = Bool
False