Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /sml/trunk/src/compiler/PervEnv/Basis/pack-word-l16.sml
ViewVC logotype

Annotation of /sml/trunk/src/compiler/PervEnv/Basis/pack-word-l16.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 114 - (view) (download)

1 : monnier 89 (* pack-word-l16.sml
2 :     *
3 :     * COPYRIGHT (c) 1995 AT&T Bell Laboratories.
4 :     *
5 :     * This is the non-native implementation of 16-bit little-endian packing
6 :     * operations.
7 :     *
8 :     *)
9 :    
10 :     structure Pack16Little : PACK_WORD =
11 :     struct
12 :     structure W = LargeWord
13 :     structure W8 = Word8
14 :     structure W8V = InlineT.Word8Vector
15 :     structure W8A = InlineT.Word8Array
16 :    
17 :     val bytesPerElem = 2
18 :     val isBigEndian = false
19 :    
20 :     (* convert the byte length into word16 length (n div 2), and check the index *)
21 :     fun chkIndex (len, i) = let
22 :     val len = Word.toIntX(Word.>>(Word.fromInt len, 0w1))
23 :     in
24 :     if (InlineT.DfltInt.ltu(i, len)) then () else raise Subscript
25 :     end
26 :    
27 :     fun mkWord (b1, b2) =
28 :     W.orb(W.<<(Word8.toLargeWord b2, 0w8), Word8.toLargeWord b1)
29 :    
30 :     fun signExt w = W.-(W.xorb(0wx8000, w), 0wx8000)
31 :    
32 :     fun subVec (vec, i) = let
33 :     val _ = chkIndex (W8V.length vec, i)
34 :     val k = i+i
35 :     in
36 :     mkWord (W8V.sub(vec, k), W8V.sub(vec, k+1))
37 :     end
38 :     fun subVecX(vec, i) = signExt (subVec (vec, i))
39 :    
40 :     fun subArr (arr, i) = let
41 :     val _ = chkIndex (W8A.length arr, i)
42 :     val k = i+i
43 :     in
44 :     mkWord (W8A.sub(arr, k), W8A.sub(arr, k+1))
45 :     end
46 :     fun subArrX(arr, i) = signExt (subArr (arr, i))
47 :    
48 :     fun update (arr, i, w) = let
49 :     val _ = chkIndex (W8A.length arr, i)
50 :     val k = i+i
51 :     in
52 :     W8A.update (arr, k, W8.fromLargeWord w);
53 :     W8A.update (arr, k+1, W8.fromLargeWord(W.>>(w, 0w8)))
54 :     end
55 :    
56 :     end;
57 :    
58 :     (*
59 : monnier 113 * $Log$
60 : monnier 89 *)

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0