File: machine-int.sig

package info (click to toggle)
mlton 20210117%2Bdfsg-3
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 58,464 kB
  • sloc: ansic: 27,682; sh: 4,455; asm: 3,569; lisp: 2,879; makefile: 2,347; perl: 1,169; python: 191; pascal: 68; javascript: 7
file content (116 lines) | stat: -rw-r--r-- 4,725 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
(*
 * This module implements 2's complement arithmetic of various widths.
 *)
signature MACHINE_INT =
sig

   type machine_int = IntInf.int
   type sz = int (* width in bits *)

   datatype div_rounding_mode = DIV_TO_ZERO | DIV_TO_NEGINF

   val hash : machine_int -> word

   (* machine_int <-> other types *)
   val fromInt     : sz * int -> machine_int
   val fromInt32   : sz * Int32.int -> machine_int
   val fromInt64   : sz * Int64.int -> machine_int
   val fromWord    : sz * word -> machine_int
   val fromWord32  : sz * Word32.word -> machine_int
   val fromWord64  : sz * Word64.word -> machine_int

   val toInt       : sz * machine_int -> int
   val toInt32     : sz * machine_int -> Int32.int
   val toInt64     : sz * machine_int -> Int64.int
   val toWord      : sz * machine_int -> word
   val toWord32    : sz * machine_int -> Word32.word
   val toWord64    : sz * machine_int -> Word64.word

   val fromString  : sz * string -> machine_int option
   val toString    : sz * machine_int -> string
   val toHexString : sz * machine_int -> string
   val toBinString : sz * machine_int -> string


    (* when in doubt, use this to narrow to a given width! *)
   val narrow : sz * IntInf.int -> machine_int

    (* convert to signed/unsigned representation *)
   val signed   : sz * machine_int -> IntInf.int
   val unsigned : sz * machine_int -> IntInf.int

    (* Split a machine_int of length sz into words of word sizes.
     * The least significant word is at the front of the list
     *)
   val split : {sz:sz, wordSize:sz, i:machine_int} -> machine_int list

   (* two's complement operators *)
   val NEG   : sz * machine_int -> machine_int
   val ABS   : sz * machine_int -> machine_int
   val ADD   : sz * machine_int * machine_int -> machine_int
   val SUB   : sz * machine_int * machine_int -> machine_int
   val MULS  : sz * machine_int * machine_int -> machine_int
   val DIVS  : div_rounding_mode *
	       sz * machine_int * machine_int -> machine_int
   val REMS  : div_rounding_mode *
	       sz * machine_int * machine_int -> machine_int

   (* unsigned operators *)
   val MULU  : sz * machine_int * machine_int -> machine_int
   val DIVU  : sz * machine_int * machine_int -> machine_int
(*
   val QUOTU : sz * machine_int * machine_int -> machine_int
*)
   val REMU  : sz * machine_int * machine_int -> machine_int

   (* Signed, trapping operators, may raise Overflow *)
   val ABST  : sz * machine_int -> machine_int
   val NEGT  : sz * machine_int -> machine_int
   val ADDT  : sz * machine_int * machine_int -> machine_int
   val SUBT  : sz * machine_int * machine_int -> machine_int
   val MULT  : sz * machine_int * machine_int -> machine_int
   val DIVT  : div_rounding_mode *
	       sz * machine_int * machine_int -> machine_int

   (* bit operators *)
   val NOTB  : sz * machine_int -> machine_int
   val ANDB  : sz * machine_int * machine_int -> machine_int
   val ORB   : sz * machine_int * machine_int -> machine_int
   val XORB  : sz * machine_int * machine_int -> machine_int
   val EQVB  : sz * machine_int * machine_int -> machine_int
   val SLL   : sz * machine_int * machine_int -> machine_int
   val SRL   : sz * machine_int * machine_int -> machine_int
   val SRA   : sz * machine_int * machine_int -> machine_int
   val BITSLICE : sz * (int * int) list * machine_int -> machine_int

   (* Other useful operators *)
   val Sll       : sz * machine_int * word -> machine_int
   val Srl       : sz * machine_int * word -> machine_int
   val Sra       : sz * machine_int * word -> machine_int
   val pow2      : int -> machine_int
   val maxOfSize : sz -> machine_int
   val minOfSize : sz -> machine_int
   val isInRange : sz * machine_int -> bool

   (* Indexing *)
   val bitOf     : sz * machine_int * int -> word        (* 0w0 or 0w1 *)
   val byteOf    : sz * machine_int * int -> word        (* 8 bits *)
   val halfOf    : sz * machine_int * int -> word        (* 16 bits *)
   val wordOf    : sz * machine_int * int -> Word32.word (* 32 bits *)

   (* type promotion *)
   val SX    : sz (* to *) * sz (* from *) * machine_int -> machine_int
   val ZX    : sz (* to *) * sz (* from *) * machine_int -> machine_int

   (* comparisions *)
   val EQ  : sz * machine_int * machine_int -> bool
   val NE  : sz * machine_int * machine_int -> bool
   val GT  : sz * machine_int * machine_int -> bool
   val GE  : sz * machine_int * machine_int -> bool
   val LT  : sz * machine_int * machine_int -> bool
   val LE  : sz * machine_int * machine_int -> bool
   val LTU : sz * machine_int * machine_int -> bool
   val GTU : sz * machine_int * machine_int -> bool
   val LEU : sz * machine_int * machine_int -> bool
   val GEU : sz * machine_int * machine_int -> bool
end