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 /MLRISC/trunk/mltree/operand-table.sml
ViewVC logotype

Annotation of /MLRISC/trunk/mltree/operand-table.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 744 - (view) (download)
Original Path: sml/trunk/src/MLRISC/mltree/operand-table.sml

1 : leunga 591 (*
2 :     * A table for storing operands for a compilation unit.
3 :     * We give each distinct operand a unique (negative) value number.
4 :     *)
5 :     functor OperandTable(Props : INSN_PROPERTIES) : OPERAND_TABLE =
6 :     struct
7 :    
8 :     structure I = Props.I
9 : leunga 744 structure IH = IntHashTable
10 :     structure H = HashTable
11 : leunga 591
12 :     type value = int
13 :    
14 :     datatype const =
15 : leunga 744 INT of int (* small integer operands *)
16 :     | INTINF of IntInf.int (* large integer operands *)
17 :     | OPERAND of I.operand (* other operand *)
18 : leunga 591
19 :     datatype operandTable =
20 :     TABLE of
21 : leunga 744 { intTable : value IH.hash_table,
22 :     miTable : (IntInf.int,value) H.hash_table,
23 :     opnTable : (I.operand,value) H.hash_table,
24 :     constTable : const IH.hash_table, (*value number -> const*)
25 :     nextValueNumber : value ref
26 : leunga 591 }
27 : leunga 744
28 :     type valueNumber =
29 :     { int : int -> value,
30 :     word : word -> value,
31 :     int32 : Int32.int -> value,
32 :     word32 : Word32.word -> value,
33 :     intinf : IntInf.int -> value,
34 :     operand : I.operand -> value
35 :     }
36 :    
37 : leunga 591 exception NoOperand
38 :     exception NoConst
39 : leunga 744 exception NoInt
40 :     exception NoIntInf
41 : leunga 591
42 : leunga 744 val two_to_the_31 = IntInf.pow(IntInf.fromInt 2,31)
43 :     fun hashIntInf i = Word.fromInt(IntInf.toInt(IntInf.rem(i,two_to_the_31)))
44 :    
45 :     fun create(nextValueNumber) =
46 :     let val constTable = IH.mkTable (37,NoConst)
47 :     val opnTable = H.mkTable(Props.hashOpn,Props.eqOpn) (32,NoOperand)
48 :     val intTable = IH.mkTable (32, NoInt)
49 :     val miTable = H.mkTable(hashIntInf,op =) (7, NoIntInf)
50 :    
51 :     fun newInt i =
52 :     let val v = !nextValueNumber (* value number *)
53 :     in nextValueNumber := v - 1;
54 :     IH.insert intTable (i,v);
55 :     IH.insert constTable (v, INT i);
56 : leunga 591 v
57 :     end
58 : leunga 744
59 :     fun init(n,0) = ()
60 :     | init(n,m) = (newInt n; init(n+1,m-1))
61 :    
62 : leunga 657 in init(0,2);
63 : leunga 744 TABLE{ intTable = intTable,
64 :     miTable = miTable,
65 :     opnTable = opnTable,
66 :     constTable = constTable,
67 :     nextValueNumber = nextValueNumber
68 : leunga 591 }
69 :     end
70 :    
71 : leunga 744 fun wordToIntInf w = IntInf.fromInt(Word.toIntX w)
72 :     fun word32ToIntInf w = IntInf.fromLarge(Word32.toLargeIntX w)
73 :     fun wordToInt w = Word.toIntX w
74 :     fun word32ToInt w = Word32.toIntX w
75 :     fun intInfToInt i = IntInf.toInt i
76 :     fun intInfToInt32 i = IntInf.toLarge i
77 :     fun intToIntInf i = IntInf.fromInt i
78 :     fun intToInt32 i = Int32.fromInt i
79 :     fun int32ToIntInf i = IntInf.fromLarge i
80 :     fun int32ToInt i = Int32.toInt i
81 :    
82 :     (* Lookup the value number of a constant *)
83 :     fun int(TABLE{intTable, ...}) = IH.lookup intTable
84 : leunga 591
85 : leunga 744 fun word(TABLE{intTable, ...}) w = IH.lookup intTable (wordToInt w)
86 : leunga 591
87 : leunga 744 fun word32(TABLE{intTable, miTable, ...}) w =
88 :     IH.lookup intTable (word32ToInt w) handle Overflow =>
89 :     H.lookup miTable (word32ToIntInf w)
90 : leunga 591
91 : leunga 744 fun int32(TABLE{intTable, miTable, ...}) w =
92 :     IH.lookup intTable (int32ToInt w) handle Overflow =>
93 :     H.lookup miTable (int32ToIntInf w)
94 : leunga 591
95 : leunga 744 fun intinf(TABLE{intTable, miTable, ...}) i =
96 :     IH.lookup intTable (intInfToInt i) handle Overflow =>
97 :     H.lookup miTable i
98 :    
99 :     fun operand(TABLE{opnTable,...}) = H.lookup opnTable
100 :    
101 :     fun lookupValueNumbers tbl =
102 :     { int = int tbl,
103 :     word = word tbl,
104 :     word32 = word32 tbl,
105 :     int32 = int32 tbl,
106 :     intinf = intinf tbl,
107 :     operand = operand tbl
108 :     }
109 :    
110 :     (* create new value numebers *)
111 :     fun makeNewValueNumbers(TABLE{opnTable,constTable,
112 :     nextValueNumber,intTable,miTable,...}) =
113 :     let val findOpn = H.find opnTable
114 :     val findInt = IH.find intTable
115 :     val findIntInf = H.find miTable
116 :     val insertOpn = H.insert opnTable
117 :     val insertInt = IH.insert intTable
118 :     val insertIntInf = H.insert miTable
119 :     val insertConst = IH.insert constTable
120 :    
121 :     fun newConst(const) =
122 :     let val v = !nextValueNumber
123 :     val _ = nextValueNumber := v - 1
124 :     in insertConst (v,const); v
125 :     end
126 :    
127 :     fun mkOpn opn =
128 :     case findOpn opn of
129 :     SOME v => v
130 :     | NONE => let val v = newConst(OPERAND opn)
131 :     in insertOpn(opn, v); v end
132 :     fun mkInt i =
133 :     case findInt i of
134 :     SOME v => v
135 :     | NONE => let val v = newConst(INT i)
136 :     in insertInt(i, v); v end
137 :    
138 :     fun mkIntInf' i =
139 :     case findIntInf i of
140 :     SOME v => v
141 :     | NONE => let val v = newConst(INTINF i)
142 :     in insertIntInf(i, v); v end
143 :    
144 :     fun mkIntInf i = mkInt(intInfToInt i) handle _ => mkIntInf' i
145 :    
146 :     fun mkWord w = mkInt(wordToInt w)
147 :    
148 :     fun mkInt32 i = mkInt(int32ToInt i)
149 :     handle _ => mkIntInf'(int32ToIntInf i)
150 :    
151 :     fun mkWord32 w = mkInt(word32ToInt w)
152 :     handle _ => mkIntInf'(word32ToIntInf w)
153 :     in {int=mkInt,
154 :     word=mkWord,
155 :     word32=mkWord32,
156 :     int32=mkInt32,
157 :     intinf=mkIntInf,
158 :     operand=mkOpn
159 :     }
160 :     end
161 :    
162 :     (* value number -> const *)
163 :     fun const(TABLE{constTable,...}) = IH.lookup constTable
164 :    
165 : leunga 591 end

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