summaryrefslogtreecommitdiff
path: root/compiler/codeGen
diff options
context:
space:
mode:
authorJohn Ky <newhoggy@gmail.com>2017-11-15 11:35:42 -0500
committerBen Gamari <ben@smart-cactus.org>2017-11-15 11:37:00 -0500
commitf5dc8ccc29429d0a1d011f62b6b430f6ae50290c (patch)
tree3b3e3d9cf1a1276efd977523b5ea18fa65ecf812 /compiler/codeGen
parent47ad6578ea460999b53eb4293c3a3b3017a56d65 (diff)
downloadhaskell-f5dc8ccc29429d0a1d011f62b6b430f6ae50290c.tar.gz
Add new mbmi and mbmi2 compiler flags
This adds support for the bit deposit and extraction operations provided by the BMI and BMI2 instruction set extensions on modern amd64 machines. Test Plan: Validate Reviewers: austin, simonmar, bgamari, hvr, goldfire, erikd Reviewed By: bgamari Subscribers: goldfire, erikd, trommler, newhoggy, rwbarton, thomie GHC Trac Issues: #14206 Differential Revision: https://phabricator.haskell.org/D4063
Diffstat (limited to 'compiler/codeGen')
-rw-r--r--compiler/codeGen/StgCmmPrim.hs78
1 files changed, 78 insertions, 0 deletions
diff --git a/compiler/codeGen/StgCmmPrim.hs b/compiler/codeGen/StgCmmPrim.hs
index da652bf1b0..18074991b3 100644
--- a/compiler/codeGen/StgCmmPrim.hs
+++ b/compiler/codeGen/StgCmmPrim.hs
@@ -584,6 +584,20 @@ emitPrimOp _ [res] PopCnt32Op [w] = emitPopCntCall res w W32
emitPrimOp _ [res] PopCnt64Op [w] = emitPopCntCall res w W64
emitPrimOp dflags [res] PopCntOp [w] = emitPopCntCall res w (wordWidth dflags)
+-- Parallel bit deposit
+emitPrimOp _ [res] Pdep8Op [src, mask] = emitPdepCall res src mask W8
+emitPrimOp _ [res] Pdep16Op [src, mask] = emitPdepCall res src mask W16
+emitPrimOp _ [res] Pdep32Op [src, mask] = emitPdepCall res src mask W32
+emitPrimOp _ [res] Pdep64Op [src, mask] = emitPdepCall res src mask W64
+emitPrimOp dflags [res] PdepOp [src, mask] = emitPdepCall res src mask (wordWidth dflags)
+
+-- Parallel bit extract
+emitPrimOp _ [res] Pext8Op [src, mask] = emitPextCall res src mask W8
+emitPrimOp _ [res] Pext16Op [src, mask] = emitPextCall res src mask W16
+emitPrimOp _ [res] Pext32Op [src, mask] = emitPextCall res src mask W32
+emitPrimOp _ [res] Pext64Op [src, mask] = emitPextCall res src mask W64
+emitPrimOp dflags [res] PextOp [src, mask] = emitPextCall res src mask (wordWidth dflags)
+
-- count leading zeros
emitPrimOp _ [res] Clz8Op [w] = emitClzCall res w W8
emitPrimOp _ [res] Clz16Op [w] = emitClzCall res w W16
@@ -865,6 +879,56 @@ callishPrimOpSupported dflags op
|| llvm -> Left MO_F64_Fabs
| otherwise -> Right $ genericFabsOp W64
+ -- Pdep8Op | (ncg && (x86ish
+ -- || ppc))
+ -- || llvm -> Left (MO_Pdep (wordWidth dflags))
+ -- | otherwise -> error "TODO: Implement (Right genericPdep8Op)"
+
+ -- Pdep16Op | (ncg && (x86ish
+ -- || ppc))
+ -- || llvm -> Left (MO_Pdep (wordWidth dflags))
+ -- | otherwise -> error "TODO: Implement (Right genericPdep16Op)"
+
+ -- Pdep32Op | (ncg && (x86ish
+ -- || ppc))
+ -- || llvm -> Left (MO_Pdep (wordWidth dflags))
+
+ -- | otherwise -> error "TODO: Implement (Right genericPdep32Op)"
+ -- Pdep64Op | (ncg && (x86ish
+ -- || ppc))
+ -- || llvm -> Left (MO_Pdep (wordWidth dflags))
+ -- | otherwise -> error "TODO: Implement (Right genericPdep64Op)"
+
+ -- PdepOp | (ncg && (x86ish
+ -- || ppc))
+ -- || llvm -> Left (MO_Pdep (wordWidth dflags))
+ -- | otherwise -> error "TODO: Implement (Right genericPdepOp)"
+
+ -- Pext8Op | (ncg && (x86ish
+ -- || ppc))
+ -- || llvm -> Left (MO_Pext (wordWidth dflags))
+ -- | otherwise -> error "TODO: Implement (Right genericPext8Op)"
+
+ -- Pext16Op | (ncg && (x86ish
+ -- || ppc))
+ -- || llvm -> Left (MO_Pext (wordWidth dflags))
+ -- | otherwise -> error "TODO: Implement (Right genericPext16Op)"
+
+ -- Pext32Op | (ncg && (x86ish
+ -- || ppc))
+ -- || llvm -> Left (MO_Pext (wordWidth dflags))
+ -- | otherwise -> error "TODO: Implement (Right genericPext32Op)"
+
+ -- Pext64Op | (ncg && (x86ish
+ -- || ppc))
+ -- || llvm -> Left (MO_Pext (wordWidth dflags))
+ -- | otherwise -> error "TODO: Implement (Right genericPext64Op)"
+
+ -- PextOp | (ncg && (x86ish
+ -- || ppc))
+ -- || llvm -> Left (MO_Pext (wordWidth dflags))
+ -- | otherwise -> error "TODO: Implement (Right genericPextOp)"
+
_ -> pprPanic "emitPrimOp: can't translate PrimOp " (ppr op)
where
ncg = case hscTarget dflags of
@@ -2266,6 +2330,20 @@ emitPopCntCall res x width = do
(MO_PopCnt width)
[ x ]
+emitPdepCall :: LocalReg -> CmmExpr -> CmmExpr -> Width -> FCode ()
+emitPdepCall res x y width = do
+ emitPrimCall
+ [ res ]
+ (MO_Pdep width)
+ [ x, y ]
+
+emitPextCall :: LocalReg -> CmmExpr -> CmmExpr -> Width -> FCode ()
+emitPextCall res x y width = do
+ emitPrimCall
+ [ res ]
+ (MO_Pext width)
+ [ x, y ]
+
emitClzCall :: LocalReg -> CmmExpr -> Width -> FCode ()
emitClzCall res x width = do
emitPrimCall