Fri Nov 14 20:52:12 CET 2003 Paolo Molaro <lupus@ximian.com>
[mono.git] / mono / mini / cpu-g4.md
1 # powerpc cpu description file
2 # this file is read by genmdesc to pruduce a table with all the relevant information
3 # about the cpu instructions that may be used by the regsiter allocator, the scheduler
4 # and other parts of the arch-dependent part of mini.
5 #
6 # An opcode name is followed by a colon and optional specifiers.
7 # A specifier has a name, a colon and a value. Specifiers are separated by white space.
8 # Here is a description of the specifiers valid for this file and their possible values.
9 #
10 # dest:register       describes the destination register of an instruction
11 # src1:register       describes the first source register of an instruction
12 # src2:register       describes the second source register of an instruction
13 #
14 # register may have the following values:
15 #       i  integer register
16 #       b  base register (used in address references)
17 #       f  floating point register
18 #
19 # len:number         describe the maximun length in bytes of the instruction
20 # number is a positive integer
21 #
22 # cost:number        describe how many cycles are needed to complete the instruction (unused)
23 #
24 # clob:spec          describe if the instruction clobbers registers or has special needs
25 #
26 # spec can be one of the following characters:
27 #       c  clobbers caller-save registers
28 #       r  'reserves' the destination register until a later instruction unreserves it
29 #          used mostly to set output registers in function calls
30 #
31 # flags:spec        describe if the instruction uses or sets the flags (unused)
32 #
33 # spec can be one of the following chars:
34 #       s  sets the flags
35 #       u  uses the flags
36 #       m  uses and modifies the flags
37 #
38 # res:spec          describe what units are used in the processor (unused)
39 #
40 # delay:            describe delay slots (unused)
41 #
42 # the required specifiers are: len, clob (if registers are clobbered), the registers
43 # specifiers if the registers are actually used, flags (when scheduling is implemented).
44 #
45 # See the code in mini-x86.c for more details on how the specifiers are used.
46 #
47 nop: len:4
48 break: len:4
49 ldarg.0:
50 ldarg.1:
51 ldarg.2:
52 ldarg.3:
53 ldloc.0:
54 ldloc.1:
55 ldloc.2:
56 ldloc.3:
57 stloc.0:
58 stloc.1:
59 stloc.2:
60 stloc.3:
61 ldarg.s:
62 ldarga.s:
63 starg.s:
64 ldloc.s:
65 ldloca.s:
66 stloc.s:
67 ldnull:
68 ldc.i4.m1:
69 ldc.i4.0:
70 ldc.i4.1:
71 ldc.i4.2:
72 ldc.i4.3:
73 ldc.i4.4:
74 ldc.i4.5:
75 ldc.i4.6:
76 ldc.i4.7:
77 ldc.i4.8:
78 ldc.i4.s:
79 ldc.i4:
80 ldc.i8:
81 ldc.r4:
82 ldc.r8:
83 dup:
84 pop:
85 jmp:
86 call: dest:a clob:c len:4
87 calli:
88 ret:
89 br.s:
90 brfalse.s:
91 brtrue.s:
92 beq.s:
93 bge.s:
94 bgt.s:
95 ble.s:
96 blt.s:
97 bne.un.s:
98 bge.un.s:
99 bgt.un.s:
100 ble.un.s:
101 blt.un.s:
102 br: len:4
103 brfalse:
104 brtrue:
105 beq: len:8
106 bge: len:8
107 bgt: len:8
108 ble: len:8
109 blt: len:8
110 bne.un: len:8
111 bge.un: len:8
112 bgt.un: len:8
113 ble.un: len:8
114 blt.un: len:8
115 switch:
116 ldind.i1: dest:i len:8
117 ldind.u1: dest:i len:8
118 ldind.i2: dest:i len:8
119 ldind.u2: dest:i len:8
120 ldind.i4: dest:i len:8
121 ldind.u4: dest:i len:8
122 ldind.i8:
123 ldind.i: dest:i len:8
124 ldind.r4:
125 ldind.r8:
126 ldind.ref: dest:i len:8
127 stind.ref: src1:b src2:i
128 stind.i1: src1:b src2:i
129 stind.i2: src1:b src2:i
130 stind.i4: src1:b src2:i
131 stind.i8:
132 stind.r4: src1:b src2:f
133 stind.r8: src1:b src2:f
134 add: dest:i src1:i src2:i len:4
135 sub: dest:i src1:i src2:i len:4
136 mul: dest:i src1:i src2:i len:4
137 div: dest:a src1:i src2:i len:4
138 div.un: dest:a src1:i src2:i len:4
139 rem: dest:d src1:i src2:i len:12
140 rem.un: dest:d src1:i src2:i len:12
141 and: dest:i src1:i src2:i len:4
142 or: dest:i src1:i src2:i len:4
143 xor: dest:i src1:i src2:i len:4
144 shl: dest:i src1:i src2:i len:4
145 shr: dest:i src1:i src2:i len:4
146 shr.un: dest:i src1:i src2:i len:4
147 neg: dest:i src1:i len:4
148 not: dest:i src1:i len:4
149 conv.i1: dest:i src1:i len:4
150 conv.i2: dest:i src1:i len:4
151 conv.i4: dest:i src1:i len:4
152 conv.i8:
153 conv.r4: dest:f src1:i len:7
154 conv.r8: dest:f src1:i len:7
155 conv.u4: dest:i src1:i
156 conv.u8:
157 callvirt:
158 cpobj:
159 ldobj:
160 ldstr:
161 newobj:
162 castclass:
163 isinst:
164 conv.r.un:
165 unbox:
166 throw: src1:i len:8
167 ldfld:
168 ldflda:
169 stfld:
170 ldsfld:
171 ldsflda:
172 stsfld:
173 stobj:
174 conv.ovf.i1.un:
175 conv.ovf.i2.un:
176 conv.ovf.i4.un:
177 conv.ovf.i8.un:
178 conv.ovf.u1.un:
179 conv.ovf.u2.un:
180 conv.ovf.u4.un:
181 conv.ovf.u8.un:
182 conv.ovf.i.un:
183 conv.ovf.u.un:
184 box:
185 newarr:
186 ldlen:
187 ldelema:
188 ldelem.i1:
189 ldelem.u1:
190 ldelem.i2:
191 ldelem.u2:
192 ldelem.i4:
193 ldelem.u4:
194 ldelem.i8:
195 ldelem.i:
196 ldelem.r4:
197 ldelem.r8:
198 ldelem.ref:
199 stelem.i:
200 stelem.i1:
201 stelem.i2:
202 stelem.i4:
203 stelem.i8:
204 stelem.r4:
205 stelem.r8:
206 stelem.ref:
207 conv.ovf.i1:
208 conv.ovf.u1:
209 conv.ovf.i2:
210 conv.ovf.u2:
211 conv.ovf.i4:
212 conv.ovf.u4:
213 conv.ovf.i8:
214 conv.ovf.u8:
215 refanyval:
216 ckfinite: dest:f src1:f len:22
217 mkrefany:
218 ldtoken:
219 conv.u2: dest:i src1:i len:4
220 conv.u1: dest:i src1:i len:4
221 conv.i: dest:i src1:i len:4
222 conv.ovf.i:
223 conv.ovf.u:
224 add.ovf:
225 add.ovf.un:
226 mul.ovf: dest:i src1:i src2:i len:8
227 # this opcode is handled specially in the code generator
228 mul.ovf.un: dest:i src1:i src2:i len:12
229 sub.ovf:
230 sub.ovf.un:
231 endfinally: len:10
232 leave:
233 leave.s:
234 stind.i:
235 conv.u: dest:i src1:i len:4
236 prefix7:
237 prefix6:
238 prefix5:
239 prefix4:
240 prefix3:
241 prefix2:
242 prefix1:
243 prefixref:
244 arglist:
245 ceq: dest:i len:12
246 cgt: dest:i len:12
247 cgt.un: dest:i len:12
248 clt: dest:i len:12
249 clt.un: dest:i len:12
250 ldftn:
251 ldvirtftn:
252 ldarg:
253 ldarga:
254 starg:
255 ldloc:
256 ldloca:
257 stloc:
258 localloc: dest:i src1:i len:30
259 endfilter:
260 unaligned.:
261 volatile.:
262 tail.:
263 initobj:
264 cpblk:
265 initblk:
266 rethrow:
267 sizeof:
268 refanytype:
269 illegal:
270 endmac:
271 mono_func1:
272 mono_proc2:
273 mono_proc3:
274 mono_free:
275 mono_objaddr:
276 mono_ldptr:
277 mono_vtaddr:
278 mono_newobj:
279 mono_retobj:
280 load:
281 ldaddr:
282 store:
283 phi:
284 rename:
285 compare: src1:i src2:i len:4
286 compare_imm: src1:i len:12
287 fcompare: src1:f src2:f len:12
288 lcompare:
289 local:
290 arg:
291 outarg: src1:i len:1
292 outarg_imm: len:5
293 retarg:
294 setret: dest:a src1:i len:4
295 setlret: dest:l src1:i src2:i len:8
296 setreg: dest:i src1:i len:4 clob:r
297 setregimm: dest:i len:8 clob:r
298 setfreg: dest:f src1:f len:4 clob:r
299 checkthis: src1:b len:4
300 voidcall: len:8 clob:c
301 voidcall_reg: src1:i len:8 clob:c
302 voidcall_membase: src1:b len:12 clob:c
303 fcall: dest:f len:8 clob:c
304 fcall_reg: dest:f src1:i len:8 clob:c
305 fcall_membase: dest:f src1:b len:12 clob:c
306 lcall: dest:l len:8 clob:c
307 lcall_reg: dest:l src1:i len:8 clob:c
308 lcall_membase: dest:l src1:b len:12 clob:c
309 vcall: len:8 clob:c
310 vcall_reg: src1:i len:8 clob:c
311 vcall_membase: src1:b len:12 clob:c
312 call_reg: dest:i src1:i len:8 clob:c
313 call_membase: dest:i src1:b len:12 clob:c
314 trap:
315 iconst: dest:i len:8
316 i8const:
317 r4const: dest:f len:8
318 r8const: dest:f len:8
319 regvar:
320 reg:
321 regoffset:
322 label:
323 store_membase_imm: dest:b len:12
324 store_membase_reg: dest:b src1:i len:8
325 storei1_membase_imm: dest:b len:12
326 storei1_membase_reg: dest:b src1:i len:8
327 storei2_membase_imm: dest:b len:12
328 storei2_membase_reg: dest:b src1:i len:8
329 storei4_membase_imm: dest:b len:12
330 storei4_membase_reg: dest:b src1:i len:8
331 storei8_membase_imm: dest:b 
332 storei8_membase_reg: dest:b src1:i 
333 storer4_membase_reg: dest:b src1:f len:8
334 storer8_membase_reg: dest:b src1:f len:8
335 load_membase: dest:i src1:b len:12
336 loadi1_membase: dest:i src1:b len:12
337 loadu1_membase: dest:i src1:b len:12
338 loadi2_membase: dest:i src1:b len:12
339 loadu2_membase: dest:i src1:b len:12
340 loadi4_membase: dest:i src1:b len:12
341 loadu4_membase: dest:i src1:b len:12
342 loadi8_membase: dest:i src1:b
343 loadr4_membase: dest:f src1:b len:8
344 loadr8_membase: dest:f src1:b len:12
345 loadu4_mem: dest:i len:8
346 move: dest:i src1:i len:4
347 add_imm: dest:i src1:i len:12
348 sub_imm: dest:i src1:i len:12
349 mul_imm: dest:i src1:i len:12
350 # there is no actual support for division or reminder by immediate
351 # we simulate them, though (but we need to change the burg rules 
352 # to allocate a symbolic reg for src2)
353 div_imm: dest:a src1:i src2:i len:12
354 div_un_imm: dest:a src1:i src2:i len:12
355 rem_imm: dest:d src1:i src2:i len:16
356 rem_un_imm: dest:d src1:i src2:i len:16
357 and_imm: dest:i src1:i len:8
358 or_imm: dest:i src1:i len:8
359 xor_imm: dest:i src1:i len:8
360 shl_imm: dest:i src1:i len:8
361 shr_imm: dest:i src1:i len:8
362 shr_un_imm: dest:i src1:i len:8
363 cond_exc_eq: len:8
364 cond_exc_ne_un: len:8
365 cond_exc_lt: len:8
366 cond_exc_lt_un: len:8
367 cond_exc_gt: len:8
368 cond_exc_gt_un: len:8
369 cond_exc_ge: len:8
370 cond_exc_ge_un: len:8
371 cond_exc_le: len:8
372 cond_exc_le_un: len:8
373 cond_exc_ov: len:8
374 cond_exc_no: len:8
375 cond_exc_c: len:8
376 cond_exc_nc: len:8
377 long_add:
378 long_sub:
379 long_mul:
380 long_div:
381 long_div_un:
382 long_rem:
383 long_rem_un:
384 long_and:
385 long_or:
386 long_xor:
387 long_shl:
388 long_shr:
389 long_shr_un:
390 long_neg:
391 long_not:
392 long_conv_to_i1:
393 long_conv_to_i2:
394 long_conv_to_i4:
395 long_conv_to_i8:
396 long_conv_to_r4:
397 long_conv_to_r8:
398 long_conv_to_u4:
399 long_conv_to_u8:
400 long_conv_to_u2:
401 long_conv_to_u1:
402 long_conv_to_i:
403 long_conv_to_ovf_i: dest:i src1:i src2:i len:30
404 long_conv_to_ovf_u:
405 long_add_ovf:
406 long_add_ovf_un:
407 long_mul_ovf: 
408 long_mul_ovf_un:
409 long_sub_ovf:
410 long_sub_ovf_un:
411 long_conv_to_ovf_i1_un:
412 long_conv_to_ovf_i2_un:
413 long_conv_to_ovf_i4_un:
414 long_conv_to_ovf_i8_un:
415 long_conv_to_ovf_u1_un:
416 long_conv_to_ovf_u2_un:
417 long_conv_to_ovf_u4_un:
418 long_conv_to_ovf_u8_un:
419 long_conv_to_ovf_i_un:
420 long_conv_to_ovf_u_un:
421 long_conv_to_ovf_i1:
422 long_conv_to_ovf_u1:
423 long_conv_to_ovf_i2:
424 long_conv_to_ovf_u2:
425 long_conv_to_ovf_i4:
426 long_conv_to_ovf_u4:
427 long_conv_to_ovf_i8:
428 long_conv_to_ovf_u8:
429 long_ceq:
430 long_cgt:
431 long_cgt_un:
432 long_clt:
433 long_clt_un:
434 long_conv_to_r_un: dest:f src1:i src2:i len:37 
435 long_conv_to_u:
436 long_shr_imm:
437 long_shr_un_imm:
438 long_shl_imm:
439 long_add_imm:
440 long_sub_imm:
441 long_beq:
442 long_bne_un:
443 long_blt:
444 long_blt_un:
445 long_bgt:
446 long_btg_un:
447 long_bge:
448 long_bge_un:
449 long_ble:
450 long_ble_un:
451 float_beq: len:8
452 float_bne_un: len:8
453 float_blt: len:8
454 float_blt_un: len:8
455 float_bgt: len:8
456 float_btg_un: len:8
457 float_bge: len:8
458 float_bge_un: len:8
459 float_ble: len:8
460 float_ble_un: len:8
461 float_add: dest:f src1:f src2:f len:4
462 float_sub: dest:f src1:f src2:f len:4
463 float_mul: dest:f src1:f src2:f len:4
464 float_div: dest:f src1:f src2:f len:4
465 float_div_un: dest:f src1:f src2:f len:4
466 float_rem: dest:f src1:f src2:f len:16
467 float_rem_un: dest:f src1:f src2:f len:16
468 float_neg: dest:f src1:f len:4
469 float_not: dest:f src1:f len:4
470 float_conv_to_i1: dest:i src1:f len:40
471 float_conv_to_i2: dest:i src1:f len:40
472 float_conv_to_i4: dest:i src1:f len:40
473 float_conv_to_i8: dest:l src1:f len:40
474 float_conv_to_r4: dest:f src1:f len:4
475 float_conv_to_r8:
476 float_conv_to_u4: dest:i src1:f len:40
477 float_conv_to_u8: dest:l src1:f len:40
478 float_conv_to_u2: dest:i src1:f len:40
479 float_conv_to_u1: dest:i src1:f len:40
480 float_conv_to_i: dest:i src1:f len:40
481 float_conv_to_ovf_i:
482 float_conv_to_ovd_u:
483 float_add_ovf:
484 float_add_ovf_un:
485 float_mul_ovf:
486 float_mul_ovf_un:
487 float_sub_ovf:
488 float_sub_ovf_un:
489 float_conv_to_ovf_i1_un:
490 float_conv_to_ovf_i2_un:
491 float_conv_to_ovf_i4_un:
492 float_conv_to_ovf_i8_un:
493 float_conv_to_ovf_u1_un:
494 float_conv_to_ovf_u2_un:
495 float_conv_to_ovf_u4_un:
496 float_conv_to_ovf_u8_un:
497 float_conv_to_ovf_i_un:
498 float_conv_to_ovf_u_un:
499 float_conv_to_ovf_i1:
500 float_conv_to_ovf_u1:
501 float_conv_to_ovf_i2:
502 float_conv_to_ovf_u2:
503 float_conv_to_ovf_i4:
504 float_conv_to_ovf_u4:
505 float_conv_to_ovf_i8:
506 float_conv_to_ovf_u8:
507 float_ceq: dest:i src1:f src2:f len:12
508 float_cgt: dest:i src1:f src2:f len:12
509 float_cgt_un: dest:i src1:f src2:f len:12
510 float_clt: dest:i src1:f src2:f len:12
511 float_clt_un: dest:i src1:f src2:f len:12
512 float_conv_to_u: dest:i src1:f len:36
513 call_handler: len:12
514 op_endfilter: src1:i len:12
515 aot_const: dest:i len:8
516 x86_test_null: src1:i len:4
517 x86_compare_membase_reg: src1:b src2:i len:8
518 x86_compare_membase_imm: src1:b len:8
519 x86_compare_reg_membase: src1:i src2:b len:8
520 x86_inc_reg: dest:i src1:i clob:1 len:1
521 x86_inc_membase: src1:b len:6
522 x86_dec_reg: dest:i src1:i clob:1 len:1
523 x86_dec_membase: src1:b len:6
524 x86_add_membase_imm: src1:b len:8
525 x86_sub_membase_imm: src1:b len:8
526 x86_push: src1:i len:1
527 x86_push_imm: len:5
528 x86_push_membase: src1:b len:6
529 x86_push_obj: src1:b len:30
530 x86_lea: dest:i src1:i src2:i len:7
531 x86_xchg: src1:i src2:i clob:x len:1
532 x86_fpop: src1:f len:2
533 x86_fp_load_i8: dest:f src1:b len:7
534 x86_fp_load_i4: dest:f src1:b len:7
535 adc: dest:i src1:i src2:i len:4
536 addcc: dest:i src1:i src2:i len:4
537 subcc: dest:i src1:i src2:i len:4
538 adc_imm: dest:i src1:i len:8
539 sbb: dest:i src1:i src2:i len:4
540 sbb_imm: dest:i src1:i len:8
541 br_reg: src1:i len:8
542 ppc_subfic: dest:i src1:i len:4
543 ppc_subfze: dest:i src1:i len:4
544 op_bigmul: len:2 dest:l src1:a src2:i
545 op_bigmul_un: len:2 dest:l src1:a src2:i