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

Annotation of /sml/trunk/src/MLRISC/instructions/labelExp.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 640 - (view) (download)

1 : monnier 409 (* labelExp.sml -- expressions involving labels
2 :     *
3 :     * COPYRIGHT (c) 1995 AT&T Bell Laboratories.
4 :     *
5 :     *)
6 : george 545 signature LABELEXP =
7 :     sig
8 :     structure Constant : CONSTANT
9 : monnier 409 datatype labexp =
10 :     LABEL of Label.label
11 : george 545 | CONST of Constant.const
12 :     | INT of int
13 : monnier 409 | PLUS of labexp * labexp
14 :     | MINUS of labexp * labexp
15 :     | MULT of labexp * labexp
16 :     | DIV of labexp * labexp
17 :     | LSHIFT of labexp * word
18 :     | RSHIFT of labexp * word
19 :     | AND of labexp * word
20 :     | OR of labexp * word
21 :    
22 :     val valueOf : labexp -> int
23 :     val toString : labexp -> string
24 :     val hash : labexp -> word
25 :     val == : labexp * labexp -> bool
26 :     end
27 :    
28 : george 545 functor LabelExp(Constant : CONSTANT) = struct
29 :     structure Constant = Constant
30 : monnier 409 datatype labexp =
31 :     LABEL of Label.label
32 : george 545 | CONST of Constant.const
33 :     | INT of int
34 : monnier 409 | PLUS of labexp * labexp
35 :     | MINUS of labexp * labexp
36 :     | MULT of labexp * labexp
37 :     | DIV of labexp * labexp
38 :     | LSHIFT of labexp * word
39 :     | RSHIFT of labexp * word
40 :     | AND of labexp * word
41 :     | OR of labexp * word
42 :    
43 :     val itow = Word.fromInt
44 :     val wtoi = Word.toIntX
45 :    
46 : leunga 593 val resolveConstants = MLRiscControl.getFlag "asm-resolve-constants"
47 :     val _ = resolveConstants := true
48 :    
49 :     fun prInt i = if i < 0 then "-"^Int.toString(~i) else Int.toString i
50 :    
51 : monnier 409 fun valueOf(LABEL lab) = Label.addrOf lab
52 : george 545 | valueOf(CONST c) = Constant.valueOf c
53 :     | valueOf(INT i) = i
54 : monnier 409 | valueOf(PLUS(lexp1, lexp2)) = valueOf(lexp1) + valueOf(lexp2)
55 :     | valueOf(MINUS(lexp1, lexp2)) = valueOf(lexp1) - valueOf(lexp2)
56 :     | valueOf(MULT(lexp1, lexp2)) = valueOf(lexp1) * valueOf(lexp2)
57 :     | valueOf(DIV(lexp1, lexp2)) = valueOf(lexp1) div valueOf(lexp2)
58 :     | valueOf(LSHIFT(lexp, cnt)) = wtoi(Word.<<(wValueOf lexp, cnt))
59 :     | valueOf(RSHIFT(lexp, cnt)) = wtoi(Word.>>(wValueOf lexp, cnt))
60 :     | valueOf(AND(lexp, mask)) = wtoi(Word.andb(wValueOf lexp, mask))
61 :     | valueOf(OR(lexp, mask)) = wtoi(Word.orb(wValueOf lexp, mask))
62 :    
63 :     and wValueOf lexp = itow(valueOf lexp)
64 :    
65 :     (* This module should be parameterised, in order to generate
66 :     * target label expressions for assembly code purposes.
67 :     *)
68 : leunga 640 (* operator precedences:
69 :     (Note: these differ from C's precedences)
70 :     2 MULT, DIV, LSHIFT, RSHIFT
71 :     1 AND, OR
72 :     0 PLUS, MINUS
73 :     *)
74 : monnier 409
75 : leunga 640 fun parens (str, prec, op_prec) =
76 :     if prec > op_prec then "(" ^ str ^ ")" else str
77 : monnier 409
78 : leunga 640 and toString le = toStr(le, 0)
79 :    
80 :     and toStr(LABEL lab, _) = Label.nameOf lab
81 :     | toStr(CONST c, _) =
82 : leunga 593 if !resolveConstants then prInt(Constant.valueOf c)
83 :     else Constant.toString c
84 : leunga 640 | toStr(INT i, _) = prInt i
85 :     | toStr(MULT(lexp1, lexp2), _) = toStr(lexp1, 2) ^ "*" ^ toStr(lexp2,2)
86 :     | toStr(DIV(lexp1, lexp2), _) = toStr(lexp1, 2) ^ "/" ^ toStr(lexp2,2)
87 :     | toStr(LSHIFT(lexp, cnt), prec) = toStr(lexp,2) ^ "<<" ^ Word.toString cnt
88 :     | toStr(RSHIFT(lexp, cnt), prec) = toStr(lexp,2) ^ ">>" ^ Word.toString cnt
89 :     | toStr(AND(lexp, mask), prec) =
90 :     parens(toStr(lexp,1) ^ "&" ^ Word.toString mask, prec, 1)
91 :     | toStr(OR(lexp, mask), prec) =
92 :     parens(toStr(lexp, 1) ^ "|" ^ Word.toString mask, prec, 1)
93 :     | toStr(PLUS(lexp1, lexp2), prec) =
94 :     parens(toStr(lexp1, 0) ^ "+" ^ toStr(lexp2, 0), prec, 0)
95 :     | toStr(MINUS(lexp1, lexp2), prec) =
96 :     parens(toStr(lexp1, 0) ^ "-" ^ toStr(lexp2, 0), prec, 0)
97 : monnier 409
98 : leunga 640
99 : monnier 409 fun hash(LABEL(Label.Label{id,...})) = Word.fromInt id
100 : george 545 | hash(INT i) = Word.fromInt i
101 :     | hash(CONST c) = Constant.hash c
102 : monnier 409 | hash(PLUS(a,b)) = hash a + hash b + 0w12311
103 :     | hash(MINUS(a,b)) = 0w1232 + hash a + hash b + 0w8834
104 :     | hash(MULT(a,b)) = 0w123123 + hash a + hash b + 0w1714
105 :     | hash(DIV(a,b)) = hash a + hash b + 0w1999
106 :     | hash(LSHIFT(a,c)) = hash a + c + 0w1333
107 :     | hash(RSHIFT(a,c)) = hash a + c + 0w6788
108 :     | hash(AND(a,m)) = hash a + m + 0w444
109 :     | hash(OR(a,m)) = hash a + m + 0w777
110 :    
111 :     fun ==(LABEL(Label.Label{id=x,...}),LABEL(Label.Label{id=y,...})) = x = y
112 : george 545 | ==(INT i,INT j) = i = j
113 :     | ==(CONST c,CONST c') = Constant.==(c,c')
114 : monnier 409 | ==(PLUS(a,b),PLUS(c,d)) = ==(a,b) andalso ==(c,d)
115 :     | ==(MINUS(a,b),MINUS(c,d)) = ==(a,b) andalso ==(c,d)
116 :     | ==(MULT(a,b),MULT(c,d)) = ==(a,b) andalso ==(c,d)
117 :     | ==(DIV(a,b),DIV(c,d)) = ==(a,b) andalso ==(c,d)
118 :     | ==(LSHIFT(a,b),LSHIFT(c,d)) = b = d andalso ==(a,c)
119 :     | ==(RSHIFT(a,b),RSHIFT(c,d)) = b = d andalso ==(a,c)
120 :     | ==(AND(a,b),AND(c,d)) = b = d andalso ==(a,c)
121 :     | ==(OR(a,b),OR(c,d)) = b = d andalso ==(a,c)
122 :     | == _ = false
123 :     end

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