diff options
author | Johan Tibell <johan.tibell@gmail.com> | 2011-07-20 18:29:22 +0200 |
---|---|---|
committer | Simon Marlow <marlowsd@gmail.com> | 2011-08-16 16:48:04 +0100 |
commit | 2d0438f329ac153f9e59155f405d27fac0c43d65 (patch) | |
tree | bb3ed4a2fb183ca163a78b553b579079fae75c11 /compiler/codeGen/StgCmmPrim.hs | |
parent | 49dbe60558deee5ea6cd2c7730b7c591d15559c8 (diff) | |
download | haskell-2d0438f329ac153f9e59155f405d27fac0c43d65.tar.gz |
Add popCnt# primop
Diffstat (limited to 'compiler/codeGen/StgCmmPrim.hs')
-rw-r--r-- | compiler/codeGen/StgCmmPrim.hs | 14 |
1 files changed, 14 insertions, 0 deletions
diff --git a/compiler/codeGen/StgCmmPrim.hs b/compiler/codeGen/StgCmmPrim.hs index c71d285735..b68bb601eb 100644 --- a/compiler/codeGen/StgCmmPrim.hs +++ b/compiler/codeGen/StgCmmPrim.hs @@ -443,6 +443,13 @@ emitPrimOp [] CopyByteArrayOp [src,src_off,dst,dst_off,n] = emitPrimOp [] CopyMutableByteArrayOp [src,src_off,dst,dst_off,n] = doCopyMutableByteArrayOp src src_off dst dst_off n +-- 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 + -- The rest just translate straightforwardly emitPrimOp [res] op [arg] | nopOp op @@ -940,3 +947,10 @@ emitAllocateCall res cap n = do where allocate = CmmLit (CmmLabel (mkForeignLabel (fsLit "allocate") Nothing ForeignLabelInExternalPackage IsFunction)) + +emitPopCntCall :: LocalReg -> CmmExpr -> Width -> FCode () +emitPopCntCall res x width = do + emitPrimCall + [ res ] + (MO_PopCnt width) + [ x ] |