{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}
module GHC.Cmm.MachOp
( MachOp(..)
, pprMachOp, isCommutableMachOp, isAssociativeMachOp
, isComparisonMachOp, maybeIntComparison, machOpResultType
, machOpArgReps, maybeInvertComparison, isFloatComparison
, mo_wordAdd, mo_wordSub, mo_wordEq, mo_wordNe,mo_wordMul, mo_wordSQuot
, mo_wordSRem, mo_wordSNeg, mo_wordUQuot, mo_wordURem
, mo_wordSGe, mo_wordSLe, mo_wordSGt, mo_wordSLt, mo_wordUGe
, mo_wordULe, mo_wordUGt, mo_wordULt
, mo_wordAnd, mo_wordOr, mo_wordXor, mo_wordNot
, mo_wordShl, mo_wordSShr, mo_wordUShr
, mo_u_8To32, mo_s_8To32, mo_u_16To32, mo_s_16To32
, mo_u_8ToWord, mo_s_8ToWord, mo_u_16ToWord, mo_s_16ToWord
, mo_u_32ToWord, mo_s_32ToWord
, mo_32To8, mo_32To16, mo_WordTo8, mo_WordTo16, mo_WordTo32, mo_WordTo64
, CallishMachOp(..), callishMachOpHints
, pprCallishMachOp
, machOpMemcpyishAlign
, AtomicMachOp(..)
)
where
import GHC.Prelude
import GHC.Platform
import GHC.Cmm.Type
import GHC.Utils.Outputable
data MachOp
= MO_Add Width
| MO_Sub Width
| MO_Eq Width
| MO_Ne Width
| MO_Mul Width
| MO_S_MulMayOflo Width
| MO_S_Quot Width
| MO_S_Rem Width
| MO_S_Neg Width
| MO_U_MulMayOflo Width
| MO_U_Quot Width
| MO_U_Rem Width
| MO_S_Ge Width
| MO_S_Le Width
| MO_S_Gt Width
| MO_S_Lt Width
| MO_U_Ge Width
| MO_U_Le Width
| MO_U_Gt Width
| MO_U_Lt Width
| MO_F_Add Width
| MO_F_Sub Width
| MO_F_Neg Width
| MO_F_Mul Width
| MO_F_Quot Width
| MO_F_Eq Width
| MO_F_Ne Width
| MO_F_Ge Width
| MO_F_Le Width
| MO_F_Gt Width
| MO_F_Lt Width
| MO_And Width
| MO_Or Width
| MO_Xor Width
| MO_Not Width
| MO_Shl Width
| MO_U_Shr Width
| MO_S_Shr Width
| MO_SF_Conv Width Width
| MO_FS_Conv Width Width
| MO_SS_Conv Width Width
| MO_UU_Conv Width Width
| MO_XX_Conv Width Width
| MO_FF_Conv Width Width
| MO_V_Insert Length Width
| Length Width
| MO_V_Add Length Width
| MO_V_Sub Length Width
| MO_V_Mul Length Width
| MO_VS_Quot Length Width
| MO_VS_Rem Length Width
| MO_VS_Neg Length Width
| MO_VU_Quot Length Width
| MO_VU_Rem Length Width
| MO_VF_Insert Length Width
| Length Width
| MO_VF_Add Length Width
| MO_VF_Sub Length Width
| MO_VF_Neg Length Width
| MO_VF_Mul Length Width
| MO_VF_Quot Length Width
| MO_AlignmentCheck Int Width
deriving (MachOp -> MachOp -> Bool
(MachOp -> MachOp -> Bool)
-> (MachOp -> MachOp -> Bool) -> Eq MachOp
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: MachOp -> MachOp -> Bool
$c/= :: MachOp -> MachOp -> Bool
== :: MachOp -> MachOp -> Bool
$c== :: MachOp -> MachOp -> Bool
External instance of the constraint type Eq Length
External instance of the constraint type Eq Length
External instance of the constraint type Eq Width
External instance of the constraint type Eq Width
Eq, Length -> MachOp -> ShowS
[MachOp] -> ShowS
MachOp -> String
(Length -> MachOp -> ShowS)
-> (MachOp -> String) -> ([MachOp] -> ShowS) -> Show MachOp
forall a.
(Length -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [MachOp] -> ShowS
$cshowList :: [MachOp] -> ShowS
show :: MachOp -> String
$cshow :: MachOp -> String
showsPrec :: Length -> MachOp -> ShowS
$cshowsPrec :: Length -> MachOp -> ShowS
External instance of the constraint type Show Length
External instance of the constraint type Show Length
External instance of the constraint type Show Width
External instance of the constraint type Show Width
External instance of the constraint type Ord Length
External instance of the constraint type Ord Length
Show)
pprMachOp :: MachOp -> SDoc
pprMachOp :: MachOp -> SDoc
pprMachOp MachOp
mo = String -> SDoc
text (MachOp -> String
forall a. Show a => a -> String
Instance of class: Show of the constraint type Show MachOp
show MachOp
mo)
mo_wordAdd, mo_wordSub, mo_wordEq, mo_wordNe,mo_wordMul, mo_wordSQuot
, mo_wordSRem, mo_wordSNeg, mo_wordUQuot, mo_wordURem
, mo_wordSGe, mo_wordSLe, mo_wordSGt, mo_wordSLt, mo_wordUGe
, mo_wordULe, mo_wordUGt, mo_wordULt
, mo_wordAnd, mo_wordOr, mo_wordXor, mo_wordNot, mo_wordShl, mo_wordSShr, mo_wordUShr
, mo_u_8ToWord, mo_s_8ToWord, mo_u_16ToWord, mo_s_16ToWord, mo_u_32ToWord, mo_s_32ToWord
, mo_WordTo8, mo_WordTo16, mo_WordTo32, mo_WordTo64
:: Platform -> MachOp
mo_u_8To32, mo_s_8To32, mo_u_16To32, mo_s_16To32
, mo_32To8, mo_32To16
:: MachOp
mo_wordAdd :: Platform -> MachOp
mo_wordAdd Platform
platform = Width -> MachOp
MO_Add (Platform -> Width
wordWidth Platform
platform)
mo_wordSub :: Platform -> MachOp
mo_wordSub Platform
platform = Width -> MachOp
MO_Sub (Platform -> Width
wordWidth Platform
platform)
mo_wordEq :: Platform -> MachOp
mo_wordEq Platform
platform = Width -> MachOp
MO_Eq (Platform -> Width
wordWidth Platform
platform)
mo_wordNe :: Platform -> MachOp
mo_wordNe Platform
platform = Width -> MachOp
MO_Ne (Platform -> Width
wordWidth Platform
platform)
mo_wordMul :: Platform -> MachOp
mo_wordMul Platform
platform = Width -> MachOp
MO_Mul (Platform -> Width
wordWidth Platform
platform)
mo_wordSQuot :: Platform -> MachOp
mo_wordSQuot Platform
platform = Width -> MachOp
MO_S_Quot (Platform -> Width
wordWidth Platform
platform)
mo_wordSRem :: Platform -> MachOp
mo_wordSRem Platform
platform = Width -> MachOp
MO_S_Rem (Platform -> Width
wordWidth Platform
platform)
mo_wordSNeg :: Platform -> MachOp
mo_wordSNeg Platform
platform = Width -> MachOp
MO_S_Neg (Platform -> Width
wordWidth Platform
platform)
mo_wordUQuot :: Platform -> MachOp
mo_wordUQuot Platform
platform = Width -> MachOp
MO_U_Quot (Platform -> Width
wordWidth Platform
platform)
mo_wordURem :: Platform -> MachOp
mo_wordURem Platform
platform = Width -> MachOp
MO_U_Rem (Platform -> Width
wordWidth Platform
platform)
mo_wordSGe :: Platform -> MachOp
mo_wordSGe Platform
platform = Width -> MachOp
MO_S_Ge (Platform -> Width
wordWidth Platform
platform)
mo_wordSLe :: Platform -> MachOp
mo_wordSLe Platform
platform = Width -> MachOp
MO_S_Le (Platform -> Width
wordWidth Platform
platform)
mo_wordSGt :: Platform -> MachOp
mo_wordSGt Platform
platform = Width -> MachOp
MO_S_Gt (Platform -> Width
wordWidth Platform
platform)
mo_wordSLt :: Platform -> MachOp
mo_wordSLt Platform
platform = Width -> MachOp
MO_S_Lt (Platform -> Width
wordWidth Platform
platform)
mo_wordUGe :: Platform -> MachOp
mo_wordUGe Platform
platform = Width -> MachOp
MO_U_Ge (Platform -> Width
wordWidth Platform
platform)
mo_wordULe :: Platform -> MachOp
mo_wordULe Platform
platform = Width -> MachOp
MO_U_Le (Platform -> Width
wordWidth Platform
platform)
mo_wordUGt :: Platform -> MachOp
mo_wordUGt Platform
platform = Width -> MachOp
MO_U_Gt (Platform -> Width
wordWidth Platform
platform)
mo_wordULt :: Platform -> MachOp
mo_wordULt Platform
platform = Width -> MachOp
MO_U_Lt (Platform -> Width
wordWidth Platform
platform)
mo_wordAnd :: Platform -> MachOp
mo_wordAnd Platform
platform = Width -> MachOp
MO_And (Platform -> Width
wordWidth Platform
platform)
mo_wordOr :: Platform -> MachOp
mo_wordOr Platform
platform = Width -> MachOp
MO_Or (Platform -> Width
wordWidth Platform
platform)
mo_wordXor :: Platform -> MachOp
mo_wordXor Platform
platform = Width -> MachOp
MO_Xor (Platform -> Width
wordWidth Platform
platform)
mo_wordNot :: Platform -> MachOp
mo_wordNot Platform
platform = Width -> MachOp
MO_Not (Platform -> Width
wordWidth Platform
platform)
mo_wordShl :: Platform -> MachOp
mo_wordShl Platform
platform = Width -> MachOp
MO_Shl (Platform -> Width
wordWidth Platform
platform)
mo_wordSShr :: Platform -> MachOp
mo_wordSShr Platform
platform = Width -> MachOp
MO_S_Shr (Platform -> Width
wordWidth Platform
platform)
mo_wordUShr :: Platform -> MachOp
mo_wordUShr Platform
platform = Width -> MachOp
MO_U_Shr (Platform -> Width
wordWidth Platform
platform)
mo_u_8To32 :: MachOp
mo_u_8To32 = Width -> Width -> MachOp
MO_UU_Conv Width
W8 Width
W32
mo_s_8To32 :: MachOp
mo_s_8To32 = Width -> Width -> MachOp
MO_SS_Conv Width
W8 Width
W32
mo_u_16To32 :: MachOp
mo_u_16To32 = Width -> Width -> MachOp
MO_UU_Conv Width
W16 Width
W32
mo_s_16To32 :: MachOp
mo_s_16To32 = Width -> Width -> MachOp
MO_SS_Conv Width
W16 Width
W32
mo_u_8ToWord :: Platform -> MachOp
mo_u_8ToWord Platform
platform = Width -> Width -> MachOp
MO_UU_Conv Width
W8 (Platform -> Width
wordWidth Platform
platform)
mo_s_8ToWord :: Platform -> MachOp
mo_s_8ToWord Platform
platform = Width -> Width -> MachOp
MO_SS_Conv Width
W8 (Platform -> Width
wordWidth Platform
platform)
mo_u_16ToWord :: Platform -> MachOp
mo_u_16ToWord Platform
platform = Width -> Width -> MachOp
MO_UU_Conv Width
W16 (Platform -> Width
wordWidth Platform
platform)
mo_s_16ToWord :: Platform -> MachOp
mo_s_16ToWord Platform
platform = Width -> Width -> MachOp
MO_SS_Conv Width
W16 (Platform -> Width
wordWidth Platform
platform)
mo_s_32ToWord :: Platform -> MachOp
mo_s_32ToWord Platform
platform = Width -> Width -> MachOp
MO_SS_Conv Width
W32 (Platform -> Width
wordWidth Platform
platform)
mo_u_32ToWord :: Platform -> MachOp
mo_u_32ToWord Platform
platform = Width -> Width -> MachOp
MO_UU_Conv Width
W32 (Platform -> Width
wordWidth Platform
platform)
mo_WordTo8 :: Platform -> MachOp
mo_WordTo8 Platform
platform = Width -> Width -> MachOp
MO_UU_Conv (Platform -> Width
wordWidth Platform
platform) Width
W8
mo_WordTo16 :: Platform -> MachOp
mo_WordTo16 Platform
platform = Width -> Width -> MachOp
MO_UU_Conv (Platform -> Width
wordWidth Platform
platform) Width
W16
mo_WordTo32 :: Platform -> MachOp
mo_WordTo32 Platform
platform = Width -> Width -> MachOp
MO_UU_Conv (Platform -> Width
wordWidth Platform
platform) Width
W32
mo_WordTo64 :: Platform -> MachOp
mo_WordTo64 Platform
platform = Width -> Width -> MachOp
MO_UU_Conv (Platform -> Width
wordWidth Platform
platform) Width
W64
mo_32To8 :: MachOp
mo_32To8 = Width -> Width -> MachOp
MO_UU_Conv Width
W32 Width
W8
mo_32To16 :: MachOp
mo_32To16 = Width -> Width -> MachOp
MO_UU_Conv Width
W32 Width
W16
isCommutableMachOp :: MachOp -> Bool
isCommutableMachOp :: MachOp -> Bool
isCommutableMachOp MachOp
mop =
case MachOp
mop of
MO_Add Width
_ -> Bool
True
MO_Eq Width
_ -> Bool
True
MO_Ne Width
_ -> Bool
True
MO_Mul Width
_ -> Bool
True
MO_S_MulMayOflo Width
_ -> Bool
True
MO_U_MulMayOflo Width
_ -> Bool
True
MO_And Width
_ -> Bool
True
MO_Or Width
_ -> Bool
True
MO_Xor Width
_ -> Bool
True
MO_F_Add Width
_ -> Bool
True
MO_F_Mul Width
_ -> Bool
True
MachOp
_other -> Bool
False
isAssociativeMachOp :: MachOp -> Bool
isAssociativeMachOp :: MachOp -> Bool
isAssociativeMachOp MachOp
mop =
case MachOp
mop of
MO_Add {} -> Bool
True
MO_Mul {} -> Bool
True
MO_And {} -> Bool
True
MO_Or {} -> Bool
True
MO_Xor {} -> Bool
True
MachOp
_other -> Bool
False
isComparisonMachOp :: MachOp -> Bool
isComparisonMachOp :: MachOp -> Bool
isComparisonMachOp MachOp
mop =
case MachOp
mop of
MO_Eq Width
_ -> Bool
True
MO_Ne Width
_ -> Bool
True
MO_S_Ge Width
_ -> Bool
True
MO_S_Le Width
_ -> Bool
True
MO_S_Gt Width
_ -> Bool
True
MO_S_Lt Width
_ -> Bool
True
MO_U_Ge Width
_ -> Bool
True
MO_U_Le Width
_ -> Bool
True
MO_U_Gt Width
_ -> Bool
True
MO_U_Lt Width
_ -> Bool
True
MO_F_Eq {} -> Bool
True
MO_F_Ne {} -> Bool
True
MO_F_Ge {} -> Bool
True
MO_F_Le {} -> Bool
True
MO_F_Gt {} -> Bool
True
MO_F_Lt {} -> Bool
True
MachOp
_other -> Bool
False
maybeIntComparison :: MachOp -> Maybe Width
maybeIntComparison :: MachOp -> Maybe Width
maybeIntComparison MachOp
mop =
case MachOp
mop of
MO_Eq Width
w -> Width -> Maybe Width
forall a. a -> Maybe a
Just Width
w
MO_Ne Width
w -> Width -> Maybe Width
forall a. a -> Maybe a
Just Width
w
MO_S_Ge Width
w -> Width -> Maybe Width
forall a. a -> Maybe a
Just Width
w
MO_S_Le Width
w -> Width -> Maybe Width
forall a. a -> Maybe a
Just Width
w
MO_S_Gt Width
w -> Width -> Maybe Width
forall a. a -> Maybe a
Just Width
w
MO_S_Lt Width
w -> Width -> Maybe Width
forall a. a -> Maybe a
Just Width
w
MO_U_Ge Width
w -> Width -> Maybe Width
forall a. a -> Maybe a
Just Width
w
MO_U_Le Width
w -> Width -> Maybe Width
forall a. a -> Maybe a
Just Width
w
MO_U_Gt Width
w -> Width -> Maybe Width
forall a. a -> Maybe a
Just Width
w
MO_U_Lt Width
w -> Width -> Maybe Width
forall a. a -> Maybe a
Just Width
w
MachOp
_ -> Maybe Width
forall a. Maybe a
Nothing
isFloatComparison :: MachOp -> Bool
isFloatComparison :: MachOp -> Bool
isFloatComparison MachOp
mop =
case MachOp
mop of
MO_F_Eq {} -> Bool
True
MO_F_Ne {} -> Bool
True
MO_F_Ge {} -> Bool
True
MO_F_Le {} -> Bool
True
MO_F_Gt {} -> Bool
True
MO_F_Lt {} -> Bool
True
MachOp
_other -> Bool
False
maybeInvertComparison :: MachOp -> Maybe MachOp
maybeInvertComparison :: MachOp -> Maybe MachOp
maybeInvertComparison MachOp
op
= case MachOp
op of
MO_Eq Width
r -> MachOp -> Maybe MachOp
forall a. a -> Maybe a
Just (Width -> MachOp
MO_Ne Width
r)
MO_Ne Width
r -> MachOp -> Maybe MachOp
forall a. a -> Maybe a
Just (Width -> MachOp
MO_Eq Width
r)
MO_U_Lt Width
r -> MachOp -> Maybe MachOp
forall a. a -> Maybe a
Just (Width -> MachOp
MO_U_Ge Width
r)
MO_U_Gt Width
r -> MachOp -> Maybe MachOp
forall a. a -> Maybe a
Just (Width -> MachOp
MO_U_Le Width
r)
MO_U_Le Width
r -> MachOp -> Maybe MachOp
forall a. a -> Maybe a
Just (Width -> MachOp
MO_U_Gt Width
r)
MO_U_Ge Width
r -> MachOp -> Maybe MachOp
forall a. a -> Maybe a
Just (Width -> MachOp
MO_U_Lt Width
r)
MO_S_Lt Width
r -> MachOp -> Maybe MachOp
forall a. a -> Maybe a
Just (Width -> MachOp
MO_S_Ge Width
r)
MO_S_Gt Width
r -> MachOp -> Maybe MachOp
forall a. a -> Maybe a
Just (Width -> MachOp
MO_S_Le Width
r)
MO_S_Le Width
r -> MachOp -> Maybe MachOp
forall a. a -> Maybe a
Just (Width -> MachOp
MO_S_Gt Width
r)
MO_S_Ge Width
r -> MachOp -> Maybe MachOp
forall a. a -> Maybe a
Just (Width -> MachOp
MO_S_Lt Width
r)
MachOp
_other -> Maybe MachOp
forall a. Maybe a
Nothing
machOpResultType :: Platform -> MachOp -> [CmmType] -> CmmType
machOpResultType :: Platform -> MachOp -> [CmmType] -> CmmType
machOpResultType Platform
platform MachOp
mop [CmmType]
tys =
case MachOp
mop of
MO_Add {} -> CmmType
ty1
MO_Sub {} -> CmmType
ty1
MO_Mul Width
r -> Width -> CmmType
cmmBits Width
r
MO_S_MulMayOflo Width
r -> Width -> CmmType
cmmBits Width
r
MO_S_Quot Width
r -> Width -> CmmType
cmmBits Width
r
MO_S_Rem Width
r -> Width -> CmmType
cmmBits Width
r
MO_S_Neg Width
r -> Width -> CmmType
cmmBits Width
r
MO_U_MulMayOflo Width
r -> Width -> CmmType
cmmBits Width
r
MO_U_Quot Width
r -> Width -> CmmType
cmmBits Width
r
MO_U_Rem Width
r -> Width -> CmmType
cmmBits Width
r
MO_Eq {} -> Platform -> CmmType
comparisonResultRep Platform
platform
MO_Ne {} -> Platform -> CmmType
comparisonResultRep Platform
platform
MO_S_Ge {} -> Platform -> CmmType
comparisonResultRep Platform
platform
MO_S_Le {} -> Platform -> CmmType
comparisonResultRep Platform
platform
MO_S_Gt {} -> Platform -> CmmType
comparisonResultRep Platform
platform
MO_S_Lt {} -> Platform -> CmmType
comparisonResultRep Platform
platform
MO_U_Ge {} -> Platform -> CmmType
comparisonResultRep Platform
platform
MO_U_Le {} -> Platform -> CmmType
comparisonResultRep Platform
platform
MO_U_Gt {} -> Platform -> CmmType
comparisonResultRep Platform
platform
MO_U_Lt {} -> Platform -> CmmType
comparisonResultRep Platform
platform
MO_F_Add Width
r -> Width -> CmmType
cmmFloat Width
r
MO_F_Sub Width
r -> Width -> CmmType
cmmFloat Width
r
MO_F_Mul Width
r -> Width -> CmmType
cmmFloat Width
r
MO_F_Quot Width
r -> Width -> CmmType
cmmFloat Width
r
MO_F_Neg Width
r -> Width -> CmmType
cmmFloat Width
r
MO_F_Eq {} -> Platform -> CmmType
comparisonResultRep Platform
platform
MO_F_Ne {} -> Platform -> CmmType
comparisonResultRep Platform
platform
MO_F_Ge {} -> Platform -> CmmType
comparisonResultRep Platform
platform
MO_F_Le {} -> Platform -> CmmType
comparisonResultRep Platform
platform
MO_F_Gt {} -> Platform -> CmmType
comparisonResultRep Platform
platform
MO_F_Lt {} -> Platform -> CmmType
comparisonResultRep Platform
platform
MO_And {} -> CmmType
ty1
MO_Or {} -> CmmType
ty1
MO_Xor {} -> CmmType
ty1
MO_Not Width
r -> Width -> CmmType
cmmBits Width
r
MO_Shl Width
r -> Width -> CmmType
cmmBits Width
r
MO_U_Shr Width
r -> Width -> CmmType
cmmBits Width
r
MO_S_Shr Width
r -> Width -> CmmType
cmmBits Width
r
MO_SS_Conv Width
_ Width
to -> Width -> CmmType
cmmBits Width
to
MO_UU_Conv Width
_ Width
to -> Width -> CmmType
cmmBits Width
to
MO_XX_Conv Width
_ Width
to -> Width -> CmmType
cmmBits Width
to
MO_FS_Conv Width
_ Width
to -> Width -> CmmType
cmmBits Width
to
MO_SF_Conv Width
_ Width
to -> Width -> CmmType
cmmFloat Width
to
MO_FF_Conv Width
_ Width
to -> Width -> CmmType
cmmFloat Width
to
MO_V_Insert Length
l Width
w -> Length -> CmmType -> CmmType
cmmVec Length
l (Width -> CmmType
cmmBits Width
w)
MO_V_Extract Length
_ Width
w -> Width -> CmmType
cmmBits Width
w
MO_V_Add Length
l Width
w -> Length -> CmmType -> CmmType
cmmVec Length
l (Width -> CmmType
cmmBits Width
w)
MO_V_Sub Length
l Width
w -> Length -> CmmType -> CmmType
cmmVec Length
l (Width -> CmmType
cmmBits Width
w)
MO_V_Mul Length
l Width
w -> Length -> CmmType -> CmmType
cmmVec Length
l (Width -> CmmType
cmmBits Width
w)
MO_VS_Quot Length
l Width
w -> Length -> CmmType -> CmmType
cmmVec Length
l (Width -> CmmType
cmmBits Width
w)
MO_VS_Rem Length
l Width
w -> Length -> CmmType -> CmmType
cmmVec Length
l (Width -> CmmType
cmmBits Width
w)
MO_VS_Neg Length
l Width
w -> Length -> CmmType -> CmmType
cmmVec Length
l (Width -> CmmType
cmmBits Width
w)
MO_VU_Quot Length
l Width
w -> Length -> CmmType -> CmmType
cmmVec Length
l (Width -> CmmType
cmmBits Width
w)
MO_VU_Rem Length
l Width
w -> Length -> CmmType -> CmmType
cmmVec Length
l (Width -> CmmType
cmmBits Width
w)
MO_VF_Insert Length
l Width
w -> Length -> CmmType -> CmmType
cmmVec Length
l (Width -> CmmType
cmmFloat Width
w)
MO_VF_Extract Length
_ Width
w -> Width -> CmmType
cmmFloat Width
w
MO_VF_Add Length
l Width
w -> Length -> CmmType -> CmmType
cmmVec Length
l (Width -> CmmType
cmmFloat Width
w)
MO_VF_Sub Length
l Width
w -> Length -> CmmType -> CmmType
cmmVec Length
l (Width -> CmmType
cmmFloat Width
w)
MO_VF_Mul Length
l Width
w -> Length -> CmmType -> CmmType
cmmVec Length
l (Width -> CmmType
cmmFloat Width
w)
MO_VF_Quot Length
l Width
w -> Length -> CmmType -> CmmType
cmmVec Length
l (Width -> CmmType
cmmFloat Width
w)
MO_VF_Neg Length
l Width
w -> Length -> CmmType -> CmmType
cmmVec Length
l (Width -> CmmType
cmmFloat Width
w)
MO_AlignmentCheck Length
_ Width
_ -> CmmType
ty1
where
(CmmType
ty1:[CmmType]
_) = [CmmType]
tys
comparisonResultRep :: Platform -> CmmType
comparisonResultRep :: Platform -> CmmType
comparisonResultRep = Platform -> CmmType
bWord
machOpArgReps :: Platform -> MachOp -> [Width]
machOpArgReps :: Platform -> MachOp -> [Width]
machOpArgReps Platform
platform MachOp
op =
case MachOp
op of
MO_Add Width
r -> [Width
r,Width
r]
MO_Sub Width
r -> [Width
r,Width
r]
MO_Eq Width
r -> [Width
r,Width
r]
MO_Ne Width
r -> [Width
r,Width
r]
MO_Mul Width
r -> [Width
r,Width
r]
MO_S_MulMayOflo Width
r -> [Width
r,Width
r]
MO_S_Quot Width
r -> [Width
r,Width
r]
MO_S_Rem Width
r -> [Width
r,Width
r]
MO_S_Neg Width
r -> [Width
r]
MO_U_MulMayOflo Width
r -> [Width
r,Width
r]
MO_U_Quot Width
r -> [Width
r,Width
r]
MO_U_Rem Width
r -> [Width
r,Width
r]
MO_S_Ge Width
r -> [Width
r,Width
r]
MO_S_Le Width
r -> [Width
r,Width
r]
MO_S_Gt Width
r -> [Width
r,Width
r]
MO_S_Lt Width
r -> [Width
r,Width
r]
MO_U_Ge Width
r -> [Width
r,Width
r]
MO_U_Le Width
r -> [Width
r,Width
r]
MO_U_Gt Width
r -> [Width
r,Width
r]
MO_U_Lt Width
r -> [Width
r,Width
r]
MO_F_Add Width
r -> [Width
r,Width
r]
MO_F_Sub Width
r -> [Width
r,Width
r]
MO_F_Mul Width
r -> [Width
r,Width
r]
MO_F_Quot Width
r -> [Width
r,Width
r]
MO_F_Neg Width
r -> [Width
r]
MO_F_Eq Width
r -> [Width
r,Width
r]
MO_F_Ne Width
r -> [Width
r,Width
r]
MO_F_Ge Width
r -> [Width
r,Width
r]
MO_F_Le Width
r -> [Width
r,Width
r]
MO_F_Gt Width
r -> [Width
r,Width
r]
MO_F_Lt Width
r -> [Width
r,Width
r]
MO_And Width
r -> [Width
r,Width
r]
MO_Or Width
r -> [Width
r,Width
r]
MO_Xor Width
r -> [Width
r,Width
r]
MO_Not Width
r -> [Width
r]
MO_Shl Width
r -> [Width
r, Platform -> Width
wordWidth Platform
platform]
MO_U_Shr Width
r -> [Width
r, Platform -> Width
wordWidth Platform
platform]
MO_S_Shr Width
r -> [Width
r, Platform -> Width
wordWidth Platform
platform]
MO_SS_Conv Width
from Width
_ -> [Width
from]
MO_UU_Conv Width
from Width
_ -> [Width
from]
MO_XX_Conv Width
from Width
_ -> [Width
from]
MO_SF_Conv Width
from Width
_ -> [Width
from]
MO_FS_Conv Width
from Width
_ -> [Width
from]
MO_FF_Conv Width
from Width
_ -> [Width
from]
MO_V_Insert Length
l Width
r -> [CmmType -> Width
typeWidth (Length -> CmmType -> CmmType
vec Length
l (Width -> CmmType
cmmBits Width
r)),Width
r,Platform -> Width
wordWidth Platform
platform]
MO_V_Extract Length
l Width
r -> [CmmType -> Width
typeWidth (Length -> CmmType -> CmmType
vec Length
l (Width -> CmmType
cmmBits Width
r)),Platform -> Width
wordWidth Platform
platform]
MO_V_Add Length
_ Width
r -> [Width
r,Width
r]
MO_V_Sub Length
_ Width
r -> [Width
r,Width
r]
MO_V_Mul Length
_ Width
r -> [Width
r,Width
r]
MO_VS_Quot Length
_ Width
r -> [Width
r,Width
r]
MO_VS_Rem Length
_ Width
r -> [Width
r,Width
r]
MO_VS_Neg Length
_ Width
r -> [Width
r]
MO_VU_Quot Length
_ Width
r -> [Width
r,Width
r]
MO_VU_Rem Length
_ Width
r -> [Width
r,Width
r]
MO_VF_Insert Length
l Width
r -> [CmmType -> Width
typeWidth (Length -> CmmType -> CmmType
vec Length
l (Width -> CmmType
cmmFloat Width
r)),Width
r,Platform -> Width
wordWidth Platform
platform]
MO_VF_Extract Length
l Width
r -> [CmmType -> Width
typeWidth (Length -> CmmType -> CmmType
vec Length
l (Width -> CmmType
cmmFloat Width
r)),Platform -> Width
wordWidth Platform
platform]
MO_VF_Add Length
_ Width
r -> [Width
r,Width
r]
MO_VF_Sub Length
_ Width
r -> [Width
r,Width
r]
MO_VF_Mul Length
_ Width
r -> [Width
r,Width
r]
MO_VF_Quot Length
_ Width
r -> [Width
r,Width
r]
MO_VF_Neg Length
_ Width
r -> [Width
r]
MO_AlignmentCheck Length
_ Width
r -> [Width
r]
data CallishMachOp
= MO_F64_Pwr
| MO_F64_Sin
| MO_F64_Cos
| MO_F64_Tan
| MO_F64_Sinh
| MO_F64_Cosh
| MO_F64_Tanh
| MO_F64_Asin
| MO_F64_Acos
| MO_F64_Atan
| MO_F64_Asinh
| MO_F64_Acosh
| MO_F64_Atanh
| MO_F64_Log
| MO_F64_Log1P
| MO_F64_Exp
| MO_F64_ExpM1
| MO_F64_Fabs
| MO_F64_Sqrt
| MO_F32_Pwr
| MO_F32_Sin
| MO_F32_Cos
| MO_F32_Tan
| MO_F32_Sinh
| MO_F32_Cosh
| MO_F32_Tanh
| MO_F32_Asin
| MO_F32_Acos
| MO_F32_Atan
| MO_F32_Asinh
| MO_F32_Acosh
| MO_F32_Atanh
| MO_F32_Log
| MO_F32_Log1P
| MO_F32_Exp
| MO_F32_ExpM1
| MO_F32_Fabs
| MO_F32_Sqrt
| MO_UF_Conv Width
| MO_S_Mul2 Width
| MO_S_QuotRem Width
| MO_U_QuotRem Width
| MO_U_QuotRem2 Width
| MO_Add2 Width
| MO_AddWordC Width
| MO_SubWordC Width
| MO_AddIntC Width
| MO_SubIntC Width
| MO_U_Mul2 Width
| MO_ReadBarrier
| MO_WriteBarrier
| MO_Touch
| MO_Prefetch_Data Int
| MO_Memcpy Int
| MO_Memset Int
| MO_Memmove Int
| MO_Memcmp Int
| MO_PopCnt Width
| MO_Pdep Width
| MO_Pext Width
| MO_Clz Width
| MO_Ctz Width
| MO_BSwap Width
| MO_BRev Width
| MO_AtomicRMW Width AtomicMachOp
| MO_AtomicRead Width
| MO_AtomicWrite Width
| MO_Cmpxchg Width
deriving (CallishMachOp -> CallishMachOp -> Bool
(CallishMachOp -> CallishMachOp -> Bool)
-> (CallishMachOp -> CallishMachOp -> Bool) -> Eq CallishMachOp
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: CallishMachOp -> CallishMachOp -> Bool
$c/= :: CallishMachOp -> CallishMachOp -> Bool
== :: CallishMachOp -> CallishMachOp -> Bool
$c== :: CallishMachOp -> CallishMachOp -> Bool
External instance of the constraint type Eq Length
External instance of the constraint type Eq Width
External instance of the constraint type Eq Length
External instance of the constraint type Eq Width
Instance of class: Eq of the constraint type Eq AtomicMachOp
Eq, Length -> CallishMachOp -> ShowS
[CallishMachOp] -> ShowS
CallishMachOp -> String
(Length -> CallishMachOp -> ShowS)
-> (CallishMachOp -> String)
-> ([CallishMachOp] -> ShowS)
-> Show CallishMachOp
forall a.
(Length -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [CallishMachOp] -> ShowS
$cshowList :: [CallishMachOp] -> ShowS
show :: CallishMachOp -> String
$cshow :: CallishMachOp -> String
showsPrec :: Length -> CallishMachOp -> ShowS
$cshowsPrec :: Length -> CallishMachOp -> ShowS
External instance of the constraint type Show Length
External instance of the constraint type Show Width
External instance of the constraint type Ord Length
External instance of the constraint type Show Length
External instance of the constraint type Show Width
External instance of the constraint type Ord Length
Instance of class: Show of the constraint type Show AtomicMachOp
Show)
data AtomicMachOp =
AMO_Add
| AMO_Sub
| AMO_And
| AMO_Nand
| AMO_Or
| AMO_Xor
deriving (AtomicMachOp -> AtomicMachOp -> Bool
(AtomicMachOp -> AtomicMachOp -> Bool)
-> (AtomicMachOp -> AtomicMachOp -> Bool) -> Eq AtomicMachOp
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: AtomicMachOp -> AtomicMachOp -> Bool
$c/= :: AtomicMachOp -> AtomicMachOp -> Bool
== :: AtomicMachOp -> AtomicMachOp -> Bool
$c== :: AtomicMachOp -> AtomicMachOp -> Bool
Eq, Length -> AtomicMachOp -> ShowS
[AtomicMachOp] -> ShowS
AtomicMachOp -> String
(Length -> AtomicMachOp -> ShowS)
-> (AtomicMachOp -> String)
-> ([AtomicMachOp] -> ShowS)
-> Show AtomicMachOp
forall a.
(Length -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [AtomicMachOp] -> ShowS
$cshowList :: [AtomicMachOp] -> ShowS
show :: AtomicMachOp -> String
$cshow :: AtomicMachOp -> String
showsPrec :: Length -> AtomicMachOp -> ShowS
$cshowsPrec :: Length -> AtomicMachOp -> ShowS
Show)
pprCallishMachOp :: CallishMachOp -> SDoc
pprCallishMachOp :: CallishMachOp -> SDoc
pprCallishMachOp CallishMachOp
mo = String -> SDoc
text (CallishMachOp -> String
forall a. Show a => a -> String
Instance of class: Show of the constraint type Show CallishMachOp
show CallishMachOp
mo)
callishMachOpHints :: CallishMachOp -> ([ForeignHint], [ForeignHint])
callishMachOpHints :: CallishMachOp -> ([ForeignHint], [ForeignHint])
callishMachOpHints CallishMachOp
op = case CallishMachOp
op of
MO_Memcpy Length
_ -> ([], [ForeignHint
AddrHint,ForeignHint
AddrHint,ForeignHint
NoHint])
MO_Memset Length
_ -> ([], [ForeignHint
AddrHint,ForeignHint
NoHint,ForeignHint
NoHint])
MO_Memmove Length
_ -> ([], [ForeignHint
AddrHint,ForeignHint
AddrHint,ForeignHint
NoHint])
MO_Memcmp Length
_ -> ([], [ForeignHint
AddrHint, ForeignHint
AddrHint, ForeignHint
NoHint])
CallishMachOp
_ -> ([],[])
machOpMemcpyishAlign :: CallishMachOp -> Maybe Int
machOpMemcpyishAlign :: CallishMachOp -> Maybe Length
machOpMemcpyishAlign CallishMachOp
op = case CallishMachOp
op of
MO_Memcpy Length
align -> Length -> Maybe Length
forall a. a -> Maybe a
Just Length
align
MO_Memset Length
align -> Length -> Maybe Length
forall a. a -> Maybe a
Just Length
align
MO_Memmove Length
align -> Length -> Maybe Length
forall a. a -> Maybe a
Just Length
align
MO_Memcmp Length
align -> Length -> Maybe Length
forall a. a -> Maybe a
Just Length
align
CallishMachOp
_ -> Maybe Length
forall a. Maybe a
Nothing