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/MLRISC/mltree/mltree-hash.sml
ViewVC logotype

Annotation of /sml/trunk/src/MLRISC/mltree/mltree-hash.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 985 - (view) (download)

1 : george 985 functor MLTreeHash
2 :     (structure T : MLTREE
3 :     (* Hashing extensions *)
4 :     val hashSext : T.hasher -> T.sext -> word
5 :     val hashRext : T.hasher -> T.rext -> word
6 :     val hashFext : T.hasher -> T.fext -> word
7 :     val hashCCext : T.hasher -> T.ccext -> word
8 :     ) : MLTREE_HASH =
9 :     struct
10 :     structure T = T
11 :     structure I = T.I
12 :     structure Constant = T.Constant
13 :     structure B = T.Basis
14 :     structure C = CellsBasis
15 :     structure W = Word
16 :    
17 :     val w = W.fromInt
18 :     val i2s = Int.toString
19 :     val toLower = String.map Char.toLower
20 :    
21 :     fun error msg = MLRiscErrorMsg.error("LabelExp",msg)
22 :     fun wv(C.CELL{id, ...}) = w id
23 :     fun wvs is =
24 :     let fun f([],h) = h
25 :     | f(i::is,h) = f(is,wv i+h)
26 :     in f(is,0w0) end
27 :    
28 :     (*
29 :     * Hashing
30 :     *)
31 :     val hashLabel = Label.hash
32 :     fun hasher() = {stm=hashStm, rexp=hashRexp, fexp=hashFexp, ccexp=hashCCexp}
33 :     and hashCtrl ctrl = wv ctrl
34 :     and hashStm stm =
35 :     case stm of
36 :     T.MV(t,dst,rexp) => 0w123 + w t + wv dst + hashRexp rexp
37 :     | T.CCMV(dst,ccexp) => 0w1234 + wv dst + hashCCexp ccexp
38 :     | T.FMV(fty,dst,fexp) => 0w12345 + w fty + wv dst + hashFexp fexp
39 :     | T.COPY(ty,dst,src) => 0w234 + w ty + wvs dst + wvs src
40 :     | T.FCOPY(fty,dst,src) => 0w456 + w fty + wvs dst + wvs src
41 :     | T.JMP(ea,labels) => 0w45 + hashRexp ea
42 :     | T.CALL{funct,targets,defs,uses,region,pops} =>
43 :     hashRexp funct + hashMlriscs defs + hashMlriscs uses
44 :     | T.RET _ => 0w567
45 :     | T.STORE(ty,ea,data,mem) => 0w888 + w ty + hashRexp ea + hashRexp data
46 :     | T.FSTORE(fty,ea,data,mem) => 0w7890 + w fty + hashRexp ea + hashFexp data
47 :     | T.BCC(a,lab) => 0w233 + hashCCexp a + hashLabel lab
48 :     | T.IF(a,b,c) => 0w233 + hashCCexp a + hashStm b + hashStm c
49 :     | T.ANNOTATION(stm, a) => hashStm stm
50 :     | T.PHI{preds,block} => w block
51 :     | T.SOURCE => 0w123
52 :     | T.SINK => 0w423
53 :     | T.REGION(stm,ctrl) => hashStm stm + hashCtrl ctrl
54 :     | T.RTL{hash,...} => hash
55 :     | T.SEQ ss => hashStms(ss, 0w23)
56 :     | T.ASSIGN(ty,lhs,rhs) => w ty + hashRexp lhs + hashRexp rhs
57 :     | _ => error "hashStm"
58 :    
59 :     and hashStms([],h) = h
60 :     | hashStms(s::ss,h) = hashStms(ss,hashStm s + h)
61 :    
62 :     and hashMlrisc(T.CCR ccexp) = hashCCexp ccexp
63 :     | hashMlrisc(T.GPR rexp) = hashRexp rexp
64 :     | hashMlrisc(T.FPR fexp) = hashFexp fexp
65 :    
66 :     and hashMlriscs [] = 0w123
67 :     | hashMlriscs(m::ms) = hashMlrisc m + hashMlriscs ms
68 :    
69 :     and hash2(ty,x,y) = w ty + hashRexp x + hashRexp y
70 :    
71 :     and hashRexp rexp =
72 :     case rexp
73 :     of T.REG(ty, src) => w ty + wv src
74 :     | T.LI i => I.hash i
75 :     | T.LABEL l => hashLabel l
76 :     | T.LABEXP le => hashRexp rexp
77 :     | T.CONST c => Constant.hash c
78 :     | T.NEG(ty, x) => w ty + hashRexp x + 0w24
79 :     | T.ADD x => hash2 x + 0w234
80 :     | T.SUB x => hash2 x + 0w456
81 :     | T.MULS x => hash2 x + 0w2131
82 :     | T.DIVS x => hash2 x + 0w156
83 :     | T.QUOTS x => hash2 x + 0w1565
84 :     | T.REMS x => hash2 x + 0w231
85 :     | T.MULU x => hash2 x + 0w123
86 :     | T.DIVU x => hash2 x + 0w1234
87 :     | T.REMU x => hash2 x + 0w211
88 :     | T.NEGT(ty, x) => w ty + hashRexp x + 0w1224
89 :     | T.ADDT x => hash2 x + 0w1219
90 :     | T.SUBT x => hash2 x + 0w999
91 :     | T.MULT x => hash2 x + 0w7887
92 :     | T.DIVT x => hash2 x + 0w88884
93 :     | T.QUOTT x => hash2 x + 0w8884
94 :     | T.REMT x => hash2 x + 0w99
95 :     | T.ANDB x => hash2 x + 0w12312
96 :     | T.ORB x => hash2 x + 0w558
97 :     | T.XORB x => hash2 x + 0w234
98 :     | T.EQVB x => hash2 x + 0w734
99 :     | T.NOTB(ty, x) => w ty + hashRexp x
100 :     | T.SRA x => hash2 x + 0w874
101 :     | T.SRL x => hash2 x + 0w223
102 :     | T.SLL x => hash2 x + 0w499
103 :     | T.COND(ty,e,e1,e2) => w ty + hashCCexp e + hashRexp e1 + hashRexp e2
104 :     | T.SX(ty, ty', rexp) => 0w232 + w ty + w ty' + hashRexp rexp
105 :     | T.ZX(ty, ty', rexp) => 0w737 + w ty + w ty' + hashRexp rexp
106 :     | T.CVTF2I(ty, round, ty', fexp) =>
107 :     w ty + B.hashRoundingMode round + w ty' + hashFexp fexp
108 :     | T.LOAD(ty, ea, mem) => w ty + hashRexp ea + 0w342
109 :     | T.LET(stm, rexp) => hashStm stm + hashRexp rexp
110 :     | T.PRED(e, ctrl) => hashRexp e + hashCtrl ctrl
111 :     | T.MARK(e, _) => hashRexp e
112 :     | T.REXT(ty, rext) => w ty + hashRext (hasher()) rext
113 :     | T.??? => 0w485
114 :     | T.OP(ty,oper,es) => hashRexps(es, w ty + hashOper oper)
115 :     | T.ARG _ => 0w23
116 :     | T.$(ty, k, e) => w ty + hashRexp e
117 :     | T.PARAM n => w n
118 :     | T.BITSLICE(ty, sl, e) => w ty + hashRexp e
119 :    
120 :     and hashOper(T.OPER{hash, ...}) = hash
121 :    
122 :     and hashRexps([],h) = h
123 :     | hashRexps(e::es,h) = hashRexps(es,hashRexp e + h)
124 :    
125 :     and hash2'(ty,x,y) = w ty + hashFexp x + hashFexp y
126 :    
127 :     and hashFexp fexp =
128 :     case fexp of
129 :     T.FREG(fty, src) => w fty + wv src
130 :     | T.FLOAD(fty, ea, mem) => w fty + hashRexp ea
131 :     | T.FADD x => hash2' x + 0w123
132 :     | T.FMUL x => hash2' x + 0w1234
133 :     | T.FSUB x => hash2' x + 0w12345
134 :     | T.FDIV x => hash2' x + 0w234
135 :     | T.FCOPYSIGN x => hash2' x + 0w883
136 :     | T.FCOND(fty,c,x,y) => w fty + hashCCexp c + hashFexp x + hashFexp y
137 :     | T.FABS(fty, fexp) => w fty + hashFexp fexp + 0w2345
138 :     | T.FNEG(fty, fexp) => w fty + hashFexp fexp + 0w23456
139 :     | T.FSQRT(fty, fexp) => w fty + hashFexp fexp + 0w345
140 :     | T.CVTI2F(fty, ty, rexp) => w fty + w ty + hashRexp rexp
141 :     | T.CVTF2F(fty, fty', fexp) => w fty + hashFexp fexp + w fty'
142 :     | T.FMARK(e, _) => hashFexp e
143 :     | T.FPRED(e, ctrl) => hashFexp e + hashCtrl ctrl
144 :     | T.FEXT(fty, fext) => w fty + hashFext (hasher()) fext
145 :    
146 :     and hashFexps([],h) = h
147 :     | hashFexps(e::es,h) = hashFexps(es,hashFexp e + h)
148 :    
149 :     and hashCCexp ccexp =
150 :     case ccexp of
151 :     T.CC(cc, src) => B.hashCond cc + wv src
152 :     | T.FCC(fcc, src) => B.hashFcond fcc + wv src
153 :     | T.CMP(ty, cond, x, y) =>
154 :     w ty + B.hashCond cond + hashRexp x + hashRexp y
155 :     | T.FCMP(fty, fcond, x, y) =>
156 :     w fty + B.hashFcond fcond + hashFexp x + hashFexp y
157 :     | T.NOT x => 0w2321 + hashCCexp x
158 :     | T.AND(x,y) => 0w2321 + hashCCexp x + hashCCexp y
159 :     | T.OR(x,y) => 0w8721 + hashCCexp x + hashCCexp y
160 :     | T.XOR(x,y) => 0w6178 + hashCCexp x + hashCCexp y
161 :     | T.EQV(x,y) => 0w178 + hashCCexp x + hashCCexp y
162 :     | T.TRUE => 0w0
163 :     | T.FALSE => 0w1232
164 :     | T.CCMARK(e, _) => hashCCexp e
165 :     | T.CCEXT(ty,ccext) => w ty + hashCCext (hasher()) ccext
166 :    
167 :     and hashCCexps([],h) = h
168 :     | hashCCexps(e::es,h) = hashCCexps(es,hashCCexp e + h)
169 :    
170 :    
171 :     val hash = hashRexp
172 :     end

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