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/compiler/OldCGen/mips/mipsinstr.sml
ViewVC logotype

Annotation of /sml/trunk/src/compiler/OldCGen/mips/mipsinstr.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 16 - (view) (download)

1 : monnier 16 (* mipsinstr.sml
2 :     *
3 :     * COPYRIGHT (c) 1996 Bell Laboratories.
4 :     *
5 :     *)
6 :    
7 :     structure MipsInstrSet =
8 :     struct
9 :    
10 :     val error = ErrorMsg.impossible
11 :    
12 :     datatype 'label info = INFO of {addrOf: 'label -> int,
13 :     nameOf: 'label->string}
14 :     (*
15 :     * satisfy ea requirements of cmachine
16 :     *)
17 :     datatype register_rep = Reg' of int | Freg' of int
18 :     abstype register = REGISTER of int
19 :     with
20 :     fun Reg i = REGISTER i
21 :     fun Freg i = REGISTER(i+32)
22 :     fun reg_rep (REGISTER i) = if i<32 then Reg' i else Freg' (i-32)
23 :     fun reg_eq(REGISTER r, REGISTER s) = r=s
24 :     end
25 :    
26 :     datatype 'label EA = Direct of register
27 :     | Immed of int
28 :     | ImmedLab of 'label
29 :     | Immed32 of Word32.word
30 :    
31 :     val baseReg = Reg 24
32 :     val limitReg = Reg 19
33 :     val heapExhaustedReg = Reg 21
34 :     val maskReg = Reg 25
35 :     val allocReg = Reg 23
36 :     val exnptrReg = Reg 30
37 :     val linkReg = Reg 31
38 :    
39 :     datatype 'label sdi
40 :     = SETBASEADDR of 'label * register
41 :     | LOADADDR of register * 'label * int
42 :     | LOAD of register * 'label * int
43 :     | LOADF of register * 'label * int * register
44 :     | BRANCH of bool * register * register * 'label * register * 'label
45 :     | BRANCH_COP1 of bool * 'label * register * 'label
46 :    
47 :     val constBaseRegOffset = 32764
48 :    
49 :     (* satisfy operand requirements of mips instruction set.
50 :     * memOpnd should require no more than 16 bits when computed.
51 :     *)
52 :     datatype 'label signedlabel = POSLAB of 'label | NEGLAB of 'label
53 :     type 'label labexp = 'label signedlabel * int
54 :     datatype 'label arithOpnd = Immed16Op of int
55 :     | RegOp of register
56 :     | LabelOp of 'label labexp
57 :     | HiLabOp of 'label labexp
58 :     | LoLabOp of 'label labexp
59 :    
60 :     datatype 'label memOpnd = Immed16Off of int
61 :     | LabOff of 'label labexp
62 :     | HiLabOff of 'label labexp
63 :     | LoLabOff of 'label labexp
64 :    
65 :     datatype int5 = Int5 of int
66 :    
67 :     datatype fcond = UN (* ? *)
68 :     | EQ (* = *)
69 :     | UEQ (* ?= *)
70 :     | OLT (* NOT ?>= *)
71 :     | ULT (* ?< *)
72 :     | OLE (* NOT ?> *)
73 :     | ULE (* ?<= *)
74 :     | NGLE (* NOT <=> *)
75 :     | NGL (* NOT <> *)
76 :     | LT (* < *)
77 :     | NGE (* NOT >= *)
78 :     | LE (* <= *)
79 :     | NGT (* NOT > *)
80 :    
81 :     fun split i = let
82 :     val hi = Word.~>>(Word.fromInt i, 0w16)
83 :     val lo = Word.andb(Word.fromInt i, 0w65535)
84 :     in
85 :     if lo < 0w32768 then (hi,lo) else (hi+0w1, lo-0w65536)
86 :     end
87 :    
88 :     fun chk_immed16 n = let
89 :     exception Immed16
90 :     in if n>= ~32768 andalso n<=65535 then Word.fromInt n
91 :     else (app Control.Print.say
92 :     ["Immed16 constant too large ", Int.toString n, "\n"];
93 :     raise Immed16)
94 :     end
95 :    
96 :     fun labelValue (INFO{addrOf,...}) (POSLAB lab,k) = k + addrOf lab
97 :     | labelValue (INFO{addrOf,...}) (NEGLAB lab,k) = k - addrOf lab
98 :    
99 :     fun hiLabelValue info labexp = #1 (split (labelValue info labexp))
100 :     fun loLabelValue info labexp = #2 (split (labelValue info labexp))
101 :    
102 :     fun labBranchOff info (LabOff labexp) = let
103 :     exception BranchOffset
104 :     val labOff = labelValue info labexp
105 :     in
106 :     if labOff mod 4 <> 0 then raise BranchOffset
107 :     else labOff div 4
108 :     end
109 :     | labBranchOff _ _ = error "MipsInstrSet.labBranchOff: bad label"
110 :    
111 :     datatype 'label instruction
112 :     = NOP
113 :    
114 :     (*
115 :     * compare instructions:
116 :     *)
117 :     | SLT of register * register * 'label arithOpnd
118 :     | SLTU of register * register * 'label arithOpnd
119 :     | FCMP of fcond * register * register
120 :    
121 :     (*
122 :     * branch instructions.
123 :     * This list is incomplete as the other branch instructions
124 :     * are all span dependent.
125 :     *)
126 :     | JUMP of register
127 :     | BEQ of bool * register * register * 'label memOpnd
128 :     | BCOP1 of bool * 'label memOpnd
129 :    
130 :    
131 :     (*
132 :     * Arithmetic instructions:
133 :     * arguments are (rd,rs,rt/immed) with the exception of sub (sigh).
134 :     *)
135 :     | ADD of register * register * 'label arithOpnd
136 :     | ADDU of register * register * 'label arithOpnd
137 :     | AND of register * register * 'label arithOpnd
138 :     | OR of register * register * 'label arithOpnd
139 :     | XOR of register * register * 'label arithOpnd
140 :     | SUB of register * register * register
141 :     | SUBU of register * register * register
142 :     (*
143 :     * integer mult and div related:
144 :     *)
145 :     | MULT of register * register
146 :     | MULTU of register * register
147 :     | DIV of register * register
148 :     | DIVU of register * register
149 :     | MFLO of register
150 :     | MFHI of register
151 :     | BREAK of int
152 :    
153 :     (*
154 :     * Floating point arithmetic:
155 :     *)
156 :     | NEG_DOUBLE of register * register
157 :     | ABS_DOUBLE of register * register
158 :     | MUL_DOUBLE of register * register * register
159 :     | DIV_DOUBLE of register * register * register
160 :     | ADD_DOUBLE of register * register * register
161 :     | SUB_DOUBLE of register * register * register
162 :     | CVTI2D of register * register
163 :     | MTC1 of register * register
164 :    
165 :     (*
166 :     * Move pseudo-instruction : move(dst,src)
167 :     *)
168 :     | MOV_DOUBLE of register * register
169 :    
170 :     (* Load and store instructions:
171 :     * arguments are: op(rd, base(offset))
172 :     *)
173 :     | LBU of register * register * 'label memOpnd
174 :     | SB of register * register * 'label memOpnd
175 :     | LW of register * register * 'label memOpnd
176 :     | SW of register * register * 'label memOpnd
177 :     | LWC1 of register * register * 'label memOpnd
178 :     | SWC1 of register * register * 'label memOpnd
179 :     | LUI of register * 'label memOpnd
180 :    
181 :     (*
182 :     * Shift instructions:
183 :     * arguments are: (rd,rs,shamt)
184 :     *)
185 :     | SLL of register * register * int5
186 :     | SLLV of register * register * register
187 :     | SRA of register * register * int5
188 :     | SRAV of register * register * register
189 :     | SRL of register * register * int5
190 :     | SRLV of register * register * register
191 :    
192 :     (* MIPS-2 instructions (i.e., R4000, R6000) *)
193 :     | LDC1 of register * register * 'label memOpnd
194 :     | SDC1 of register * register * 'label memOpnd
195 :    
196 :     end
197 :    
198 :    
199 :    
200 :    
201 :     (*
202 :     * $Log: mipsinstr.sml,v $
203 :     * Revision 1.1.1.1 1997/01/14 01:38:39 george
204 :     * Version 109.24
205 :     *
206 :     *)

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