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/int31.sml
ViewVC logotype

Annotation of /sml/trunk/src/compiler/PervEnv/Basis/int31.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 89 - (view) (download)

1 : monnier 89 (* int31.sml
2 :     *
3 :     * COPYRIGHT (c) 1995 AT&T Bell Laboratories.
4 :     *
5 :     * The following structures must be without signatures so that inlining
6 :     * can take place: Bits, Vector, Array, RealArray, Int, Real
7 :     *
8 :     *)
9 :    
10 :     structure Int31 : INTEGER =
11 :     struct
12 :     structure I31 = InlineT.Int31
13 :     structure I32 = InlineT.Int32
14 :    
15 :     exception Div = Assembly.Div
16 :     exception Overflow = Assembly.Overflow
17 :    
18 :     type int = int
19 :    
20 :     val precision = SOME 31
21 :     val minIntVal = ~1073741824
22 :     val minInt = SOME minIntVal
23 :     val maxInt = SOME 1073741823
24 :    
25 :     val toLarge : int -> LargeInt.int = I32.fromInt
26 :     val fromLarge : LargeInt.int -> int = I32.toInt
27 :     val toInt = InlineT.Int31.toInt
28 :     val fromInt = InlineT.Int31.fromInt
29 :    
30 :     val ~ : int -> int = I31.~
31 :     val op * : int * int -> int = I31.*
32 :     val op + : int * int -> int = I31.+
33 :     val op - : int * int -> int = I31.-
34 :     val op div : int * int -> int = I31.div
35 :     val op mod : int * int -> int = I31.mod
36 :     val op quot : int * int -> int = I31.quot
37 :     val op rem : int * int -> int = I31.rem
38 :     val min : int * int -> int = I31.min
39 :     val max : int * int -> int = I31.max
40 :     val abs : int -> int = I31.abs
41 :    
42 :     fun sign 0 = 0
43 :     | sign i = if I31.<(i, 0) then ~1 else 1
44 :     fun sameSign (i, j) = (I31.andb(I31.xorb(i, j), minIntVal) = 0)
45 :    
46 :     fun compare (i, j) =
47 :     if (I31.<(i, j)) then General.LESS
48 :     else if (I31.>(i, j)) then General.GREATER
49 :     else General.EQUAL
50 :     val op > : int * int -> bool = I31.>
51 :     val op >= : int * int -> bool = I31.>=
52 :     val op < : int * int -> bool = I31.<
53 :     val op <= : int * int -> bool = I31.<=
54 :    
55 :     fun fmt radix = (NumFormat.fmtInt radix) o Int32.fromInt
56 :    
57 :     fun scan radix = let
58 :     val scanLarge = NumScan.scanInt radix
59 :     fun f getc cs =
60 :     (case scanLarge getc cs
61 :     of NONE => NONE
62 :     | SOME(i, cs') =>
63 :     if I32.>(i, 0x3fffffff) orelse I32.<(i, ~0x40000000) then
64 :     raise Overflow
65 :     else
66 :     SOME(Int32.toInt i, cs')
67 :     (*esac*))
68 :     in f
69 :     end
70 :     (*
71 :     val scan = NumScan.scanInt
72 :     *)
73 :    
74 :     val toString = fmt StringCvt.DEC
75 :     val fromString = PreBasis.scanString (scan StringCvt.DEC)
76 :    
77 :     end (* structure Int31 *)
78 :    
79 :     (*
80 :     * $Log: int31.sml,v $
81 :     * Revision 1.1.1.1 1998/04/08 18:40:04 george
82 :     * Version 110.5
83 :     *
84 :     *)

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