summaryrefslogtreecommitdiff
path: root/compiler/codeGen
diff options
context:
space:
mode:
authorGeoffrey Mainland <mainland@apeiron.net>2012-11-15 10:16:29 +0000
committerGeoffrey Mainland <gmainlan@microsoft.com>2013-02-01 22:00:24 +0000
commitcc56f34e71201e27e4e15af01a5a6258648d6a32 (patch)
treeed74568b892c8bf7466387424b4882e7379b68b0 /compiler/codeGen
parent089ac7171bee938bd52975d2f828cf0dd6b4b25b (diff)
downloadhaskell-cc56f34e71201e27e4e15af01a5a6258648d6a32.tar.gz
Add prefetch primops.
Diffstat (limited to 'compiler/codeGen')
-rw-r--r--compiler/codeGen/StgCmmPrim.hs47
1 files changed, 47 insertions, 0 deletions
diff --git a/compiler/codeGen/StgCmmPrim.hs b/compiler/codeGen/StgCmmPrim.hs
index 4e0d773097..4005f6d9b4 100644
--- a/compiler/codeGen/StgCmmPrim.hs
+++ b/compiler/codeGen/StgCmmPrim.hs
@@ -265,6 +265,15 @@ emitPrimOp dflags [res] SizeofMutableByteArrayOp [arg]
emitPrimOp _ res@[] TouchOp args@[_arg]
= do emitPrimCall res MO_Touch args
+emitPrimOp _ res@[] PrefetchByteArrayOp args@[_arg]
+ = do emitPrimCall res MO_Prefetch_Data args
+
+emitPrimOp _ res@[] PrefetchMutableByteArrayOp args@[_arg]
+ = do emitPrimCall res MO_Prefetch_Data args
+
+emitPrimOp _ res@[] PrefetchAddrOp args@[_arg]
+ = do emitPrimCall res MO_Prefetch_Data args
+
-- #define byteArrayContentszh(r,a) r = BYTE_ARR_CTS(a)
emitPrimOp dflags [res] ByteArrayContents_Char [arg]
= emitAssign (CmmLocal res) (cmmOffsetB dflags arg (arrWordsHdrSize dflags))
@@ -619,6 +628,11 @@ emitPrimOp _ res@[_,_] Int64X2UnpackOp [arg] =
emitPrimOp _ [res] Int64X2InsertOp [v,e,i] =
doVecInsertOp Nothing vec2b64 v e i res
+-- Prefetch
+emitPrimOp _ res PrefetchByteArrayOp args = doPrefetchByteArrayOp res args
+emitPrimOp _ res PrefetchMutableByteArrayOp args = doPrefetchByteArrayOp res args
+emitPrimOp _ res PrefetchAddrOp args = doPrefetchAddrOp res args
+
-- The rest just translate straightforwardly
emitPrimOp dflags [res] op [arg]
| nopOp op
@@ -1265,6 +1279,39 @@ doVecInsertOp maybe_pre_write_cast ty src e idx res = do
wid :: Width
wid = typeWidth (vecElemType ty)
+------------------------------------------------------------------------------
+-- Helpers for translating prefetching.
+
+doPrefetchByteArrayOp :: [LocalReg]
+ -> [CmmExpr]
+ -> FCode ()
+doPrefetchByteArrayOp res [addr,idx]
+ = do dflags <- getDynFlags
+ mkBasicPrefetch (arrWordsHdrSize dflags) res addr idx
+doPrefetchByteArrayOp _ _
+ = panic "StgCmmPrim: doPrefetchByteArrayOp"
+
+doPrefetchAddrOp :: [LocalReg]
+ -> [CmmExpr]
+ -> FCode ()
+doPrefetchAddrOp res [addr,idx]
+ = mkBasicPrefetch 0 res addr idx
+doPrefetchAddrOp _ _
+ = panic "StgCmmPrim: doPrefetchAddrOp"
+
+mkBasicPrefetch :: ByteOff -- Initial offset in bytes
+ -> [LocalReg] -- Destination
+ -> CmmExpr -- Base address
+ -> CmmExpr -- Index
+ -> FCode ()
+mkBasicPrefetch off res base idx
+ = do dflags <- getDynFlags
+ emitPrimCall [] MO_Prefetch_Data [cmmIndexExpr dflags W8 (cmmOffsetB dflags base off) idx]
+ case res of
+ [] -> return ()
+ [reg] -> emitAssign (CmmLocal reg) base
+ _ -> panic "StgCmmPrim: mkBasicPrefetch"
+
-- ----------------------------------------------------------------------------
-- Copying byte arrays