Repository : ssh://darcs.haskell.org//srv/darcs/ghc

On branch  : master

http://hackage.haskell.org/trac/ghc/changeset/971160abf8ce633fed23eb603cf9e0fb08d1746d

>---------------------------------------------------------------

commit 971160abf8ce633fed23eb603cf9e0fb08d1746d
Author: Daniel Peebles <[email protected]>
Date:   Wed Jan 26 05:15:54 2011 +0000

    Add sizeof(Mutable)Array# primitives

>---------------------------------------------------------------

 compiler/codeGen/CgPrimOp.hs    |    5 +++++
 compiler/codeGen/StgCmmPrim.hs  |    5 +++++
 compiler/prelude/primops.txt.pp |    8 ++++++++
 3 files changed, 18 insertions(+), 0 deletions(-)

diff --git a/compiler/codeGen/CgPrimOp.hs b/compiler/codeGen/CgPrimOp.hs
index 8ca4225..d772514 100644
--- a/compiler/codeGen/CgPrimOp.hs
+++ b/compiler/codeGen/CgPrimOp.hs
@@ -211,6 +211,11 @@ emitPrimOp [r] ReadArrayOp  [obj,ix]   _  = 
doReadPtrArrayOp r obj ix
 emitPrimOp [r] IndexArrayOp [obj,ix]   _  = doReadPtrArrayOp r obj ix
 emitPrimOp []  WriteArrayOp [obj,ix,v] _  = doWritePtrArrayOp obj ix v
 
+emitPrimOp [res] SizeofArrayOp [arg] _
+   = stmtC $ CmmAssign (CmmLocal res) (cmmLoadIndexW arg fixedHdrSize bWord)
+emitPrimOp [res] SizeofMutableArrayOp [arg] live
+   = emitPrimOp [res] SizeofArrayOp [arg] live
+
 -- IndexXXXoffAddr
 
 emitPrimOp res IndexOffAddrOp_Char      args _ = doIndexOffAddrOp (Just 
mo_u_8ToWord) b8 res args
diff --git a/compiler/codeGen/StgCmmPrim.hs b/compiler/codeGen/StgCmmPrim.hs
index 8f688f0..35fe035 100644
--- a/compiler/codeGen/StgCmmPrim.hs
+++ b/compiler/codeGen/StgCmmPrim.hs
@@ -287,6 +287,11 @@ emitPrimOp [r] ReadArrayOp  [obj,ix]    = doReadPtrArrayOp 
r obj ix
 emitPrimOp [r] IndexArrayOp [obj,ix]    = doReadPtrArrayOp r obj ix
 emitPrimOp []  WriteArrayOp [obj,ix,v]  = doWritePtrArrayOp obj ix v
 
+emitPrimOp [res] SizeofArrayOp [arg]
+   = emit $    mkAssign (CmmLocal res) (cmmLoadIndexW arg fixedHdrSize bWord)
+emitPrimOp [res] SizeofMutableArrayOp [arg]
+   = emitPrimOp [res] SizeofArrayOp [arg]
+
 -- IndexXXXoffAddr
 
 emitPrimOp res IndexOffAddrOp_Char      args = doIndexOffAddrOp (Just 
mo_u_8ToWord) b8 res args
diff --git a/compiler/prelude/primops.txt.pp b/compiler/prelude/primops.txt.pp
index 3d643bd..525a837 100644
--- a/compiler/prelude/primops.txt.pp
+++ b/compiler/prelude/primops.txt.pp
@@ -600,6 +600,14 @@ primop  WriteArrayOp "writeArray#" GenPrimOp
    with
    has_side_effects = True
 
+primop  SizeofArrayOp "sizeofArray#" GenPrimOp
+   Array# a -> Int#
+   {Return the number of elements in the array.}
+
+primop  SizeofMutableArrayOp "sizeofMutableArray#" GenPrimOp
+   MutableArray# s a -> Int#
+   {Return the number of elements in the array.}
+
 primop  IndexArrayOp "indexArray#" GenPrimOp
    Array# a -> Int# -> (# a #)
    {Read from specified index of immutable array. Result is packaged into



_______________________________________________
Cvs-ghc mailing list
[email protected]
http://www.haskell.org/mailman/listinfo/cvs-ghc

Reply via email to