X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=blobdiff_plain;f=compiler%2FcodeGen%2FCgPrimOp.hs;h=82f7d658f21fec86b2cccf721af6dbac6f3c269c;hp=c5a6644aba1c6822ccd8bed440755a6afaf68804;hb=5b1053897fa16ced293e749447e9c027d15d29f5;hpb=9c23f06f3eb925dca063d5102b0ced4a9afe795e diff --git a/compiler/codeGen/CgPrimOp.hs b/compiler/codeGen/CgPrimOp.hs index c5a6644..82f7d65 100644 --- a/compiler/codeGen/CgPrimOp.hs +++ b/compiler/codeGen/CgPrimOp.hs @@ -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