[tests] Reenable enum equals test on interpreter (#18673)
[mono-project.git] / mono / mini / cpu-arm64.md
blob6b8488c04688c2bab328f6bae97dcfa105c5dbaf
1 # Copyright 2011-2013 Xamarin, Inc (http://www.xamarin.com)
2 # Copyright 2003-2011 Novell, Inc (http://www.novell.com)
3 # Licensed under the MIT license. See LICENSE file in the project root for full license information.
4 # arm64 cpu description file
5 # this file is read by genmdesc to pruduce a table with all the relevant information
6 # about the cpu instructions that may be used by the regsiter allocator, the scheduler
7 # and other parts of the arch-dependent part of mini.
9 # An opcode name is followed by a colon and optional specifiers.
10 # A specifier has a name, a colon and a value. Specifiers are separated by white space.
11 # Here is a description of the specifiers valid for this file and their possible values.
13 # dest:register       describes the destination register of an instruction
14 # src1:register       describes the first source register of an instruction
15 # src2:register       describes the second source register of an instruction
17 # register may have the following values:
18 #       i  integer register
19 #       a  r3 register (output from calls)
20 #       b  base register (used in address references)
21 #       f  floating point register
22 #       g  floating point register returned in r0:r1 for soft-float mode
24 # len:number         describe the maximun length in bytes of the instruction
25 # number is a positive integer
27 # cost:number        describe how many cycles are needed to complete the instruction (unused)
29 # clob:spec          describe if the instruction clobbers registers or has special needs
31 # spec can be one of the following characters:
32 #       c  clobbers caller-save registers
33 #       r  'reserves' the destination register until a later instruction unreserves it
34 #          used mostly to set output registers in function calls
36 # flags:spec        describe if the instruction uses or sets the flags (unused)
38 # spec can be one of the following chars:
39 #       s  sets the flags
40 #       u  uses the flags
41 #       m  uses and modifies the flags
43 # res:spec          describe what units are used in the processor (unused)
45 # delay:            describe delay slots (unused)
47 # the required specifiers are: len, clob (if registers are clobbered), the registers
48 # specifiers if the registers are actually used, flags (when scheduling is implemented).
50 # See the code in mini-x86.c for more details on how the specifiers are used.
52 nop: len:4
53 relaxed_nop: len:4
54 break: len:20
55 br: len:16
56 switch: src1:i len:12
57 # See the comment in resume_from_signal_handler, we can't copy the fp regs from sigctx to MonoContext on linux,
58 # since the corresponding sigctx structures are not well defined.
59 seq_point: len:40 clob:c
60 il_seq_point: len:0
62 throw: src1:i len:24
63 rethrow: src1:i len:20
64 start_handler: len:32
65 endfinally: len:32
66 call_handler: len:16 clob:c
67 endfilter: src1:i len:32
68 get_ex_obj: dest:i len:16
70 ckfinite: dest:f src1:f len:64
71 ceq: dest:i len:12
72 cgt: dest:i len:12
73 cgt_un: dest:i len:12
74 clt: dest:i len:12
75 clt_un: dest:i len:12
76 localloc: dest:i src1:i len:96
77 compare: src1:i src2:i len:4
78 compare_imm: src1:i len:20
79 fcompare: src1:f src2:f len:12
80 rcompare: src1:f src2:f len:12
81 arglist: src1:i len:12
82 setlret: src1:i src2:i len:12
83 check_this: src1:b len:4
84 call: dest:a clob:c len:32
85 call_reg: dest:a src1:i len:32 clob:c
86 call_membase: dest:a src1:b len:32 clob:c
87 voidcall: len:32 clob:c
88 voidcall_reg: src1:i len:32 clob:c
89 voidcall_membase: src1:b len:32 clob:c
90 fcall: dest:f len:32 clob:c
91 fcall_reg: dest:f src1:i len:32 clob:c
92 fcall_membase: dest:f src1:b len:32 clob:c
93 rcall: dest:f len:32 clob:c
94 rcall_reg: dest:f src1:i len:32 clob:c
95 rcall_membase: dest:f src1:b len:32 clob:c
96 lcall: dest:l len:32 clob:c
97 lcall_reg: dest:l src1:i len:32 clob:c
98 lcall_membase: dest:l src1:b len:32 clob:c
99 vcall: len:32 clob:c
100 vcall_reg: src1:i len:32 clob:c
101 vcall_membase: src1:b len:32 clob:c
103 tailcall: len:255 clob:c # FIXME len
104 tailcall_membase: src1:b len:255 clob:c # FIXME len
105 tailcall_reg: src1:b len:255 clob:c # FIXME len
107 # tailcall_parameter models the size of moving one parameter,
108 # so that the required size of a branch around a tailcall can
109 # be accurately estimated; something like:
110 # void f1(volatile long *a)
111 # {
112 # a[large] = a[another large]
113 # }
115 # This is two instructions typically, but can be 6 for frames larger than 32K.
116 # FIXME A fixed size sequence to move parameters would moot this.
117 tailcall_parameter: len:24
119 iconst: dest:i len:16
120 r4const: dest:f len:24
121 r8const: dest:f len:20
122 label: len:0
123 store_membase_imm: dest:b len:20
124 store_membase_reg: dest:b src1:i len:20
125 storei1_membase_imm: dest:b len:20
126 storei1_membase_reg: dest:b src1:i len:12
127 storei2_membase_imm: dest:b len:20
128 storei2_membase_reg: dest:b src1:i len:12
129 storei4_membase_imm: dest:b len:20
130 storei4_membase_reg: dest:b src1:i len:20
131 storer4_membase_reg: dest:b src1:f len:20
132 storer8_membase_reg: dest:b src1:f len:24
133 store_memindex: dest:b src1:i src2:i len:4
134 storei1_memindex: dest:b src1:i src2:i len:4
135 storei2_memindex: dest:b src1:i src2:i len:4
136 storei4_memindex: dest:b src1:i src2:i len:4
137 load_membase: dest:i src1:b len:20
138 loadi1_membase: dest:i src1:b len:32
139 loadu1_membase: dest:i src1:b len:32
140 loadi2_membase: dest:i src1:b len:32
141 loadu2_membase: dest:i src1:b len:32
142 loadi4_membase: dest:i src1:b len:32
143 loadu4_membase: dest:i src1:b len:32
144 loadr4_membase: dest:f src1:b len:32
145 loadr8_membase: dest:f src1:b len:32
146 load_memindex: dest:i src1:b src2:i len:4
147 loadi1_memindex: dest:i src1:b src2:i len:4
148 loadu1_memindex: dest:i src1:b src2:i len:4
149 loadi2_memindex: dest:i src1:b src2:i len:4
150 loadu2_memindex: dest:i src1:b src2:i len:4
151 loadi4_memindex: dest:i src1:b src2:i len:4
152 loadu4_memindex: dest:i src1:b src2:i len:4
153 loadu4_mem: dest:i len:8
154 move: dest:i src1:i len:4
155 fmove: dest:f src1:f len:4
156 rmove: dest:f src1:f len:4
157 move_f_to_i4: dest:i src1:f len:8
158 move_i4_to_f: dest:f src1:i len:8
159 move_f_to_i8: dest:i src1:f len:4
160 move_i8_to_f: dest:f src1:i len:4
161 add_imm: dest:i src1:i len:12
162 sub_imm: dest:i src1:i len:12
163 mul_imm: dest:i src1:i len:12
164 and_imm: dest:i src1:i len:12
165 or_imm: dest:i src1:i len:12
166 xor_imm: dest:i src1:i len:12
167 shl_imm: dest:i src1:i len:8
168 shr_imm: dest:i src1:i len:8
169 shr_un_imm: dest:i src1:i len:8
170 cond_exc_eq: len:8
171 cond_exc_ne_un: len:8
172 cond_exc_lt: len:8
173 cond_exc_lt_un: len:8
174 cond_exc_gt: len:8
175 cond_exc_gt_un: len:8
176 cond_exc_ge: len:8
177 cond_exc_ge_un: len:8
178 cond_exc_le: len:8
179 cond_exc_le_un: len:8
180 cond_exc_ov: len:12
181 cond_exc_no: len:8
182 cond_exc_c: len:12
183 cond_exc_nc: len:8
184 #float_beq: src1:f src2:f len:20
185 #float_bne_un: src1:f src2:f len:20
186 #float_blt: src1:f src2:f len:20
187 #float_blt_un: src1:f src2:f len:20
188 #float_bgt: src1:f src2:f len:20
189 #float_bgt_un: src1:f src2:f len:20
190 #float_bge: src1:f src2:f len:20
191 #float_bge_un: src1:f src2:f len:20
192 #float_ble: src1:f src2:f len:20
193 #float_ble_un: src1:f src2:f len:20
194 float_add: dest:f src1:f src2:f len:4
195 float_sub: dest:f src1:f src2:f len:4
196 float_mul: dest:f src1:f src2:f len:4
197 float_div: dest:f src1:f src2:f len:4
198 float_div_un: dest:f src1:f src2:f len:4
199 float_rem: dest:f src1:f src2:f len:16
200 float_rem_un: dest:f src1:f src2:f len:16
201 float_neg: dest:f src1:f len:4
202 float_not: dest:f src1:f len:4
203 float_conv_to_i1: dest:i src1:f len:40
204 float_conv_to_i2: dest:i src1:f len:40
205 float_conv_to_i4: dest:i src1:f len:40
206 float_conv_to_i8: dest:l src1:f len:40
207 float_conv_to_r4: dest:f src1:f len:8
208 float_conv_to_u4: dest:i src1:f len:40
209 float_conv_to_u8: dest:l src1:f len:40
210 float_conv_to_u2: dest:i src1:f len:40
211 float_conv_to_u1: dest:i src1:f len:40
212 float_conv_to_i: dest:i src1:f len:40
213 float_ceq: dest:i src1:f src2:f len:16
214 float_cgt: dest:i src1:f src2:f len:16
215 float_cgt_un: dest:i src1:f src2:f len:20
216 float_clt: dest:i src1:f src2:f len:16
217 float_clt_un: dest:i src1:f src2:f len:20
218 float_cneq: dest:i src1:f src2:f len:20
219 float_cge: dest:i src1:f src2:f len:20
220 float_cle: dest:i src1:f src2:f len:20
221 float_conv_to_u: dest:i src1:f len:36
222 setfret: src1:f len:12
224 # R4 opcodes
225 r4_conv_to_i1: dest:i src1:f len:8
226 r4_conv_to_u1: dest:i src1:f len:8
227 r4_conv_to_i2: dest:i src1:f len:8
228 r4_conv_to_u2: dest:i src1:f len:8
229 r4_conv_to_i4: dest:i src1:f len:8
230 r4_conv_to_u4: dest:i src1:f len:8
231 r4_conv_to_i8: dest:l src1:f len:8
232 r4_conv_to_u8: dest:l src1:f len:8
233 r4_conv_to_r4: dest:f src1:f len:4
234 r4_conv_to_r8: dest:f src1:f len:4
235 r4_add: dest:f src1:f src2:f len:4
236 r4_sub: dest:f src1:f src2:f len:4
237 r4_mul: dest:f src1:f src2:f len:4
238 r4_div: dest:f src1:f src2:f len:4
239 r4_rem: dest:f src1:f src2:f len:16
240 r4_neg: dest:f src1:f len:4
241 r4_ceq: dest:i src1:f src2:f len:16
242 r4_cgt: dest:i src1:f src2:f len:16
243 r4_cgt_un: dest:i src1:f src2:f len:20
244 r4_clt: dest:i src1:f src2:f len:16
245 r4_clt_un: dest:i src1:f src2:f len:20
246 r4_cneq: dest:i src1:f src2:f len:20
247 r4_cge: dest:i src1:f src2:f len:20
248 r4_cle: dest:i src1:f src2:f len:20
250 aotconst: dest:i len:16
251 objc_get_selector: dest:i len:32
252 sqrt: dest:f src1:f len:4
253 adc: dest:i src1:i src2:i len:4
254 addcc: dest:i src1:i src2:i len:4
255 subcc: dest:i src1:i src2:i len:4
256 adc_imm: dest:i src1:i len:12
257 addcc_imm: dest:i src1:i len:12
258 subcc_imm: dest:i src1:i len:12
259 sbb: dest:i src1:i src2:i len:4
260 sbb_imm: dest:i src1:i len:12
261 br_reg: src1:i len:8
262 bigmul: len:8 dest:l src1:i src2:i
263 bigmul_un: len:8 dest:l src1:i src2:i
264 tls_get: dest:i len:32
265 tls_set: src1:i len:32
267 # 32 bit opcodes
268 int_add: dest:i src1:i src2:i len:4
269 int_sub: dest:i src1:i src2:i len:4
270 int_mul: dest:i src1:i src2:i len:4
271 int_div: dest:i src1:i src2:i len:72
272 int_div_un: dest:i src1:i src2:i len:72
273 int_rem: dest:i src1:i src2:i len:72
274 int_rem_un: dest:i src1:i src2:i len:72
275 int_and: dest:i src1:i src2:i len:4
276 int_or: dest:i src1:i src2:i len:4
277 int_xor: dest:i src1:i src2:i len:4
278 int_shl: dest:i src1:i src2:i len:4
279 int_shr: dest:i src1:i src2:i len:4
280 int_shr_un: dest:i src1:i src2:i len:4
281 int_neg: dest:i src1:i len:4
282 int_not: dest:i src1:i len:4
283 int_conv_to_i1: dest:i src1:i len:8
284 int_conv_to_i2: dest:i src1:i len:8
285 int_conv_to_i4: dest:i src1:i len:4
286 int_conv_to_r4: dest:f src1:i len:36
287 int_conv_to_r8: dest:f src1:i len:36
288 int_conv_to_u4: dest:i src1:i
289 int_conv_to_r_un: dest:f src1:i len:56
290 int_conv_to_u2: dest:i src1:i len:8
291 int_conv_to_u1: dest:i src1:i len:4
292 int_beq: len:16
293 int_bge: len:16
294 int_bgt: len:16
295 int_ble: len:16
296 int_blt: len:16
297 int_bne_un: len:16
298 int_bge_un: len:16
299 int_bgt_un: len:16
300 int_ble_un: len:16
301 int_blt_un: len:16
302 int_add_ovf: dest:i src1:i src2:i len:16
303 int_add_ovf_un: dest:i src1:i src2:i len:16
304 int_mul_ovf: dest:i src1:i src2:i len:16
305 int_mul_ovf_un: dest:i src1:i src2:i len:16
306 int_sub_ovf: dest:i src1:i src2:i len:16
307 int_sub_ovf_un: dest:i src1:i src2:i len:16
308 add_ovf_carry: dest:i src1:i src2:i len:16
309 sub_ovf_carry: dest:i src1:i src2:i len:16
310 add_ovf_un_carry: dest:i src1:i src2:i len:16
311 sub_ovf_un_carry: dest:i src1:i src2:i len:16
313 arm_rsbs_imm: dest:i src1:i len:4
314 arm_rsc_imm: dest:i src1:i len:4
316 # Linear IR opcodes
317 dummy_use: src1:i len:0
318 dummy_iconst: dest:i len:0
319 dummy_i8const: dest:i len:0
320 dummy_r8const: dest:f len:0
321 dummy_r4const: dest:f len:0
322 not_reached: len:0
323 not_null: src1:i len:0
325 int_adc: dest:i src1:i src2:i len:4
326 int_addcc: dest:i src1:i src2:i len:4
327 int_subcc: dest:i src1:i src2:i len:4
328 int_sbb: dest:i src1:i src2:i len:4
329 int_adc_imm: dest:i src1:i len:12
330 int_sbb_imm: dest:i src1:i len:12
332 int_add_imm: dest:i src1:i len:12
333 int_sub_imm: dest:i src1:i len:12
334 int_mul_imm: dest:i src1:i len:12
335 int_div_imm: dest:i src1:i len:20
336 int_div_un_imm: dest:i src1:i len:12
337 int_rem_imm: dest:i src1:i len:28
338 int_rem_un_imm: dest:i src1:i len:16
339 int_and_imm: dest:i src1:i len:12
340 int_or_imm: dest:i src1:i len:12
341 int_xor_imm: dest:i src1:i len:12
342 int_shl_imm: dest:i src1:i len:8
343 int_shr_imm: dest:i src1:i len:8
344 int_shr_un_imm: dest:i src1:i len:8
346 int_ceq: dest:i len:12
347 int_cgt: dest:i len:12
348 int_cgt_un: dest:i len:12
349 int_clt: dest:i len:12
350 int_clt_un: dest:i len:12
352 int_cneq: dest:i len:12
353 int_cge: dest:i len:12
354 int_cle: dest:i len:12
355 int_cge_un: dest:i len:12
356 int_cle_un: dest:i len:12
358 cond_exc_ieq: len:16
359 cond_exc_ine_un: len:16
360 cond_exc_ilt: len:16
361 cond_exc_ilt_un: len:16
362 cond_exc_igt: len:16
363 cond_exc_igt_un: len:16
364 cond_exc_ige: len:16
365 cond_exc_ige_un: len:16
366 cond_exc_ile: len:16
367 cond_exc_ile_un: len:16
368 cond_exc_iov: len:20
369 cond_exc_ino: len:16
370 cond_exc_ic: len:20
371 cond_exc_inc: len:16
373 icompare: src1:i src2:i len:4
374 icompare_imm: src1:i len:12
376 long_conv_to_ovf_i4_2: dest:i src1:i src2:i len:36
378 vcall2: len:40 clob:c
379 vcall2_reg: src1:i len:40 clob:c
380 vcall2_membase: src1:b len:40 clob:c
381 dyn_call: src1:i src2:i len:216 clob:c
383 # This is different from the original JIT opcodes
384 float_beq: len:32
385 float_bne_un: len:32
386 float_blt: len:32
387 float_blt_un: len:32
388 float_bgt: len:32
389 float_bgt_un: len:32
390 float_bge: len:32
391 float_bge_un: len:32
392 float_ble: len:32
393 float_ble_un: len:32
395 liverange_start: len:0
396 liverange_end: len:0
397 gc_liveness_def: len:0
398 gc_liveness_use: len:0
399 gc_spill_slot_liveness_def: len:0
400 gc_param_slot_liveness_def: len:0
402 # 64 bit opcodes
403 i8const: dest:i len:16
404 sext_i4: dest:i src1:i len:4
405 zext_i4: dest:i src1:i len:4
406 jump_table: dest:i len:16
407 long_add: dest:i src1:i src2:i len:4
408 long_sub: dest:i src1:i src2:i len:4
409 long_mul: dest:i src1:i src2:i len:4
410 long_div: dest:i src1:i src2:i len:80
411 long_div_un: dest:i src1:i src2:i len:64
412 long_rem: dest:i src1:i src2:i len:80
413 long_rem_un: dest:i src1:i src2:i len:64
414 long_and: dest:i src1:i src2:i len:4
415 long_or: dest:i src1:i src2:i len:4
416 long_xor: dest:i src1:i src2:i len:4
417 long_shl: dest:i src1:i src2:i len:4
418 long_shr: dest:i src1:i src2:i len:4
419 long_shr_un: dest:i src1:i src2:i len:4
420 long_neg: dest:i src1:i len:4
421 long_not: dest:i src1:i len:4
422 long_add_imm: dest:i src1:i len:12
423 long_sub_imm: dest:i src1:i len:12
424 long_mul_imm: dest:i src1:i len:12
425 long_and_imm: dest:i src1:i len:12
426 long_or_imm: dest:i src1:i len:12
427 long_xor_imm: dest:i src1:i len:12
428 long_shl_imm: dest:i src1:i len:12
429 long_shr_imm: dest:i src1:i len:12
430 long_shr_un_imm: dest:i src1:i len:12
431 long_add_ovf: dest:i src1:i src2:i len:16
432 long_add_ovf_un: dest:i src1:i src2:i len:16
433 long_mul_ovf: dest:i src1:i src2:i len:16
434 long_mul_ovf_un: dest:i src1:i src2:i len:16
435 long_sub_ovf: dest:i src1:i src2:i len:16
436 long_sub_ovf_un: dest:i src1:i src2:i len:16
437 lcompare: src1:i src2:i len:4
438 lcompare_imm: src1:i len:20
439 long_beq: len:4
440 long_bge: len:4
441 long_bgt: len:4
442 long_ble: len:4
443 long_blt: len:4
444 long_bne_un: len:4
445 long_bge_un: len:4
446 long_bgt_un: len:4
447 long_ble_un: len:4
448 long_blt_un: len:4
449 long_ceq: dest:i len:12
450 long_cgt: dest:i len:12
451 long_cgt_un: dest:i len:12
452 long_clt: dest:i len:12
453 long_clt_un: dest:i len:12
454 long_conv_to_i1: dest:i src1:i len:4
455 long_conv_to_i2: dest:i src1:i len:4
456 long_conv_to_u1: dest:i src1:i len:4
457 long_conv_to_u2: dest:i src1:i len:4
458 long_conv_to_r8: dest:f src1:i len:8
459 long_conv_to_r4: dest:f src1:i len:12
460 loadi8_membase: dest:i src1:b len:12
461 storei8_membase_imm: dest:b len:20
462 storei8_membase_reg: dest:b src1:i len:12
463 long_conv_to_r_un: dest:f src1:i len:8
464 arm_setfreg_r4: dest:f src1:f len:8
465 localloc_imm: dest:i len:64
466 arm64_cbzw: src1:i len:16
467 arm64_cbzx: src1:i len:16
468 arm64_cbnzw: src1:i len:16
469 arm64_cbnzx: src1:i len:16
471 atomic_add_i4: dest:i src1:i src2:i len:32
472 atomic_add_i8: dest:i src1:i src2:i len:32
473 atomic_exchange_i4: dest:i src1:i src2:i len:32
474 atomic_exchange_i8: dest:i src1:i src2:i len:32
475 atomic_cas_i4: dest:i src1:i src2:i src3:i len:32
476 atomic_cas_i8: dest:i src1:i src2:i src3:i len:32
477 memory_barrier: len:8 clob:a
478 atomic_load_i1: dest:i src1:b len:24
479 atomic_load_u1: dest:i src1:b len:24
480 atomic_load_i2: dest:i src1:b len:24
481 atomic_load_u2: dest:i src1:b len:24
482 atomic_load_i4: dest:i src1:b len:24
483 atomic_load_u4: dest:i src1:b len:24
484 atomic_load_i8: dest:i src1:b len:20
485 atomic_load_u8: dest:i src1:b len:20
486 atomic_load_r4: dest:f src1:b len:28
487 atomic_load_r8: dest:f src1:b len:24
488 atomic_store_i1: dest:b src1:i len:20
489 atomic_store_u1: dest:b src1:i len:20
490 atomic_store_i2: dest:b src1:i len:20
491 atomic_store_u2: dest:b src1:i len:20
492 atomic_store_i4: dest:b src1:i len:20
493 atomic_store_u4: dest:b src1:i len:20
494 atomic_store_i8: dest:b src1:i len:20
495 atomic_store_u8: dest:b src1:i len:20
496 atomic_store_r4: dest:b src1:f len:28
497 atomic_store_r8: dest:b src1:f len:24
499 generic_class_init: src1:a len:44 clob:c
500 gc_safe_point: src1:i len:12 clob:c
502 fill_prof_call_ctx: src1:i len:128