ByteCodeInstrs: Bytecode instruction definitions
\begin{code}
+{-# OPTIONS_GHC -funbox-strict-fields #-}
module ByteCodeInstr (
BCInstr(..), ProtoBCO(..), bciStackUse, BreakInfo (..)
) where
import ByteCodeItbls ( ItblPtr )
+import Type
import Outputable
import Name
import Id
= STKCHECK Int
-- Push locals (existing bits of the stack)
- | PUSH_L Int{-offset-}
- | PUSH_LL Int Int{-2 offsets-}
- | PUSH_LLL Int Int Int{-3 offsets-}
+ | PUSH_L !Int{-offset-}
+ | PUSH_LL !Int !Int{-2 offsets-}
+ | PUSH_LLL !Int !Int !Int{-3 offsets-}
-- Push a ptr (these all map to PUSH_G really)
| PUSH_G Name
| SLIDE Int{-this many-} Int{-down by this much-}
-- To do with the heap
- | ALLOC_AP Int -- make an AP with this many payload words
- | ALLOC_PAP Int Int -- make a PAP with this arity / payload words
- | MKAP Int{-ptr to AP is this far down stack-} Int{-# words-}
- | MKPAP Int{-ptr to PAP is this far down stack-} Int{-# words-}
- | UNPACK Int -- unpack N words from t.o.s Constr
- | PACK DataCon Int
+ | ALLOC_AP !Int -- make an AP with this many payload words
+ | ALLOC_PAP !Int !Int -- make a PAP with this arity / payload words
+ | MKAP !Int{-ptr to AP is this far down stack-} !Int{-# words-}
+ | MKPAP !Int{-ptr to PAP is this far down stack-} !Int{-# words-}
+ | UNPACK !Int -- unpack N words from t.o.s Constr
+ | PACK DataCon !Int
-- after assembly, the DataCon is an index into the
-- itbl array
-- For doing case trees
data BreakInfo
= BreakInfo
{ breakInfo_module :: Module
- , breakInfo_number :: Int
+ , breakInfo_number :: {-# UNPACK #-} !Int
, breakInfo_vars :: [(Id,Int)]
+ , breakInfo_resty :: Type
}
instance Outputable BreakInfo where
ppr info = text "BreakInfo" <+>
parens (ppr (breakInfo_module info) <+>
ppr (breakInfo_number info) <+>
- ppr (breakInfo_vars info))
+ ppr (breakInfo_vars info) <+>
+ ppr (breakInfo_resty info))
-- -----------------------------------------------------------------------------
-- Printing bytecode instructions