[project @ 2005-07-11 10:47:20 by simonpj]
[ghc-hetmet.git] / ghc / compiler / codeGen / CgForeignCall.hs
index 1f25faf..417c3c5 100644 (file)
@@ -32,7 +32,7 @@ import MachOp
 import SMRep
 import ForeignCall
 import Constants
-import CmdLineOpts     ( opt_SccProfilingOn )
+import StaticFlags     ( opt_SccProfilingOn, opt_SMP )
 import Outputable
 
 import Monad           ( when )
@@ -78,13 +78,20 @@ emitForeignCall results (CCall (CCallSpec target cconv safety)) args live
     vols <- getVolatileRegs live
     id <- newTemp wordRep
     emitSaveThreadState
-    stmtC (CmmCall (CmmForeignCall suspendThread CCallConv) [(id,NoHint)]
-                       [ (CmmReg (CmmGlobal BaseReg), NoHint) ] 
-                       Nothing{-save all; ToDo-}
+    stmtC (CmmCall (CmmForeignCall suspendThread CCallConv) 
+                       [(id,NoHint)]
+                       [ (CmmReg (CmmGlobal BaseReg), PtrHint) ] 
+                       (Just vols)
                        )
     stmtC (the_call vols)
-    stmtC (CmmCall (CmmForeignCall resumeThread CCallConv) []
-                       [ (CmmReg id, NoHint) ] (Just vols)
+    stmtC (CmmCall (CmmForeignCall resumeThread CCallConv) 
+                       (if opt_SMP then [(CmmGlobal BaseReg, PtrHint)] else [])
+                               -- Assign the result to BaseReg: we might now have
+                               -- a different Capability!  Small optimisation:
+                               -- only do this in SMP mode, where there are >1
+                               -- Capabilities.
+                       [ (CmmReg id, NoHint) ]
+                       (Just vols)
                        )
     emitLoadThreadState