New test.
[mono.git] / mono / mini / cpu-ia64.md
1 # ia64 cpu description file
2 #
3 # The instruction lengths are very conservative, it doesn't matter on ia64
4 # since there are no short branches.
5 #
6
7 label:
8 break: len:48
9 jmp: len:48
10 br: len:48
11 beq: len:48
12 bge: len:48
13 bgt: len:48
14 ble: len:48
15 blt: len:48
16 bne.un: len:48
17 bge.un: len:48
18 bgt.un: len:48
19 ble.un: len:48
20 blt.un: len:48
21 add: dest:i src1:i src2:i len:48
22 sub: dest:i src1:i src2:i len:48
23 mul: dest:i src1:i src2:i len:48
24 div: dest:a src1:a src2:i len:48 clob:d
25 div.un: dest:a src1:a src2:i len:48 clob:d
26 rem: dest:d src1:a src2:i len:48 clob:a
27 rem.un: dest:d src1:a src2:i len:48 clob:a
28 and: dest:i src1:i src2:i len:48
29 or: dest:i src1:i src2:i len:48
30 xor: dest:i src1:i src2:i len:48
31 shl: dest:i src1:i src2:s len:48
32 shr: dest:i src1:i src2:s len:48
33 shr.un: dest:i src1:i src2:s len:48
34 neg: dest:i src1:i len:48
35 not: dest:i src1:i len:48
36 conv.i1: dest:i src1:i len:48
37 conv.i2: dest:i src1:i len:48
38 conv.i4: dest:i src1:i len:48
39 conv.i8: dest:i src1:i len:48
40 conv.r4: dest:f src1:i len:112
41 conv.r8: dest:f src1:i len:112
42 conv.u4: dest:i src1:i len:112
43 conv.u8: dest:i src1:i len:112
44 conv.r.un: dest:f src1:i len:48
45 throw: src1:i len:96
46 op_rethrow: src1:i len:48
47 conv.ovf.i4.un: dest:i src1:i len:96
48 conv.ovf.u4.un: 
49 conv.ovf.u4: dest:i src1:i len:48
50 ckfinite: dest:f src1:f len:48
51 conv.u2: dest:i src1:i len:48
52 conv.u1: dest:i src1:i len:48
53 conv.i: dest:i src1:i len:48
54 mul.ovf: dest:i src1:i src2:i len:48
55 # this opcode is handled specially in the code generator
56 mul.ovf.un: dest:i src1:i src2:i len:48
57 conv.u: dest:i src1:i len:48
58 ceq: dest:c len:48
59 cgt: dest:c len:48
60 cgt.un: dest:c len:48
61 clt: dest:c len:48
62 clt.un: dest:c len:48
63 localloc: dest:i src1:i len:92
64 compare: src1:i src2:i len:48
65 lcompare: src1:i src2:i len:48
66 icompare: src1:i src2:i len:48
67 compare_imm: src1:i len:48
68 icompare_imm: src1:i len:48
69 fcompare: src1:f src2:f clob:a len:48
70 oparglist: src1:b len:48
71 outarg: src1:i len:48
72 outarg_imm: len:48
73 setret: dest:r src1:i len:48
74 setlret: dest:r src1:i src2:i len:48
75 checkthis: src1:b len:48
76 call: dest:r clob:c len:80
77 voidcall: clob:c len:80
78 voidcall_reg: src1:i clob:c len:80
79 voidcall_membase: src1:b clob:c len:80
80 fcall: dest:g len:80 clob:c
81 fcall_reg: dest:g src1:i len:80 clob:c
82 fcall_membase: dest:g src1:b len:80 clob:c
83 lcall: dest:r len:80 clob:c
84 lcall_reg: dest:r src1:i len:80 clob:c
85 lcall_membase: dest:r src1:b len:80 clob:c
86 vcall: len:80 clob:c
87 vcall_reg: src1:i len:80 clob:c
88 vcall_membase: src1:b len:80 clob:c
89 call_reg: dest:r src1:i len:80 clob:c
90 call_membase: dest:r src1:b len:80 clob:c
91 iconst: dest:i len:48
92 i8const: dest:i len:48
93 r4const: dest:f len:48
94 r8const: dest:f len:48
95 store_membase_imm: dest:b len:48
96 store_membase_reg: dest:b src1:i len:48
97 storei8_membase_reg: dest:b src1:i len:48
98 storei1_membase_imm: dest:b len:48
99 storei1_membase_reg: dest:b src1:c len:48
100 storei2_membase_imm: dest:b len:48
101 storei2_membase_reg: dest:b src1:i len:48
102 storei4_membase_imm: dest:b len:48
103 storei4_membase_reg: dest:b src1:i len:48
104 storei8_membase_imm: dest:b len:48
105 storer4_membase_reg: dest:b src1:f len:48
106 storer8_membase_reg: dest:b src1:f len:48
107 load_membase: dest:i src1:b len:48
108 loadi1_membase: dest:c src1:b len:48
109 loadu1_membase: dest:c src1:b len:48
110 loadi2_membase: dest:i src1:b len:48
111 loadu2_membase: dest:i src1:b len:48
112 loadi4_membase: dest:i src1:b len:48
113 loadu4_membase: dest:i src1:b len:48
114 loadi8_membase: dest:i src1:b len:48
115 loadr4_membase: dest:f src1:b len:48
116 loadr8_membase: dest:f src1:b len:48
117 loadr8_spill_membase: src1:b len:48
118 loadu4_mem: dest:i len:48
119 move: dest:i src1:i len:48
120 setreg: dest:i src1:i len:48
121 add_imm: dest:i src1:i len:48
122 sub_imm: dest:i src1:i len:48
123 mul_imm: dest:i src1:i len:48
124 # there is no actual support for division or reminder by immediate
125 # we simulate them, though (but we need to change the burg rules 
126 # to allocate a symbolic reg for src2)
127 div_imm: dest:a src1:i src2:i len:48 clob:d
128 div_un_imm: dest:a src1:i src2:i len:48 clob:d
129 rem_imm: dest:d src1:i src2:i len:48 clob:a
130 rem_un_imm: dest:d src1:i src2:i len:48 clob:a
131 and_imm: dest:i src1:i len:48
132 or_imm: dest:i src1:i len:48
133 xor_imm: dest:i src1:i len:48
134 shl_imm: dest:i src1:i len:48
135 shr_imm: dest:i src1:i len:48
136 shr_un_imm: dest:i src1:i len:48
137 cond_exc_eq: len:48
138 cond_exc_ne_un: len:48
139 cond_exc_lt: len:48
140 cond_exc_lt_un: len:48
141 cond_exc_gt: len:48
142 cond_exc_gt_un: len:48
143 cond_exc_ge: len:48
144 cond_exc_ge_un: len:48
145 cond_exc_le: len:48
146 cond_exc_le_un: len:48
147 cond_exc_ov: len:48
148 cond_exc_no: len:48
149 cond_exc_c: len:48
150 cond_exc_nc: len:48
151 cond_exc_iov: len:48
152 cond_exc_ic: len:48
153 long_mul: dest:i src1:i src2:i len:48
154 long_mul_imm: dest:i src1:i src2:i len:48
155 long_div: dest:a src1:a src2:i len:48 clob:d
156 long_div_un: dest:a src1:a src2:i len:48 clob:d
157 long_rem: dest:d src1:a src2:i len:48 clob:a
158 long_rem_un: dest:d src1:a src2:i len:48 clob:a
159 long_shl: dest:i src1:i src2:s len:48
160 long_shr: dest:i src1:i src2:s len:48
161 long_shr_un: dest:i src1:i src2:s len:48
162 long_conv_to_r4: dest:f src1:i len:48
163 long_conv_to_r8: dest:f src1:i len:48
164 long_conv_to_ovf_i: dest:i src1:i src2:i len:48
165 long_mul_ovf: dest:i src1:i src2:i len:48
166 long_mul_ovf_un: dest:i src1:i src2:i len:48
167 long_conv_to_r_un: dest:f src1:i src2:i len:48 
168 long_shr_imm: dest:i src1:i len:48
169 long_shr_un_imm: dest:i src1:i len:48
170 long_shl_imm: dest:i src1:i len:48
171 float_beq: len:48
172 float_bne_un: len:48
173 float_blt: len:48
174 float_blt_un: len:48
175 float_bgt: len:48
176 float_btg_un: len:48
177 float_bge: len:48
178 float_bge_un: len:48
179 float_ble: len:48
180 float_ble_un: len:48
181 float_add: dest:f src1:f src2:f len:48
182 float_sub: dest:f src1:f src2:f len:48
183 float_mul: dest:f src1:f src2:f len:48
184 float_div: dest:f src1:f src2:f len:48
185 float_div_un: dest:f src1:f src2:f len:48
186 float_rem: dest:f src1:f src2:f len:48
187 float_rem_un: dest:f src1:f src2:f len:48
188 float_neg: dest:f src1:f len:48
189 float_not: dest:f src1:f len:48
190 float_conv_to_i1: dest:i src1:f len:112
191 float_conv_to_i2: dest:i src1:f len:112
192 float_conv_to_i4: dest:i src1:f len:112
193 float_conv_to_i8: dest:i src1:f len:112
194 float_conv_to_r4: dest:f src1:f len:112
195 float_conv_to_r8: dest:f src1:f len:112
196 float_conv_to_u4: dest:i src1:f len:112
197 float_conv_to_u8: dest:i src1:f len:112
198 float_conv_to_u2: dest:i src1:f len:112
199 float_conv_to_u1: dest:i src1:f len:112
200 float_conv_to_i: dest:i src1:f len:112
201 float_conv_to_ovf_i: dest:a src1:f len:112
202 float_conv_to_ovd_u: dest:a src1:f len:112
203 float_mul_ovf: 
204 float_ceq: dest:i src1:f src2:f len:48
205 float_cgt: dest:i src1:f src2:f len:48
206 float_cgt_un: dest:i src1:f src2:f len:48
207 float_clt: dest:i src1:f src2:f len:48
208 float_clt_un: dest:i src1:f src2:f len:48
209 float_ceq_membase: dest:i src1:f src2:b len:48
210 float_cgt_membase: dest:i src1:f src2:b len:48
211 float_cgt_un_membase: dest:i src1:f src2:b len:48
212 float_clt_membase: dest:i src1:f src2:b len:48
213 float_clt_un_membase: dest:i src1:f src2:b len:48
214 float_conv_to_u: dest:i src1:f len:48
215 fmove: dest:f src1:f len:48
216 call_handler: len:96
217 start_handler: len:96
218 op_endfilter: len:96
219 endfinally: len:96
220 endfilter: len:96
221 aot_const: dest:i len:48
222 tls_get: dest:i len:48
223 atomic_add_i4: src1:b src2:i dest:i len:48
224 atomic_add_new_i4: src1:b src2:i dest:i len:48
225 atomic_exchange_i4: src1:b src2:i dest:i len:48
226 atomic_add_i8: src1:b src2:i dest:i len:48
227 atomic_add_new_i8: src1:b src2:i dest:i len:48
228 atomic_add_imm_new_i4: src1:b dest:i len:48
229 atomic_add_imm_new_i8: src1:b dest:i len:48
230 atomic_exchange_i8: src1:b src2:i dest:i len:48
231 memory_barrier: len:48
232 adc: dest:i src1:i src2:i len:48
233 addcc: dest:i src1:i src2:i len:48
234 subcc: dest:i src1:i src2:i len:48
235 adc_imm: dest:i src1:i len:48
236 sbb: dest:i src1:i src2:i len:48
237 sbb_imm: dest:i src1:i len:48
238 br_reg: src1:i len:48
239 sin: dest:f src1:f len:48
240 cos: dest:f src1:f len:48
241 abs: dest:f src1:f len:48
242 tan: dest:f src1:f len:48
243 atan: dest:f src1:f len:48
244 sqrt: dest:f src1:f len:48
245 op_bigmul: len:48 dest:i src1:a src2:i
246 op_bigmul_un: len:48 dest:i src1:a src2:i
247 sext_i1: dest:i src1:i len:48
248 sext_i2: dest:i src1:i len:48
249 sext_i4: dest:i src1:i len:48
250 zext_i1: dest:i src1:i len:48
251 zext_i2: dest:i src1:i len:48
252 zext_i4: dest:i src1:i len:48
253
254 # 32 bit opcodes
255 int_add: dest:i src1:i src2:i len:48
256 int_sub: dest:i src1:i src2:i len:48
257 int_mul: dest:i src1:i src2:i len:48
258 int_mul_ovf: dest:i src1:i src2:i len:48
259 int_mul_ovf_un: dest:i src1:i src2:i len:48
260 int_div: dest:a src1:a src2:i clob:d len:48
261 int_div_un: dest:a src1:a src2:i clob:d len:48
262 int_rem: dest:d src1:a src2:i clob:a len:48
263 int_rem_un: dest:d src1:a src2:i clob:a len:48
264 int_and: dest:i src1:i src2:i len:48
265 int_or: dest:i src1:i src2:i len:48
266 int_xor: dest:i src1:i src2:i len:48
267 int_shl: dest:i src1:i src2:s len:48
268 int_shr: dest:i src1:i src2:s len:48
269 int_shr_un: dest:i src1:i src2:s len:48
270 int_adc: dest:i src1:i src2:i len:48
271 int_adc_imm: dest:i src1:i len:48
272 int_sbb: dest:i src1:i src2:i len:48
273 int_sbb_imm: dest:i src1:i len:48
274 int_addcc: dest:i src1:i src2:i len:96
275 int_subcc: dest:i src1:i src2:i len:96
276 int_add_imm: dest:i src1:i len:48
277 int_sub_imm: dest:i src1:i len:48
278 int_mul_imm: dest:i src1:i len:48
279 int_div_imm: dest:a src1:i clob:d len:48
280 int_div_un_imm: dest:a src1:i clob:d len:48
281 int_rem_imm: dest:d src1:i clob:a len:48
282 int_rem_un_imm: dest:d src1:i clob:a len:48
283 int_and_imm: dest:i src1:i len:48
284 int_or_imm: dest:i src1:i len:48
285 int_xor_imm: dest:i src1:i len:48
286 int_shl_imm: dest:i src1:i len:48
287 int_shr_imm: dest:i src1:i len:48
288 int_shr_un_imm: dest:i src1:i len:48
289 int_neg: dest:i src1:i len:48
290 int_not: dest:i src1:i len:48
291 int_ceq: dest:c len:48
292 int_cgt: dest:c len:48
293 int_cgt_un: dest:c len:48
294 int_clt: dest:c len:48
295 int_clt_un: dest:c len:48
296 int_beq: len:48
297 int_bne_un: len:48
298 int_blt: len:48
299 int_blt_un: len:48
300 int_bgt: len:48
301 int_bgt_un: len:48
302 int_bge: len:48
303 int_bge_un: len:48
304 int_ble: len:48
305 int_ble_un: len:48
306
307 ia64_cmp4_eq: src1:i src2:i len:48
308 ia64_cmp4_ne: src1:i src2:i len:48
309 ia64_cmp4_le: src1:i src2:i len:48
310 ia64_cmp4_lt: src1:i src2:i len:48
311 ia64_cmp4_ge: src1:i src2:i len:48
312 ia64_cmp4_gt: src1:i src2:i len:48
313 ia64_cmp4_le_un: src1:i src2:i len:48
314 ia64_cmp4_lt_un: src1:i src2:i len:48
315 ia64_cmp4_ge_un: src1:i src2:i len:48
316 ia64_cmp4_gt_un: src1:i src2:i len:48
317 ia64_cmp_eq: src1:i src2:i len:48
318 ia64_cmp_ne: src1:i src2:i len:48
319 ia64_cmp_le: src1:i src2:i len:48
320 ia64_cmp_lt: src1:i src2:i len:48
321 ia64_cmp_ge: src1:i src2:i len:48
322 ia64_cmp_gt: src1:i src2:i len:48
323 ia64_cmp_lt_un: src1:i src2:i len:48
324 ia64_cmp_gt_un: src1:i src2:i len:48
325 ia64_cmp_le_un: src1:i src2:i len:48
326 ia64_cmp_ge_un: src1:i src2:i len:48
327
328 ia64_cmp4_eq_imm: src2:i len:48
329 ia64_cmp4_ne_imm: src2:i len:48
330 ia64_cmp4_le_imm: src2:i len:48
331 ia64_cmp4_lt_imm: src2:i len:48
332 ia64_cmp4_ge_imm: src2:i len:48
333 ia64_cmp4_gt_imm: src2:i len:48
334 ia64_cmp4_le_un_imm: src2:i len:48
335 ia64_cmp4_lt_un_imm: src2:i len:48
336 ia64_cmp4_ge_un_imm: src2:i len:48
337 ia64_cmp4_gt_un_imm: src2:i len:48
338 ia64_cmp_eq_imm: src2:i len:48
339 ia64_cmp_ne_imm: src2:i len:48
340 ia64_cmp_le_imm: src2:i len:48
341 ia64_cmp_lt_imm: src2:i len:48
342 ia64_cmp_ge_imm: src2:i len:48
343 ia64_cmp_gt_imm: src2:i len:48
344 ia64_cmp_lt_un_imm: src2:i len:48
345 ia64_cmp_gt_un_imm: src2:i len:48
346 ia64_cmp_le_un_imm: src2:i len:48
347 ia64_cmp_ge_un_imm: src2:i len:48
348
349 ia64_fcmp_eq: src1:f src2:f len:48
350 ia64_fcmp_ne: src1:f src2:f len:48
351 ia64_fcmp_le: src1:f src2:f len:48
352 ia64_fcmp_lt: src1:f src2:f len:48
353 ia64_fcmp_ge: src1:f src2:f len:48
354 ia64_fcmp_gt: src1:f src2:f len:48
355 ia64_fcmp_lt_un: src1:f src2:f len:96
356 ia64_fcmp_gt_un: src1:f src2:f len:96
357 ia64_fcmp_le_un: src1:f src2:f len:96
358 ia64_fcmp_ge_un: src1:f src2:f len:96
359
360 ia64_br_cond: len:48
361 ia64_cond_exc: len:48
362 ia64_cset: dest:i len:48
363
364 ia64_storei8_membase_inc_reg: dest:b src1:i len:48
365 ia64_storei1_membase_inc_reg: dest:b src1:c len:48
366 ia64_storei2_membase_inc_reg: dest:b src1:i len:48
367 ia64_storei4_membase_inc_reg: dest:b src1:i len:48
368 ia64_storer4_membase_inc_reg: dest:b src1:f len:48
369 ia64_storer8_membase_inc_reg: dest:b src1:f len:48
370 # 'b' tells the register allocator to avoid allocating sreg1 and dreg to the
371 # same physical register
372 ia64_loadi1_membase_inc: dest:b src1:i len:48
373 ia64_loadu1_membase_inc: dest:b src1:i len:48
374 ia64_loadi2_membase_inc: dest:b src1:i len:48
375 ia64_loadu2_membase_inc: dest:b src1:i len:48
376 ia64_loadi4_membase_inc: dest:b src1:i len:48
377 ia64_loadu4_membase_inc: dest:b src1:i len:48
378 ia64_loadi8_membase_inc: dest:b src1:i len:48
379 ia64_loadr4_membase_inc: dest:b src1:i len:48
380 ia64_loadr8_membase_inc: dest:b src1:i len:48