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/sparc/sparcmc.sml
ViewVC logotype

Annotation of /sml/trunk/src/compiler/OldCGen/sparc/sparcmc.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 16 - (view) (download)

1 : monnier 16 (* sparcmc.sml
2 :     *
3 :     * Copyright 1989 by AT&T Bell Laboratories
4 :     *
5 :     * The SPARC machine code emitter.
6 :     *
7 :     * AUTHOR: John Reppy
8 :     * Cornell University
9 :     * Ithaca, NY 14853
10 :     * jhr@cs.cornell.edu
11 :     *
12 :     *)
13 :    
14 :     structure SparcMCode =
15 :     struct
16 :     local open Word8Array in
17 :    
18 :     val code = ref (array(0, 0w0))
19 :    
20 :     fun getCodeString () = let
21 :     val s = extract (!code, 0, SOME(length (!code)))
22 :     in
23 :     code := array(0, 0w0);
24 :     s
25 :     end
26 :    
27 :     end (* local *)
28 :     end (* SparcMCode *)
29 :    
30 :     structure SparcMCEmit : EMITTER =
31 :     struct
32 :    
33 :     open SparcMCode SparcInstr
34 :    
35 :     (* Bit-wise operations *)
36 :     val << = Word.<<
37 :     val >> = Word.>>
38 :     val ~>> = Word.~>>
39 :     val ++ = Word.orb
40 :     val & = Word.andb
41 :     infix << >> ~>> ++ &
42 :    
43 :     val itow = Word.fromInt
44 :    
45 :     val loc = ref 0 (* the location counter *)
46 :    
47 :     fun emitByte' b = let
48 :     val i = !loc
49 :     in
50 :     loc := i+1; Word8Array.update (!code, i, b)
51 :     end
52 :    
53 :     fun emitByte n = emitByte'(Word8.fromLargeWord(Word.toLargeWord n))
54 :    
55 :     fun emitWord w = (emitByte((w >> 0w8) & 0w255); emitByte(w & 0w255))
56 :    
57 :     fun emitLargeWord w = let
58 :     val w = Word.fromLargeWord w
59 :     in
60 :     emitWord(w >> 0w16); emitWord(w & 0w65535)
61 :     end
62 :    
63 :     fun emitLong n = let
64 :     val w = itow n
65 :     in
66 :     (emitWord(w >> 0w16); emitWord(w & 0w65535))
67 :     end
68 :    
69 :     fun emitLongX n = let
70 :     val w = itow n
71 :     in
72 :     (emitWord(w ~>> 0w16); emitWord(w & 0w65535))
73 :     end
74 :    
75 :     fun emitString s = Word8Vector.app emitByte' (Byte.stringToBytes s)
76 :    
77 :     exception BadReal = IEEEReal.BadReal
78 :     fun emitReal s = emitString(IEEEReal.realconst s)
79 :    
80 :     fun emitAddr (INFO{addrOf,...}) (lab, k) =
81 :     emitLongX (k + addrOf lab - !loc)
82 :    
83 :     fun define _ _ = ()
84 :    
85 :     fun mark () = emitLargeWord (
86 :     SparcSpec.ObjDesc.makeDesc(
87 :     (!loc + 4) div 4, SparcSpec.ObjDesc.tag_backptr))
88 :    
89 :     fun emitInstr (info as INFO{addrOf,...}) = let
90 :     fun valOf (LABELexp{base, dst, offset}) =
91 :     itow(((addrOf dst) + offset) - (addrOf base))
92 :     fun immed13 (IMrand i) = (itow i & 0w8191) (* 13 bits *)
93 :     | immed13 (LABrand labexp) = ((valOf labexp) & 0w8191)(* 13 bits *)
94 :     | immed13 (LOrand labexp) = ((valOf labexp) & 0w1023) (* 10 bits *)
95 :     | immed13 _ = ErrorMsg.impossible "[SparcMCEmit.immed13]"
96 :     (* emit a 3 operand instruction with "11" in bits 31-30 *)
97 :     fun emitOp11 opcode (REG a, REGrand(REG b), REG c) = (
98 :     emitWord(0w49152 ++ (itow c << 0w9) ++
99 :     (opcode << 0w3) ++ (itow a >> 0w2));
100 :     emitWord(((itow a & 0w3) << 0w14) ++ itow b))
101 :     | emitOp11 opcode (REG a, b, REG c) = (
102 :     emitWord(0w49152 ++ (itow c << 0w9) ++
103 :     (opcode << 0w3) ++ (itow a >> 0w2));
104 :     emitWord(((itow a & 0w3) << 0w14) ++ 0w8192 ++ (immed13 b)))
105 :    
106 :     val emit_ld = emitOp11 0w0
107 :     val emit_st = emitOp11 0w4
108 :     val emit_ldb = emitOp11 0w1
109 :     val emit_stb = emitOp11 0w5
110 :     fun emit_ldf (r, ri, FREG fr) = emitOp11 0w32 (r, ri, REG fr)
111 :     fun emit_stf (r, ri, FREG fr) = emitOp11 0w36 (r, ri, REG fr)
112 :    
113 :     (* emit a branch instruction *)
114 :     fun emitBcc opcode lab = let
115 :     val disp = (((addrOf lab) - !loc) div 4)
116 :     val d = itow(if disp < 0 then (disp + 4194304) else disp)
117 :     in
118 :     if ((disp < ~2097152) orelse (2097152 <= disp))
119 :     then ErrorMsg.impossible "[SparcMCEmit.emitBcc]" else ();
120 :     let
121 :     val w = opcode << 0w22 ++ d
122 :     in
123 :     emitWord(w >> 0w16);
124 :     emitWord(w & 0w65535)
125 :     end
126 :     end
127 :    
128 :     val emit_ba = emitBcc 0w66 (* 1000010 *)
129 :     val emit_be = emitBcc 0w10 (* 0001010 *)
130 :     val emit_bne = emitBcc 0w74 (* 1001010 *)
131 :     val emit_ble = emitBcc 0w18 (* 0010010 *)
132 :     val emit_bge = emitBcc 0w90 (* 1011010 *)
133 :     val emit_bl = emitBcc 0w26 (* 0011010 *)
134 :     val emit_bg = emitBcc 0w82 (* 1010010 *)
135 :     val emit_bgeu = emitBcc 0w106 (* 1101010 *)
136 :     val emit_bleu = emitBcc 0w34 (* 0100010 *)
137 :     val emit_blu = emitBcc 0wx2a (* 0101010 *)
138 :     val emit_bgu = emitBcc 0wx62 (* 1100010 *)
139 :    
140 :     val emit_fbe = emitBcc 0w78 (* 1001110 *)
141 :     val emit_fbne = emitBcc 0w14 (* 0001110 *)
142 :     val emit_fble = emitBcc 0w110 (* 1101110 *)
143 :     val emit_fbge = emitBcc 0w94 (* 1011110 *)
144 :     val emit_fbl = emitBcc 0w38 (* 0100110 *)
145 :     val emit_fbg = emitBcc 0w54 (* 0110110 *)
146 :     val emit_fblg = emitBcc 0wx16 (* 0010110 *)
147 :     val emit_fba = emitBcc 0wx46 (* 1000110 *)
148 :     val emit_fbu = emitBcc 0wx3e (* 0111110 *)
149 :     val emit_fbug = emitBcc 0wx2e (* 0101110 *)
150 :     val emit_fbul = emitBcc 0wx1e (* 0011110 *)
151 :     val emit_fbue = emitBcc 0wx56 (* 1010110 *)
152 :     val emit_fbuge = emitBcc 0wx66 (* 1100110 *)
153 :     val emit_fbule = emitBcc 0wx76 (* 1110110 *)
154 :     val emit_fbo = emitBcc 0wx7e (* 1111110 *)
155 :    
156 :     (* emit a 3 operand instructions with "10" in bits 31-30. *)
157 :     fun emitOp10 opcode (REG a, REGrand(REG b), REG c) = (
158 :     emitWord(0w32768 ++ (itow c << 0w9) ++
159 :     (opcode << 0w3) ++ (itow a >> 0w2));
160 :     emitWord(((itow a & 0w3) << 0w14) ++ itow b))
161 :     | emitOp10 opcode (REG a, b, REG c) = (
162 :     emitWord(0w32768 ++ (itow c << 0w9) ++
163 :     (opcode << 0w3) ++ (itow a >> 0w2));
164 :     emitWord(((itow a & 0w3) << 0w14) ++ 0w8192 ++ (immed13 b)))
165 :    
166 :     val emit_jmpl = emitOp10 0w56 (* 111000 *)
167 :    
168 :     fun emit_call2 () = ( (* opcode = 0x40000002 *)
169 :     emitByte 0w64; emitByte 0w0; emitByte 0w0; emitByte 0w2)
170 :     (* integer operations *)
171 :     val emit_add = emitOp10 0w0 (* 000000 *)
172 :     val emit_addcc = emitOp10 0w16 (* 010000 *)
173 :     val emit_taddcctv = emitOp10 0w34 (* 100010 *)
174 :     val emit_sub = emitOp10 0w4 (* 000100 *)
175 :     val emit_subcc = emitOp10 0w20 (* 010100 *)
176 :     val emit_sll = emitOp10 0w37 (* 100101 *)
177 :     val emit_srl = emitOp10 0w38 (* 100110 *)
178 :     val emit_sra = emitOp10 0w39 (* 100111 *)
179 :     val emit_and = emitOp10 0w1 (* 000001 *)
180 :     val emit_andcc = emitOp10 0w17 (* 010001 *)
181 :     val emit_or = emitOp10 0w2 (* 000010 *)
182 :     val emit_xor = emitOp10 0w3 (* 000011 *)
183 :     val emit_xnor = emitOp10 0w7 (* 000111 *)
184 :    
185 :     (* emit a FOp1 floating-point instruction of three args; this has "10" in
186 :     * bits 31-30 and "110100" in bits 24-19.
187 :     *)
188 :     fun emitFOp1_3 opcode (FREG a, FREG b, FREG c) = (
189 :     emitWord (0w33184 ++ (itow c << 0w9) ++ (itow a >> 0w2));
190 :     emitWord (((itow a & 0w3) << 0w14) ++ (opcode << 0w5) ++
191 :     itow b))
192 :     (* emit a FOp1 floating-point instruction of two args (same bits as above) *)
193 :     fun emitFOp1_2 opcode (FREG a, FREG b) = (
194 :     emitWord (0w33184 ++ (itow b << 0w9));
195 :     emitWord ((opcode << 0w5) ++ itow a))
196 :     (* emit a FOp2 floating-point instruction of two args. This has "10" in
197 :     * bits 31-30 and "110101" in bits 24-19.
198 :     *)
199 :     fun emitFOp2_2 opcode (FREG a, FREG b) = (
200 :     emitWord (0w33192 ++ (itow a >> 0w2));
201 :     emitWord (((itow a & 0w3) << 0w14) ++ (opcode << 0w5)
202 :     ++ itow b))
203 :     val emit_fadd = emitFOp1_3 0wx042 (* 0 0100 0010 *)
204 :     val emit_fsub = emitFOp1_3 0wx046 (* 0 0100 0110 *)
205 :     val emit_fmul = emitFOp1_3 0wx04a (* 0 0100 1010 *)
206 :     val emit_fdiv = emitFOp1_3 0wx04e (* 0 0100 1110 *)
207 :     val emit_fneg = emitFOp1_2 0wx005 (* 0 0000 0101 *)
208 :     val emit_fabs = emitFOp1_2 0wx009 (* 0 0000 1001 *)
209 :     val emit_fcmp = emitFOp2_2 0wx052 (* 0 0101 0010 *)
210 :     val emit_fmov = emitFOp1_2 0wx001 (* 0 0000 0001 *)
211 :     val emit_fitod = emitFOp1_2 0wx0c8 (* 0 1100 1000 *)
212 :     in
213 :    
214 :     fn I_nop => emitLong 16777216 (* really "sethi 0,%g0" *)
215 :     | I_ld args => emit_ld args
216 :     | I_ldb args => emit_ldb args
217 :     | I_ldf args => emit_ldf args
218 :     | I_st args => emit_st args
219 :     | I_stb args => emit_stb args
220 :     | I_stf args => emit_stf args
221 :     | I_sethi(arg, REG rd) => let
222 :     val im = case arg
223 :     of (IMrand i) => itow i
224 :     | (HIrand labexp) => ((valOf labexp) >> 0w10)
225 :     | _ => ErrorMsg.impossible "[SparcMCEmit.emitInstr:sethi]"
226 :     in
227 :     emitWord(0w256 ++ (itow rd << 0w9) ++ ((im >> 0w16) & 0w63));
228 :     emitWord(im & 0w65535)
229 :     end
230 :     | I_bcc(CC_A, lab) => emit_ba lab
231 :     | I_bcc(CC_E, lab) => emit_be lab
232 :     | I_bcc(CC_NE, lab) => emit_bne lab
233 :     | I_bcc(CC_L, lab) => emit_bl lab
234 :     | I_bcc(CC_LE, lab) => emit_ble lab
235 :     | I_bcc(CC_G, lab) => emit_bg lab
236 :     | I_bcc(CC_GE, lab) => emit_bge lab
237 :     | I_bcc(CC_GEU, lab) => emit_bgeu lab
238 :     | I_bcc(CC_LEU, lab) => emit_bleu lab
239 :     | I_bcc(CC_LU, lab) => emit_blu lab
240 :     | I_bcc(CC_GU, lab) => emit_bgu lab
241 :    
242 :     | I_fbcc(FCC_A, lab) => emit_fba lab
243 :     | I_fbcc(FCC_U, lab) => emit_fbu lab
244 :     | I_fbcc(FCC_G, lab) => emit_fbg lab
245 :     | I_fbcc(FCC_UG, lab) => emit_fbug lab
246 :     | I_fbcc(FCC_L, lab) => emit_fbl lab
247 :     | I_fbcc(FCC_UL, lab) => emit_fbul lab
248 :     | I_fbcc(FCC_LG, lab) => emit_fblg lab
249 :     | I_fbcc(FCC_NE, lab) => emit_fbne lab
250 :     | I_fbcc(FCC_E, lab) => emit_fbe lab
251 :     | I_fbcc(FCC_UE, lab) => emit_fbue lab
252 :     | I_fbcc(FCC_GE, lab) => emit_fbge lab
253 :     | I_fbcc(FCC_UGE, lab) => emit_fbuge lab
254 :     | I_fbcc(FCC_LE, lab) => emit_fble lab
255 :     | I_fbcc(FCC_ULE, lab) => emit_fbule lab
256 :     | I_fbcc(FCC_O, lab) => emit_fbo lab
257 :    
258 :     | I_jmpl args => emit_jmpl args
259 :     | I_call2 => emit_call2()
260 :     | I_add args => emit_add args
261 :     | I_addcc args => emit_addcc args
262 :     | I_taddcctv args => emit_taddcctv args
263 :     | I_sub args => emit_sub args
264 :     | I_subcc args => emit_subcc args
265 :     | I_sll args => emit_sll args
266 :     | I_srl args => emit_srl args
267 :     | I_sra args => emit_sra args
268 :     | I_and args => emit_and args
269 :     | I_andcc args => emit_andcc args
270 :     | I_or args => emit_or args
271 :     | I_xor args => emit_xor args
272 :     | I_not(r1, rd) => emit_xnor (r1, REGrand(REG 0), rd)
273 :     | I_tvs => (emitWord 0w36816; emitWord 0w8199) (* "tvs 0x7" *)
274 :     | I_fadd args => emit_fadd args
275 :     | I_fsub args => emit_fsub args
276 :     | I_fmul args => emit_fmul args
277 :     | I_fdiv args => emit_fdiv args
278 :     | I_fneg args => emit_fneg args
279 :     | I_fabs args => emit_fabs args
280 :     | I_fcmp args => emit_fcmp args
281 :     | I_fmov args => emit_fmov args
282 :     | I_fitod args => emit_fitod args
283 :     (*
284 :     | _ => ErrorMsg.impossible "[SparcMCEmit.emitInstr]"
285 :     *)
286 :    
287 :     end (* emitInstr *)
288 :    
289 :     fun comment _ = ()
290 :    
291 :     fun init n = (code := Word8Array.array(n, 0w0); loc := 0)
292 :    
293 :     end (* structure SparcMCEmit *)
294 :    
295 :     (*
296 :     * $Log: sparcmc.sml,v $
297 :     * Revision 1.3 1998/02/12 20:48:49 jhr
298 :     * Removed references to System.Tags.
299 :     *
300 :     * Revision 1.2 1997/08/25 16:42:08 jhr
301 :     * Improved implementation of emitString.
302 :     *
303 :     * Revision 1.1.1.1 1997/01/14 01:38:46 george
304 :     * Version 109.24
305 :     *
306 :     *)

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