Narrow the args of the popCnt# primitives (new codegen)
authorSimon Marlow <marlowsd@gmail.com>
Mon, 3 Sep 2012 11:28:35 +0000 (12:28 +0100)
committerSimon Marlow <marlowsd@gmail.com>
Tue, 4 Sep 2012 12:58:27 +0000 (13:58 +0100)
(this change was previously done in the old codegen only)

compiler/codeGen/StgCmmPrim.hs

index 3a7a456..6c6005e 100644 (file)
@@ -498,11 +498,16 @@ emitPrimOp [] SetByteArrayOp [ba,off,len,c] =
     doSetByteArrayOp ba off len c
 
 -- Population count
-emitPrimOp [res] PopCnt8Op [w] = emitPopCntCall res w W8
-emitPrimOp [res] PopCnt16Op [w] = emitPopCntCall res w W16
-emitPrimOp [res] PopCnt32Op [w] = emitPopCntCall res w W32
-emitPrimOp [res] PopCnt64Op [w] = emitPopCntCall res w W64
-emitPrimOp [res] PopCntOp [w] = emitPopCntCall res w wordWidth
+emitPrimOp [res] PopCnt8Op [w] =
+  emitPopCntCall res (CmmMachOp mo_WordTo8 [w]) W8
+emitPrimOp [res] PopCnt16Op [w] =
+  emitPopCntCall res (CmmMachOp mo_WordTo16 [w]) W16
+emitPrimOp [res] PopCnt32Op [w] =
+  emitPopCntCall res (CmmMachOp mo_WordTo32 [w]) W32
+emitPrimOp [res] PopCnt64Op [w] =
+  emitPopCntCall res w W64 -- arg always has type W64, no need to narrow
+emitPrimOp [res] PopCntOp [w] =
+  emitPopCntCall res w wordWidth
 
 -- The rest just translate straightforwardly
 emitPrimOp [res] op [arg]