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 409 - (view) (download)

1 : monnier 409 (* labelExp.sml -- expressions involving labels
2 :     *
3 :     * COPYRIGHT (c) 1995 AT&T Bell Laboratories.
4 :     *
5 :     *)
6 :     signature LABELEXP = sig
7 :     datatype labexp =
8 :     LABEL of Label.label
9 :     | CONST of int
10 :     | PLUS of labexp * labexp
11 :     | MINUS of labexp * labexp
12 :     | MULT of labexp * labexp
13 :     | DIV of labexp * labexp
14 :     | LSHIFT of labexp * word
15 :     | RSHIFT of labexp * word
16 :     | AND of labexp * word
17 :     | OR of labexp * word
18 :    
19 :     val valueOf : labexp -> int
20 :     val toString : labexp -> string
21 :     val hash : labexp -> word
22 :     val == : labexp * labexp -> bool
23 :     end
24 :    
25 :     structure LabelExp = struct
26 :     datatype labexp =
27 :     LABEL of Label.label
28 :     | CONST of int
29 :     | PLUS of labexp * labexp
30 :     | MINUS of labexp * labexp
31 :     | MULT of labexp * labexp
32 :     | DIV of labexp * labexp
33 :     | LSHIFT of labexp * word
34 :     | RSHIFT of labexp * word
35 :     | AND of labexp * word
36 :     | OR of labexp * word
37 :    
38 :     val itow = Word.fromInt
39 :     val wtoi = Word.toIntX
40 :    
41 :     fun valueOf(LABEL lab) = Label.addrOf lab
42 :     | valueOf(CONST i) = i
43 :     | valueOf(PLUS(lexp1, lexp2)) = valueOf(lexp1) + valueOf(lexp2)
44 :     | valueOf(MINUS(lexp1, lexp2)) = valueOf(lexp1) - valueOf(lexp2)
45 :     | valueOf(MULT(lexp1, lexp2)) = valueOf(lexp1) * valueOf(lexp2)
46 :     | valueOf(DIV(lexp1, lexp2)) = valueOf(lexp1) div valueOf(lexp2)
47 :     | valueOf(LSHIFT(lexp, cnt)) = wtoi(Word.<<(wValueOf lexp, cnt))
48 :     | valueOf(RSHIFT(lexp, cnt)) = wtoi(Word.>>(wValueOf lexp, cnt))
49 :     | valueOf(AND(lexp, mask)) = wtoi(Word.andb(wValueOf lexp, mask))
50 :     | valueOf(OR(lexp, mask)) = wtoi(Word.orb(wValueOf lexp, mask))
51 :    
52 :     and wValueOf lexp = itow(valueOf lexp)
53 :    
54 :     (* This module should be parameterised, in order to generate
55 :     * target label expressions for assembly code purposes.
56 :     *)
57 :     fun parenthesize str = "(" ^ str ^ ")"
58 :    
59 :     fun pToString(lexp as LABEL _) = toString lexp
60 :     | pToString(lexp as CONST _) = toString lexp
61 :     | pToString lexp = parenthesize(toString lexp)
62 :    
63 :     and toString(LABEL lab) = Label.nameOf lab
64 :     | toString(CONST i) = if i < 0 then "-"^Int.toString(~i) else Int.toString i
65 :     | toString(PLUS(lexp1, lexp2)) = pToString lexp1 ^ "+" ^ pToString lexp2
66 :     | toString(MINUS(lexp1, lexp2)) = pToString lexp1 ^ "-" ^ pToString lexp2
67 :     | toString(MULT(lexp1, lexp2)) = pToString lexp1 ^ "*" ^ pToString lexp2
68 :     | toString(DIV(lexp1, lexp2)) = pToString lexp1 ^ "/" ^ pToString lexp2
69 :     | toString(LSHIFT(lexp, cnt)) = pToString lexp ^ "<<" ^ Word.toString cnt
70 :     | toString(RSHIFT(lexp, cnt)) = pToString lexp ^ ">>" ^ Word.toString cnt
71 :     | toString(AND(lexp, mask)) = pToString lexp ^ "&" ^ Word.toString mask
72 :     | toString(OR(lexp, mask)) = pToString lexp ^ "|" ^ Word.toString mask
73 :    
74 :     fun hash(LABEL(Label.Label{id,...})) = Word.fromInt id
75 :     | hash(CONST i) = Word.fromInt i
76 :     | hash(PLUS(a,b)) = hash a + hash b + 0w12311
77 :     | hash(MINUS(a,b)) = 0w1232 + hash a + hash b + 0w8834
78 :     | hash(MULT(a,b)) = 0w123123 + hash a + hash b + 0w1714
79 :     | hash(DIV(a,b)) = hash a + hash b + 0w1999
80 :     | hash(LSHIFT(a,c)) = hash a + c + 0w1333
81 :     | hash(RSHIFT(a,c)) = hash a + c + 0w6788
82 :     | hash(AND(a,m)) = hash a + m + 0w444
83 :     | hash(OR(a,m)) = hash a + m + 0w777
84 :    
85 :     fun ==(LABEL(Label.Label{id=x,...}),LABEL(Label.Label{id=y,...})) = x = y
86 :     | ==(CONST i,CONST j) = i = j
87 :     | ==(PLUS(a,b),PLUS(c,d)) = ==(a,b) andalso ==(c,d)
88 :     | ==(MINUS(a,b),MINUS(c,d)) = ==(a,b) andalso ==(c,d)
89 :     | ==(MULT(a,b),MULT(c,d)) = ==(a,b) andalso ==(c,d)
90 :     | ==(DIV(a,b),DIV(c,d)) = ==(a,b) andalso ==(c,d)
91 :     | ==(LSHIFT(a,b),LSHIFT(c,d)) = b = d andalso ==(a,c)
92 :     | ==(RSHIFT(a,b),RSHIFT(c,d)) = b = d andalso ==(a,c)
93 :     | ==(AND(a,b),AND(c,d)) = b = d andalso ==(a,c)
94 :     | ==(OR(a,b),OR(c,d)) = b = d andalso ==(a,c)
95 :     | == _ = false
96 :     end

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