ByteCodeInstrs: Bytecode instruction definitions
\begin{code}
+{-# OPTIONS_GHC -funbox-strict-fields #-}
+
+{-# OPTIONS -w #-}
+-- The above warning supression flag is a temporary kludge.
+-- While working on this module you are encouraged to remove it and fix
+-- any warnings in the module. See
+-- http://hackage.haskell.org/trac/ghc/wiki/Commentary/CodingStyle#Warnings
+-- for details
+
module ByteCodeInstr (
BCInstr(..), ProtoBCO(..), bciStackUse, BreakInfo (..)
) where
import GHC.Ptr
import Module (Module)
-import GHC.Prim
+import GHC.Exts
-- ----------------------------------------------------------------------------
= 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_AP_NOUPD !Int -- make an AP_NOUPD 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
| CASEFAIL
| JMP LocalLabel
- -- For doing calls to C (via glue code generated by ByteCodeFFI)
+ -- For doing calls to C (via glue code generated by ByteCodeFFI, or libffi)
| CCALL Int -- stack frame size
(Ptr ()) -- addr of the glue code
data BreakInfo
= BreakInfo
{ breakInfo_module :: Module
- , breakInfo_number :: Int
+ , breakInfo_number :: {-# UNPACK #-} !Int
, breakInfo_vars :: [(Id,Int)]
, breakInfo_resty :: Type
}
ppr (SLIDE n d) = text "SLIDE " <+> int n <+> int d
ppr (ALLOC_AP sz) = text "ALLOC_AP " <+> int sz
+ ppr (ALLOC_AP_NOUPD sz) = text "ALLOC_AP_NOUPD " <+> int sz
ppr (ALLOC_PAP arity sz) = text "ALLOC_PAP " <+> int arity <+> int sz
ppr (MKAP offset sz) = text "MKAP " <+> int sz <+> text "words,"
<+> int offset <+> text "stkoff"
bciStackUse PUSH_APPLY_PPPPP{} = 1
bciStackUse PUSH_APPLY_PPPPPP{} = 1
bciStackUse ALLOC_AP{} = 1
+bciStackUse ALLOC_AP_NOUPD{} = 1
bciStackUse ALLOC_PAP{} = 1
bciStackUse (UNPACK sz) = sz
bciStackUse LABEL{} = 0