module UHC.Light.Compiler.CodeGen.BasicAnnot
( BasicSize (..)
, basicSizeOf
, basicSizeIsSigned
, BasicTy (..)
, BasicAnnot (..)
, basicSizeDouble, basicSizeFloat )
where
import qualified Data.Map as Map
import Data.Bits
import Data.List
import UHC.Util.Pretty
import UHC.Util.Utils
import qualified UHC.Light.Compiler.Config as Cfg
import UHC.Light.Compiler.CodeGen.Bits
import Control.Monad
import UHC.Util.Binary
import UHC.Util.Serialize
data BasicSize
=
BasicSize_Word8
| BasicSize_Word16
| BasicSize_Word32
| BasicSize_Word64
| BasicSize_Int8
| BasicSize_Int16
| BasicSize_Int32
| BasicSize_Int64
| BasicSize_Float
| BasicSize_Double
deriving (Eq,Ord,Enum)
deriving instance Typeable BasicSize
deriving instance Data BasicSize
instance Show BasicSize where
show BasicSize_Word8 = "w1"
show BasicSize_Word16 = "w2"
show BasicSize_Word32 = "w4"
show BasicSize_Word64 = "w8"
show BasicSize_Int8 = "i1"
show BasicSize_Int16 = "i2"
show BasicSize_Int32 = "i4"
show BasicSize_Int64 = "i8"
show BasicSize_Float = "f4"
show BasicSize_Double = "f8"
instance PP BasicSize where
pp = pp . show
basicSizeOfMp :: Map.Map Int BasicSize
basicSizeOfMp
= Map.fromList
[ (1, BasicSize_Word8 )
, (2, BasicSize_Word16)
, (4, BasicSize_Word32)
, (8, BasicSize_Word64)
]
basicSizeOf :: Int -> BasicSize
basicSizeOf i = panicJust "BasicAnnot.basicSizeOf" $ Map.lookup i basicSizeOfMp
basicSizeIsSigned :: BasicSize -> Bool
basicSizeIsSigned BasicSize_Int8 = True
basicSizeIsSigned BasicSize_Int16 = True
basicSizeIsSigned BasicSize_Int32 = True
basicSizeIsSigned BasicSize_Int64 = True
basicSizeIsSigned _ = False
basicSizeDouble, basicSizeFloat :: BasicSize
basicSizeFloat = BasicSize_Float
basicSizeDouble = BasicSize_Double
data BasicTy
= BasicTy_Word
| BasicTy_SWord
| BasicTy_SHWord
| BasicTy_Float
| BasicTy_Double
| BasicTy_SignedHalfWord
deriving (Eq,Ord,Enum)
deriving instance Typeable BasicTy
deriving instance Data BasicTy
instance Show BasicTy where
show BasicTy_Word = "word"
show BasicTy_SWord = "sword"
show BasicTy_SHWord = "shword"
show BasicTy_Float = "float"
show BasicTy_Double = "double"
show BasicTy_SignedHalfWord = "int"
instance PP BasicTy where
pp = pp . show
data BasicAnnot
= BasicAnnot_None
deriving (Show,Eq)
instance PP BasicAnnot where
pp _ = pp "ANNOT"
instance Serialize BasicTy where
sput = sputEnum8
sget = sgetEnum8
instance Serialize BasicSize where
sput = sputEnum8
sget = sgetEnum8
instance Serialize BasicAnnot where
sput (BasicAnnot_None ) = sputWord8 0
sget = do
t <- sgetWord8
case t of
0 -> return BasicAnnot_None