cgPrimOp
) where
+#include "HsVersions.h"
+
import ForeignCall ( CCallConv(CCallConv) )
import StgSyn ( StgLiveVars, StgArg )
import CgBindery ( getVolatileRegs, getArgAmodes )
import CgMonad
import CgInfoTbls ( getConstrTag )
import CgUtils ( cmmOffsetW, cmmOffsetB, cmmLoadIndexW )
+import ForeignCall
import Cmm
import CLabel ( mkMAP_FROZEN_infoLabel, mkMAP_DIRTY_infoLabel,
- mkDirty_MUT_VAR_Label )
+ mkDirty_MUT_VAR_Label, mkRtsCodeLabel )
import CmmUtils
import MachOp
import SMRep
import PrimOp ( PrimOp(..) )
import SMRep ( tablesNextToCode )
import Constants ( wORD_SIZE, wORD_SIZE_IN_BITS )
+import StaticFlags ( opt_Parallel )
import Outputable
-- ---------------------------------------------------------------------------
emitPrimOp [res] ParOp [arg] live
- = stmtC (CmmAssign res (CmmLit (mkIntCLit 1)))
+ = do
+ -- for now, just implement this in a C function
+ -- later, we might want to inline it.
+ vols <- getVolatileRegs live
+ stmtC (CmmCall (CmmForeignCall newspark CCallConv) [(res,NoHint)]
+ [(CmmReg (CmmGlobal BaseReg), PtrHint),
+ (arg,PtrHint)]
+ (Just vols))
+ where
+ newspark = CmmLit (CmmLabel (mkRtsCodeLabel SLIT("newSpark")))
emitPrimOp [res] ReadMutVarOp [mutv] live
= stmtC (CmmAssign res (cmmLoadIndexW mutv fixedHdrSize))
stmtC (CmmCall (CmmForeignCall (CmmLit (CmmLabel mkDirty_MUT_VAR_Label))
CCallConv)
[{-no results-}]
- [(mutv,PtrHint)]
+ [(CmmReg (CmmGlobal BaseReg), PtrHint),
+ (mutv,PtrHint)]
(Just vols))
-- #define sizzeofByteArrayzh(r,a) \