diff options
author | Geoffrey Mainland <mainland@apeiron.net> | 2012-11-15 10:16:29 +0000 |
---|---|---|
committer | Geoffrey Mainland <gmainlan@microsoft.com> | 2013-02-01 22:00:24 +0000 |
commit | cc56f34e71201e27e4e15af01a5a6258648d6a32 (patch) | |
tree | ed74568b892c8bf7466387424b4882e7379b68b0 /compiler/codeGen | |
parent | 089ac7171bee938bd52975d2f828cf0dd6b4b25b (diff) | |
download | haskell-cc56f34e71201e27e4e15af01a5a6258648d6a32.tar.gz |
Add prefetch primops.
Diffstat (limited to 'compiler/codeGen')
-rw-r--r-- | compiler/codeGen/StgCmmPrim.hs | 47 |
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 |