{-# 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
    
    , MemoryOrdering(..)
    , 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
$c== :: MachOp -> MachOp -> Bool
== :: MachOp -> MachOp -> Bool
$c/= :: MachOp -> MachOp -> Bool
/= :: MachOp -> MachOp -> Bool
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
$cshowsPrec :: Length -> MachOp -> ShowS
showsPrec :: Length -> MachOp -> ShowS
$cshow :: MachOp -> String
show :: MachOp -> String
$cshowList :: [MachOp] -> ShowS
showList :: [MachOp] -> ShowS
Show)
pprMachOp :: MachOp -> SDoc
pprMachOp :: MachOp -> SDoc
pprMachOp MachOp
mo = String -> SDoc
text (MachOp -> String
forall a. Show a => a -> String
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, Width
W32]
    MO_V_Extract  Length
l Width
r   -> [CmmType -> Width
typeWidth (Length -> CmmType -> CmmType
vec Length
l (Width -> CmmType
cmmBits Width
r)), Width
W32]
    MO_VF_Insert  Length
l Width
r   -> [CmmType -> Width
typeWidth (Length -> CmmType -> CmmType
vec Length
l (Width -> CmmType
cmmFloat Width
r)),Width
r,Width
W32]
    MO_VF_Extract Length
l Width
r   -> [CmmType -> Width
typeWidth (Length -> CmmType -> CmmType
vec Length
l (Width -> CmmType
cmmFloat Width
r)),Width
W32]
      
    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_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_I64_ToI
  | MO_I64_FromI
  | MO_W64_ToW
  | MO_W64_FromW
  | MO_x64_Neg
  | MO_x64_Add
  | MO_x64_Sub
  | MO_x64_Mul
  | MO_I64_Quot
  | MO_I64_Rem
  | MO_W64_Quot
  | MO_W64_Rem
  | MO_x64_And
  | MO_x64_Or
  | MO_x64_Xor
  | MO_x64_Not
  | MO_x64_Shl
  | MO_I64_Shr
  | MO_W64_Shr
  | MO_x64_Eq
  | MO_x64_Ne
  | MO_I64_Ge
  | MO_I64_Gt
  | MO_I64_Le
  | MO_I64_Lt
  | MO_W64_Ge
  | MO_W64_Gt
  | MO_W64_Le
  | MO_W64_Lt
  | 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 MemoryOrdering
  
  | MO_AtomicWrite Width MemoryOrdering
  
  
  
  | MO_Cmpxchg Width
  
  | MO_Xchg Width
  
  
  
  | MO_SuspendThread
  | MO_ResumeThread
  deriving (CallishMachOp -> CallishMachOp -> Bool
(CallishMachOp -> CallishMachOp -> Bool)
-> (CallishMachOp -> CallishMachOp -> Bool) -> Eq CallishMachOp
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: CallishMachOp -> CallishMachOp -> Bool
== :: CallishMachOp -> CallishMachOp -> Bool
$c/= :: CallishMachOp -> CallishMachOp -> Bool
/= :: CallishMachOp -> CallishMachOp -> Bool
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
$cshowsPrec :: Length -> CallishMachOp -> ShowS
showsPrec :: Length -> CallishMachOp -> ShowS
$cshow :: CallishMachOp -> String
show :: CallishMachOp -> String
$cshowList :: [CallishMachOp] -> ShowS
showList :: [CallishMachOp] -> ShowS
Show)
data MemoryOrdering
  = MemOrderRelaxed  
  | MemOrderAcquire  
  | MemOrderRelease  
  | MemOrderSeqCst   
  deriving (MemoryOrdering -> MemoryOrdering -> Bool
(MemoryOrdering -> MemoryOrdering -> Bool)
-> (MemoryOrdering -> MemoryOrdering -> Bool) -> Eq MemoryOrdering
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MemoryOrdering -> MemoryOrdering -> Bool
== :: MemoryOrdering -> MemoryOrdering -> Bool
$c/= :: MemoryOrdering -> MemoryOrdering -> Bool
/= :: MemoryOrdering -> MemoryOrdering -> Bool
Eq, Eq MemoryOrdering
Eq MemoryOrdering
-> (MemoryOrdering -> MemoryOrdering -> Ordering)
-> (MemoryOrdering -> MemoryOrdering -> Bool)
-> (MemoryOrdering -> MemoryOrdering -> Bool)
-> (MemoryOrdering -> MemoryOrdering -> Bool)
-> (MemoryOrdering -> MemoryOrdering -> Bool)
-> (MemoryOrdering -> MemoryOrdering -> MemoryOrdering)
-> (MemoryOrdering -> MemoryOrdering -> MemoryOrdering)
-> Ord MemoryOrdering
MemoryOrdering -> MemoryOrdering -> Bool
MemoryOrdering -> MemoryOrdering -> Ordering
MemoryOrdering -> MemoryOrdering -> MemoryOrdering
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
$ccompare :: MemoryOrdering -> MemoryOrdering -> Ordering
compare :: MemoryOrdering -> MemoryOrdering -> Ordering
$c< :: MemoryOrdering -> MemoryOrdering -> Bool
< :: MemoryOrdering -> MemoryOrdering -> Bool
$c<= :: MemoryOrdering -> MemoryOrdering -> Bool
<= :: MemoryOrdering -> MemoryOrdering -> Bool
$c> :: MemoryOrdering -> MemoryOrdering -> Bool
> :: MemoryOrdering -> MemoryOrdering -> Bool
$c>= :: MemoryOrdering -> MemoryOrdering -> Bool
>= :: MemoryOrdering -> MemoryOrdering -> Bool
$cmax :: MemoryOrdering -> MemoryOrdering -> MemoryOrdering
max :: MemoryOrdering -> MemoryOrdering -> MemoryOrdering
$cmin :: MemoryOrdering -> MemoryOrdering -> MemoryOrdering
min :: MemoryOrdering -> MemoryOrdering -> MemoryOrdering
Ord, Length -> MemoryOrdering -> ShowS
[MemoryOrdering] -> ShowS
MemoryOrdering -> String
(Length -> MemoryOrdering -> ShowS)
-> (MemoryOrdering -> String)
-> ([MemoryOrdering] -> ShowS)
-> Show MemoryOrdering
forall a.
(Length -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Length -> MemoryOrdering -> ShowS
showsPrec :: Length -> MemoryOrdering -> ShowS
$cshow :: MemoryOrdering -> String
show :: MemoryOrdering -> String
$cshowList :: [MemoryOrdering] -> ShowS
showList :: [MemoryOrdering] -> ShowS
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
$c== :: AtomicMachOp -> AtomicMachOp -> Bool
== :: AtomicMachOp -> AtomicMachOp -> Bool
$c/= :: AtomicMachOp -> AtomicMachOp -> Bool
/= :: 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
$cshowsPrec :: Length -> AtomicMachOp -> ShowS
showsPrec :: Length -> AtomicMachOp -> ShowS
$cshow :: AtomicMachOp -> String
show :: AtomicMachOp -> String
$cshowList :: [AtomicMachOp] -> ShowS
showList :: [AtomicMachOp] -> ShowS
Show)
pprCallishMachOp :: CallishMachOp -> SDoc
pprCallishMachOp :: CallishMachOp -> SDoc
pprCallishMachOp CallishMachOp
mo = String -> SDoc
text (CallishMachOp -> String
forall a. Show a => a -> String
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
MO_SuspendThread -> ([ForeignHint
AddrHint], [ForeignHint
AddrHint,ForeignHint
NoHint])
  CallishMachOp
MO_ResumeThread  -> ([ForeignHint
AddrHint], [ForeignHint
AddrHint])
  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