merge upstream
[ghc-hetmet.git] / compiler / codeGen / CgPrimOp.hs
index c5a6644..99e5c26 100644 (file)
@@ -35,7 +35,7 @@ import FastString
 -- ---------------------------------------------------------------------------
 -- Code generation for PrimOps
 
-cgPrimOp   :: CmmFormals       -- where to put the results
+cgPrimOp   :: [CmmFormal]      -- where to put the results
           -> PrimOp            -- the op
           -> [StgArg]          -- arguments
           -> StgLiveVars       -- live vars, in case we need to save them
@@ -47,7 +47,7 @@ cgPrimOp results op args live
        emitPrimOp results op non_void_args live
 
 
-emitPrimOp :: CmmFormals       -- where to put the results
+emitPrimOp :: [CmmFormal]      -- where to put the results
           -> PrimOp            -- the op
           -> [CmmExpr]         -- arguments
           -> StgLiveVars       -- live vars, in case we need to save them
@@ -638,6 +638,13 @@ setInfo closure_ptr info_ptr = CmmStore closure_ptr info_ptr
 -- ----------------------------------------------------------------------------
 -- Copying pointer arrays
 
+-- EZY: This code has an unusually high amount of assignTemp calls, seen
+-- nowhere else in the code generator.  This is mostly because these
+-- "primitive" ops result in a surprisingly large amount of code.  It
+-- will likely be worthwhile to optimize what is emitted here, so that
+-- our optimization passes don't waste time repeatedly optimizing the
+-- same bits of code.
+
 -- | Takes a source 'Array#', an offset in the source array, a
 -- destination 'MutableArray#', an offset into the destination array,
 -- and the number of elements to copy.  Copies the given number of
@@ -733,7 +740,7 @@ emitCloneArray info_p res_r src0 src_off0 n0 live = do
     emitMemcpyCall dst_p src_p (n `cmmMulWord` wordSize) live
 
     emitMemsetCall (cmmOffsetExprW dst_p n)
-        (CmmLit (CmmInt (toInteger (1 :: Int)) W8))
+        (CmmLit (mkIntCLit 1))
         (card_words `cmmMulWord` wordSize)
         live
     stmtC $ CmmAssign (CmmLocal res_r) arr
@@ -751,7 +758,7 @@ emitSetCards :: CmmExpr -> CmmExpr -> CmmExpr -> StgLiveVars -> Code
 emitSetCards dst_start dst_cards_start n live = do
     start_card <- assignTemp $ card dst_start
     emitMemsetCall (dst_cards_start `cmmAddWord` start_card)
-        (CmmLit (CmmInt (toInteger (1 :: Int)) W8))
+        (CmmLit (mkIntCLit 1))
         ((card (dst_start `cmmAddWord` n) `cmmSubWord` start_card)
          `cmmAddWord` CmmLit (mkIntCLit 1))
         live
@@ -795,8 +802,8 @@ emitMemmoveCall dst src n live = do
     memmove = CmmLit (CmmLabel (mkForeignLabel (fsLit "memmove") Nothing
                                ForeignLabelInExternalPackage IsFunction))
 
--- | Emit a call to @memset@.  The second argument must be of type
--- 'W8'.
+-- | Emit a call to @memset@.  The second argument must fit inside an
+-- unsigned char.
 emitMemsetCall :: CmmExpr -> CmmExpr -> CmmExpr -> StgLiveVars -> Code
 emitMemsetCall dst c n live = do
     vols <- getVolatileRegs live