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 657 - (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 :     structure HA = HashArray
10 :     structure HT = HashTable
11 :    
12 :     type value = int
13 :    
14 :     datatype const =
15 :     IMMED of int (* integer operand *)
16 :     | OPERAND of I.operand (* other operand *)
17 : leunga 641 (*| LABEL of Label.label*) (* a label *)
18 : leunga 591
19 :     datatype operandTable =
20 :     TABLE of
21 :     { immTable : value HA.array,
22 : leunga 641 (*labelTable : (Label.label,value) HT.hash_table,*)
23 : leunga 591 opnTable : (I.operand,value) HT.hash_table,
24 :     constTable : const HA.array,
25 :     nextImmed : int ref
26 :     }
27 :    
28 :     exception NoLabel
29 :     exception NoOperand
30 :     exception NoConst
31 :    
32 :     fun create(nextImmed) =
33 :     let val constTable = HA.array'(37, fn _ => raise NoConst)
34 :     fun newImmed i =
35 :     let val v = !nextImmed
36 :     in nextImmed := v - 1;
37 :     HA.update(constTable, v, IMMED i);
38 :     v
39 :     end
40 :     fun hashLabel(Label.Label{id,...}) = Word.fromInt id
41 :     fun eqLabel(Label.Label{id=x,...},Label.Label{id=y,...}) = x=y
42 :     val immTable = HA.array''(37,newImmed)
43 :     val opnTable = HT.mkTable(Props.hashOpn,Props.eqOpn) (32,NoOperand)
44 : leunga 641 (*val labelTable = HT.mkTable(hashLabel,eqLabel) (32,NoLabel)*)
45 : leunga 657 fun init(n,m) = if n > m then () else (newImmed n; init(n+1,m))
46 :     in init(0,2);
47 :     TABLE{ immTable = immTable,
48 : leunga 641 (*labelTable = labelTable,*)
49 : leunga 591 opnTable = opnTable,
50 :     constTable = constTable,
51 :     nextImmed = nextImmed
52 :     }
53 :     end
54 :    
55 :    
56 :     (* Lookup/insert an immediate constant *)
57 :     fun immed(TABLE{immTable, ...}) i = HA.sub(immTable,i)
58 :    
59 :     (* lookup/insert a label *)
60 : leunga 641 (*fun label(TABLE{labelTable,constTable,nextImmed,...}) =
61 : leunga 591 let val look = HT.lookup labelTable
62 :     val ins = HT.insert labelTable
63 :     fun lookup l = look l handle NoLabel =>
64 :     let val v = !nextImmed
65 :     val _ = nextImmed := v - 1
66 :     in HA.update(constTable,v,LABEL l); ins(l,v); v end
67 : leunga 641 in lookup end
68 :     *)
69 : leunga 591
70 :     (* lookup/insert an operand *)
71 :     fun operand(TABLE{opnTable,constTable,nextImmed,...}) =
72 :     let val look = HT.lookup opnTable
73 :     val ins = HT.insert opnTable
74 :     fun lookup opn = look opn handle NoOperand =>
75 :     let val v = !nextImmed
76 :     val _ = nextImmed := v - 1
77 :     in HA.update(constTable,v,OPERAND opn); ins(opn,v); v end
78 :     in lookup end
79 :    
80 :     (* lookup a constant/operand *)
81 :     fun const(TABLE{constTable,...}) v = HA.sub(constTable,v)
82 :    
83 :     end

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