help needed for adding isWHNF primop to 5.00.2
Sun, 29 Jul 2001 11:39:18 -0700
Bernard James POPE email@example.com.OZ.AU writes:
> I would like to add a primitive to GHC 5.00.2 of the form:
> isWHNF :: a -> Bool
... list of steps followed deleted...
> If anyone could point me in the right direction to solving my problem
> I would be very grateful.
the panic you're getting is due to the fact that you didn't add native
code generator support for your primitive (compile your example with
-fvia-C to sidestep it). Appended is an NCG implementation for it,
which you might find helpful (the impl is based on dataToTagOp's).
Whether your primop is precise enough to test WHNFness or
not, I'll let others be the judge of..
-- #define isHNFzh(r,a) r=(! closure_HNF((StgClosure *)a))
primCode [res] IsHNFOp [arg]
= let res' = amodeToStix res
arg' = amodeToStix arg
arg_info = StInd PtrRep arg'
word_32 = StInd WordRep (StIndex PtrRep arg_info (StInt (-1)))
masked_le32 = StPrim SrlOp [word_32, StInt 16]
masked_be32 = StPrim AndOp [word_32, StInt 65535]
ty_info = masked_le32
ty_info = masked_be32
not_a_thunk = StPrim IntEqOp [ StPrim AndOp [ty_info, StInt 0x10]
, StInt 0x0
-- ToDo: don't hardwire the value of _THUNK from
assign = StAssign IntRep res' not_a_thunk
returnUs (\ xs -> assign : xs)