2008-03-19 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mono / mini / inssel-long.brg
blob1c878a55003487b7c69eaabb0ac3499de9fbfb54
1 %%
4 # inssel-long.brg: burg file for 64bit architectures
6 # Author:
7 #   Dietmar Maurer (dietmar@ximian.com)
9 # (C) 2002 Ximian, Inc.
12 reg: OP_I8CONST {
13         MONO_EMIT_NEW_I8CONST (s, state->reg1, tree->inst_l);
16 reg: CEE_LDIND_I8 (base) {
17         MONO_EMIT_LOAD_MEMBASE_OP (s, tree, OP_LOADI8_MEMBASE, state->reg1, 
18                                    state->left->tree->inst_basereg, state->left->tree->inst_offset);
21 stmt: CEE_STIND_I8 (base, reg) {
22         MONO_EMIT_STORE_MEMBASE (s, tree, OP_STOREI8_MEMBASE_REG, state->left->tree->inst_basereg,
23                                  state->left->tree->inst_offset, state->right->reg1);
26 stmt: CEE_STIND_REF (base, OP_I8CONST),
27 stmt: CEE_STIND_I (base, OP_I8CONST),
28 stmt: CEE_STIND_I8 (base, OP_I8CONST),
29 stmt: CEE_STIND_REF (base, OP_ICONST),
30 stmt: CEE_STIND_I (base, OP_ICONST),
31 stmt: CEE_STIND_I8 (base, OP_ICONST) {
32         MONO_EMIT_STORE_MEMBASE_IMM (s, tree, OP_STOREI8_MEMBASE_IMM, state->left->tree->inst_basereg,
33                                      state->left->tree->inst_offset, state->right->tree->inst_l);
36 stmt: CEE_STIND_I8 (reg, reg) {
37         MONO_EMIT_STORE_MEMBASE (s, tree, OP_STOREI8_MEMBASE_REG, state->left->tree->inst_basereg,
38                                  state->left->tree->inst_offset, state->right->reg1);
41 base: OP_LADD (base, OP_ICONST) "0" {
42         tree->inst_offset = state->left->tree->inst_offset + state->right->tree->inst_c0;
43         tree->inst_basereg = state->left->tree->inst_basereg;
46 base: OP_LADD (CEE_LDIND_REF (OP_REGVAR), OP_ICONST),
47 base: OP_LADD (CEE_LDIND_I (OP_REGVAR), OP_ICONST) "0" {
48         tree->inst_offset = state->right->tree->inst_c0;
49         tree->inst_basereg = state->left->left->tree->dreg;
52 reg: OP_LADD (reg, reg) {
53         MONO_EMIT_NEW_BIALU (s, CEE_ADD, state->reg1, state->left->reg1, state->right->reg1);
56 reg: OP_LADD (reg, OP_ICONST) {
57         MONO_EMIT_BIALU_IMM (s, tree, OP_ADD_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
60 reg: OP_LADD (reg, OP_ICONST) {
61         MONO_EMIT_BIALU_IMM (s, tree, OP_ADD_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
64 reg: OP_LADD (CEE_LDIND_I (OP_REGVAR), OP_ICONST),
65 reg: OP_LADD (CEE_LDIND_REF (OP_REGVAR), OP_ICONST) {
66         MONO_EMIT_BIALU_IMM (s, tree, OP_ADD_IMM, state->reg1, state->left->left->tree->dreg, state->right->tree->inst_c0);
69 reg: OP_LSUB (reg, reg) {
70         MONO_EMIT_NEW_BIALU (s, CEE_SUB, state->reg1, state->left->reg1, state->right->reg1);
73 reg: OP_LNEG (reg) {
74         MONO_EMIT_NEW_UNALU (s, CEE_NEG, state->reg1, state->left->reg1);
77 reg: OP_LNOT (reg) {
78         MONO_EMIT_NEW_UNALU (s, CEE_NOT, state->reg1, state->left->reg1);
81 reg: OP_LAND (reg, reg) {
82         MONO_EMIT_NEW_BIALU (s, CEE_AND, state->reg1, state->left->reg1, state->right->reg1);
85 reg: OP_LOR (reg, reg) {
86         MONO_EMIT_NEW_BIALU (s, CEE_OR, state->reg1, state->left->reg1, state->right->reg1);
89 reg: OP_LXOR (reg, reg) {
90         MONO_EMIT_NEW_BIALU (s, CEE_XOR, state->reg1, state->left->reg1, state->right->reg1);
94 reg: OP_LADD_OVF (reg, reg) {
95         MONO_EMIT_NEW_BIALU (s, OP_ADDCC, state->reg1, state->left->reg1, state->right->reg1);
96         MONO_EMIT_NEW_COND_EXC (s, OV, "OverflowException");
99 reg: OP_LADD_OVF_UN (reg, reg) {
100         MONO_EMIT_NEW_BIALU (s, OP_ADDCC, state->reg1, state->left->reg1, state->right->reg1);
101         MONO_EMIT_NEW_COND_EXC (s, C, "OverflowException");
104 reg: OP_LSUB_OVF (reg, reg) {
105         MONO_EMIT_NEW_BIALU (s, OP_SUBCC, state->reg1, state->left->reg1, state->right->reg1);
106         MONO_EMIT_NEW_COND_EXC (s, OV, "OverflowException");
109 reg: OP_LSUB_OVF_UN (reg, reg) {
110         MONO_EMIT_NEW_BIALU (s, OP_SUBCC, state->reg1, state->left->reg1, state->right->reg1);
111         MONO_EMIT_NEW_COND_EXC (s, C, "OverflowException");
114 reg: OP_LONG_SHRUN_32 (reg) {
115         MONO_EMIT_BIALU_IMM (s, tree, OP_LSHR_UN_IMM, state->reg1, state->left->reg1, 32);
119 # shift operations
122 reg: OP_LSHL (reg, reg) {
123         MONO_EMIT_BIALU (s, tree, tree->opcode, state->reg1, state->left->reg1, state->right->reg1);
126 reg: OP_LSHL (reg, OP_ICONST) {
127         MONO_EMIT_BIALU_IMM (s, tree, OP_LSHL_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
130 reg: OP_LSHR (reg, reg) {
131         MONO_EMIT_BIALU (s, tree, tree->opcode, state->reg1, state->left->reg1, state->right->reg1);
134 reg: OP_LSHR (reg, OP_ICONST) {
135         MONO_EMIT_BIALU_IMM (s, tree, OP_LSHR_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
138 reg: OP_LSHR_UN (reg, reg) {
139         MONO_EMIT_BIALU (s, tree, tree->opcode, state->reg1, state->left->reg1, state->right->reg1);
142 reg: OP_LSHR_UN (reg, OP_ICONST) {
143         MONO_EMIT_BIALU_IMM (s, tree, OP_LSHR_UN_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
147 # Conversions
150 reg: CEE_CONV_I8 (reg) {
151         /* Sign extend the value in the lower word into the upper word */
152         tree->sreg1 = state->left->reg1;
153         tree->dreg = state->reg1;
154         mono_bblock_add_inst (s->cbb, tree);    
157 reg: CEE_CONV_U8 (reg) {
158         /* Clean out the upper word */
159         /* Sign extend the value in the lower word into the upper word */
160         tree->sreg1 = state->left->reg1;
161         tree->dreg = state->reg1;
162         mono_bblock_add_inst (s->cbb, tree);
165 i8con: CEE_CONV_U8 (OP_ICONST) "0" {
166         /*
167          * This is needed since constant propagation eliminates some 
168      * stind.i4/ldind.i4 pairs, along with the conversions done by them.
169          */
170         int data = state->left->tree->inst_c0;
171         tree->opcode = OP_I8CONST;
172         tree->inst_ls_word = data;
173         tree->inst_ms_word = 0;
176 reg: OP_FCONV_TO_I8 (freg) {
177         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
180 reg: OP_FCONV_TO_U8 (freg) {
181         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
184 reg: OP_LCONV_TO_I4 (i8con) {
185      MONO_EMIT_NEW_ICONST (s, state->reg1, state->left->tree->inst_ls_word);
188 reg: OP_LCONV_TO_I4 (reg) {
189         /* Sign extend the value in the lower word into the upper word */
190         MONO_EMIT_BIALU_IMM (s, tree, OP_LSHR_IMM, state->reg1, state->left->reg1, 0);
193 reg: OP_LCONV_TO_U4 (reg) {
194         /* Clean out the upper word */
195         MONO_EMIT_BIALU_IMM (s, tree, OP_ISHR_UN_IMM, state->reg1, state->left->reg1, 0);
198 reg: OP_LCONV_TO_U8 (reg) {
199         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
202 reg: OP_LCONV_TO_I8 (reg) {
203         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
206 reg: OP_LCONV_TO_U (reg) {
207         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
210 reg: OP_LCONV_TO_I (reg) {
211         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
214 reg: OP_LCONV_TO_I1 (reg) {
215         MONO_EMIT_UNALU (s, tree, CEE_CONV_I1, state->reg1, state->left->reg1);
218 reg: OP_LCONV_TO_U1 (reg) {
219         MONO_EMIT_UNALU (s, tree, CEE_CONV_U1, state->reg1, state->left->reg1);
222 reg: OP_LCONV_TO_I2 (reg) {
223         MONO_EMIT_UNALU (s, tree, CEE_CONV_I2, state->reg1, state->left->reg1);
226 reg: OP_LCONV_TO_U2 (reg) {
227         MONO_EMIT_UNALU (s, tree, CEE_CONV_U2, state->reg1, state->left->reg1);
230 reg: OP_LCONV_TO_OVF_I1 (reg) {
231         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT, state->left->reg1, 127, "OverflowException");
232         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, LT, state->left->reg1, -128, "OverflowException");
233         MONO_EMIT_UNALU (s, tree, CEE_CONV_I1, state->reg1, state->left->reg1);
236 reg: OP_LCONV_TO_OVF_I1_UN (reg) {
237         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT_UN, state->left->reg1, 127, "OverflowException");
238         MONO_EMIT_UNALU (s, tree, CEE_CONV_I1, state->reg1, state->left->reg1);
241 reg: OP_LCONV_TO_OVF_U1 (reg) {
242         /* probe value to be within 0 to 255 */
243         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT_UN, state->left->reg1, 255, "OverflowException");
244         MONO_EMIT_BIALU_IMM (s, tree, OP_AND_IMM, state->reg1, state->left->reg1, 0xff);
247 reg: OP_LCONV_TO_OVF_U1_UN (reg) {
248         /* probe value to be within 0 to 255 */
249         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT_UN, state->left->reg1, 255, "OverflowException");
250         MONO_EMIT_BIALU_IMM (s, tree, OP_AND_IMM, state->reg1, state->left->reg1, 0xff);
253 reg: OP_LCONV_TO_OVF_I2 (reg) {
254         /* Probe value to be within -32768 and 32767 */
255         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT, state->left->reg1, 32767, "OverflowException");
256         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, LT, state->left->reg1, -32768, "OverflowException");
257         MONO_EMIT_UNALU (s, tree, CEE_CONV_I2, state->reg1, state->left->reg1);
260 reg: OP_LCONV_TO_OVF_I2_UN (reg) {
261         /* Probe value to be within 0 and 32767 */
262         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT_UN, state->left->reg1, 32767, "OverflowException");
263         MONO_EMIT_UNALU (s, tree, CEE_CONV_I2, state->reg1, state->left->reg1);
266 reg: OP_LCONV_TO_OVF_U2 (reg) {
267         /* Probe value to be within 0 and 65535 */
268         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT_UN, state->left->reg1, 0xffff, "OverflowException");
269         MONO_EMIT_BIALU_IMM (s, tree, OP_AND_IMM, state->reg1, state->left->reg1, 0xffff);
272 reg: OP_LCONV_TO_OVF_U2_UN (reg) {
273         /* Probe value to be within 0 and 65535 */
274         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT_UN, state->left->reg1, 0xffff, "OverflowException");
275         MONO_EMIT_BIALU_IMM (s, tree, OP_AND_IMM, state->reg1, state->left->reg1, 0xffff);
278 reg: OP_LCONV_TO_OVF_I4 (reg) {
279         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT, state->left->reg1, 0x7fffffff, "OverflowException");
280         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, LT, state->left->reg1, -2147483648, "OverflowException");
281         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
284 reg: OP_LCONV_TO_OVF_I4_UN (reg) {
285         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT_UN, state->left->reg1, 0x7fffffff, "OverflowException");
286         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
289 reg: OP_LCONV_TO_OVF_U4 (reg) {
290         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT, state->left->reg1, 0xffffffffUL, "OverflowException");
291         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, LT, state->left->reg1, 0, "OverflowException");
292         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
295 reg: OP_LCONV_TO_OVF_U4_UN (reg) {
296         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT_UN, state->left->reg1, 0xffffffff, "OverflowException");
297         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
300 reg: OP_LCONV_TO_OVF_I_UN (reg),
301 reg: OP_LCONV_TO_OVF_I8_UN (reg) {
302         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, LT, state->left->reg1, 0, "OverflowException");
303         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
306 reg: OP_LCONV_TO_OVF_U8 (reg) {
307         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, LT, state->left->reg1, 0, "OverflowException");
308         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
311 reg: OP_LCONV_TO_OVF_I8 (reg) {
312         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
315 reg: OP_LCONV_TO_OVF_U8_UN (reg) {
316         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
319 reg: OP_LCONV_TO_OVF_I (reg) {
320         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
323 freg: OP_LCONV_TO_R_UN (lreg) {
324         MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
327 reg: CEE_CONV_OVF_I8 (reg) {
328         /* Sign extend the value in the lower word into the upper word */
329         MONO_EMIT_UNALU (s, tree, CEE_CONV_I8, state->reg1, state->left->reg1);
332 reg: CEE_CONV_OVF_I8_UN (reg),
333 reg: CEE_CONV_OVF_U8_UN (reg),
334 reg: CEE_CONV_OVF_I_UN (reg),
335 reg: CEE_CONV_OVF_U_UN (reg) {
336         /* an unsigned 32 bit num always fits in an (un)signed 64 bit one */
337         /* Clean out the upper word */
338         MONO_EMIT_UNALU (s, tree, CEE_CONV_U8, state->reg1, state->left->reg1);
341 reg: CEE_CONV_OVF_U8 (reg) {
342         MONO_EMIT_NEW_COMPARE_IMM_EXC (s, LT, state->left->reg1, 0, "OverflowException");
343         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
346 reg: OP_LCALLVIRT (reg) {
347         mini_emit_virtual_call (s, state, tree, OP_LCALL, OP_LCALL_MEMBASE);
350 reg: OP_LCALL {
351         tree->dreg = state->reg1;
352         mono_bblock_add_inst (s->cbb, tree);
355 reg: OP_LCALL_RGCTX (reg) {
356         emit_rgctx_argument (s, tree, state->left->reg1, OP_LCALL);
358         tree->dreg = state->reg1;
359         mono_bblock_add_inst (s->cbb, tree);
362 reg: OP_LCALL_REG (reg) {
363         tree->sreg1 = state->left->reg1;
364         tree->dreg = state->reg1;
365         mono_bblock_add_inst (s->cbb, tree);
368 reg: OP_LCALL_REG_RGCTX (reg, reg) {
369         emit_rgctx_argument (s, tree, state->right->reg1, OP_LCALL_REG);
371         tree->sreg1 = state->left->reg1;
372         tree->dreg = state->reg1;
373         mono_bblock_add_inst (s->cbb, tree);
376 reg: OP_LCALL_REG (OP_ICONST) {
377         tree->opcode = OP_LCALL;
378         ((MonoCallInst*)tree)->fptr = state->left->tree->inst_p0;
379         tree->dreg = state->reg1;
380         mono_bblock_add_inst (s->cbb, tree);
385 stmt: CEE_STIND_I4 (OP_REGVAR, OP_ICONST) {
386         tree->inst_c0 = state->right->tree->inst_c0;
387         tree->opcode = OP_ICONST;
388         tree->dreg = state->left->tree->dreg;
389         mono_bblock_add_inst (s->cbb, tree);
392 stmt: CEE_STIND_I4 (OP_REGVAR, reg) {
393         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->left->tree->dreg, state->right->reg1);
396 stmt: CEE_STIND_I4 (OP_REGVAR, CEE_LDIND_I4 (OP_REGVAR)) {
397         MONO_EMIT_UNALU (s, tree, OP_MOVE, state->left->tree->dreg, state->right->left->tree->dreg);
400 stmt: CEE_STIND_I4 (OP_REGVAR, CEE_LDIND_I4 (base)) {
401         MONO_EMIT_LOAD_MEMBASE_OP (s, tree, OP_LOADI4_MEMBASE, state->left->tree->dreg, 
402                                    state->right->left->tree->inst_basereg, 
403                                    state->right->left->tree->inst_offset);
406 cflags: OP_LCOMPARE (reg, reg) {
407         tree->sreg1 = state->left->reg1;
408         tree->sreg2 = state->right->reg1;
409         mono_bblock_add_inst (s->cbb, tree);
412 cflags: OP_LCOMPARE (CEE_LDIND_I8 (OP_REGVAR), reg) {
413         tree->sreg1 = state->left->left->tree->dreg;
414         tree->sreg2 = state->right->reg1;
415         mono_bblock_add_inst (s->cbb, tree);
418 cflags: OP_LCOMPARE (CEE_LDIND_I (OP_REGVAR), CEE_LDIND_I (OP_REGVAR)) {
419         tree->sreg1 = state->left->left->tree->dreg;
420         tree->sreg2 = state->right->left->tree->dreg;
421         mono_bblock_add_inst (s->cbb, tree);
424 cflags: OP_LCOMPARE (CEE_LDIND_I8 (OP_REGVAR), OP_ICONST) {
425         tree->opcode = OP_COMPARE_IMM;
426         tree->sreg1 = state->left->left->tree->dreg;
427         tree->inst_imm = state->right->tree->inst_c0;
428         mono_bblock_add_inst (s->cbb, tree);
429 } cost {
430         MBCOND (mono_arch_is_inst_imm (state->right->tree->inst_c0));
432         return 0;
433 }       
435 cflags: OP_LCOMPARE (reg, OP_ICONST) {
436         tree->opcode = OP_COMPARE_IMM;
437         tree->sreg1 = state->left->reg1;
438         tree->inst_imm = state->right->tree->inst_c0;
439         mono_bblock_add_inst (s->cbb, tree);
440 } cost {
441         MBCOND (mono_arch_is_inst_imm (state->right->tree->inst_c0));
443         return 0;
444 }       
446 cflags: OP_LCOMPARE (reg, OP_I8CONST) {
447         tree->opcode = OP_COMPARE_IMM;
448         tree->sreg1 = state->left->reg1;
449         tree->inst_imm = state->right->tree->inst_l;
450         mono_bblock_add_inst (s->cbb, tree);
451 } cost {
452         MBCOND (mono_arch_is_inst_imm (state->right->tree->inst_l));
454         return 0;
455 }       
457 stmt: CEE_BNE_UN (cflags) {
458         mono_bblock_add_inst (s->cbb, tree);
461 stmt: CEE_BEQ (cflags) {
462         mono_bblock_add_inst (s->cbb, tree);
465 stmt: CEE_BLT (cflags) {
466         mono_bblock_add_inst (s->cbb, tree);
469 stmt: CEE_BLT_UN (cflags) {
470         mono_bblock_add_inst (s->cbb, tree);
473 stmt: CEE_BGT (cflags) {
474         mono_bblock_add_inst (s->cbb, tree);
477 stmt: CEE_BGT_UN (cflags) {
478         mono_bblock_add_inst (s->cbb, tree);
481 stmt: CEE_BGE  (cflags) {
482         mono_bblock_add_inst (s->cbb, tree);
485 stmt: CEE_BGE_UN (cflags) {
486         mono_bblock_add_inst (s->cbb, tree);
489 stmt: CEE_BLE  (cflags) {
490         mono_bblock_add_inst (s->cbb, tree);
493 stmt: CEE_BLE_UN (cflags) {
494         mono_bblock_add_inst (s->cbb, tree);
498 # 32 bit rules
502 # basic alu operations
505 reg: CEE_AND (reg, reg) {
506         MONO_EMIT_BIALU (s, tree, OP_IAND, state->reg1, state->left->reg1, state->right->reg1);
509 reg: CEE_AND (reg, OP_ICONST) {
510         MONO_EMIT_BIALU_IMM (s, tree, OP_IAND_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
513 reg: CEE_OR (reg, reg) {
514         MONO_EMIT_BIALU (s, tree, OP_IOR, state->reg1, state->left->reg1, state->right->reg1);
517 reg: CEE_OR (reg, OP_ICONST) {
518         MONO_EMIT_BIALU_IMM (s, tree, OP_IOR_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
521 reg: CEE_XOR (reg, reg) {
522         MONO_EMIT_BIALU (s, tree, OP_IXOR, state->reg1, state->left->reg1, state->right->reg1);
525 reg: CEE_XOR (reg, OP_ICONST) {
526         MONO_EMIT_BIALU_IMM (s, tree, OP_IXOR_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
529 reg: CEE_NEG (reg) {
530         MONO_EMIT_UNALU (s, tree, OP_INEG, state->reg1, state->left->reg1);
533 reg: CEE_NOT (reg) {
534         MONO_EMIT_UNALU (s, tree, OP_INOT, state->reg1, state->left->reg1);
537 reg: CEE_ADD (reg, reg) {
538         MONO_EMIT_BIALU (s, tree, OP_IADD, state->reg1, state->left->reg1, state->right->reg1);
541 reg: CEE_ADD (reg, OP_ICONST) {
542         MONO_EMIT_BIALU_IMM (s, tree, OP_IADD_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
545 reg: CEE_ADD_OVF (reg, reg) {
546         MONO_EMIT_NEW_BIALU (s, OP_IADDCC, state->reg1, state->left->reg1, state->right->reg1);
547         MONO_EMIT_NEW_COND_EXC (s, IOV, "OverflowException");
550 reg: CEE_ADD_OVF_UN (reg, reg) {
551         MONO_EMIT_NEW_BIALU (s, OP_IADDCC, state->reg1, state->left->reg1, state->right->reg1);
552         MONO_EMIT_NEW_COND_EXC (s, IC, "OverflowException");
555 reg: CEE_SUB (reg, reg) {
556         MONO_EMIT_BIALU (s, tree, OP_ISUB, state->reg1, state->left->reg1, state->right->reg1);
559 reg: CEE_SUB (reg, CEE_LDIND_I4 (OP_REGVAR)) {
560         MONO_EMIT_BIALU (s, tree, OP_ISUB, state->reg1, state->left->reg1, state->right->left->tree->dreg);
563 reg: CEE_SUB (reg, OP_ICONST) {
564         MONO_EMIT_BIALU_IMM (s, tree, OP_ISUB_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
567 reg: CEE_SUB_OVF (reg, reg) {
568         MONO_EMIT_NEW_BIALU (s, OP_ISUBCC, state->reg1, state->left->reg1, state->right->reg1);
569         MONO_EMIT_NEW_COND_EXC (s, IOV, "OverflowException");
572 reg: CEE_SUB_OVF_UN (reg, reg) {
573         MONO_EMIT_NEW_BIALU (s, OP_ISUBCC, state->reg1, state->left->reg1, state->right->reg1);
574         MONO_EMIT_NEW_COND_EXC (s, IC, "OverflowException");
578 # shift operations
581 reg: CEE_SHL (reg, reg) {
582         MONO_EMIT_BIALU (s, tree, OP_ISHL, state->reg1, state->left->reg1, state->right->reg1);
585 reg: CEE_SHL (reg, OP_ICONST) {
586         MONO_EMIT_BIALU_IMM (s, tree, OP_ISHL_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
589 reg: CEE_SHR (reg, reg) {
590         MONO_EMIT_BIALU (s, tree, OP_ISHR, state->reg1, state->left->reg1, state->right->reg1);
593 reg: CEE_SHR (reg, OP_ICONST) {
594         MONO_EMIT_BIALU_IMM (s, tree, OP_ISHR_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
597 reg: CEE_SHR_UN (reg, reg) {
598         MONO_EMIT_BIALU (s, tree, OP_ISHR_UN, state->reg1, state->left->reg1, state->right->reg1);
601 reg: CEE_SHR_UN (reg, OP_ICONST) {
602         MONO_EMIT_BIALU_IMM (s, tree, OP_ISHR_UN_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
606 # mult/div operations
609 reg: CEE_MUL (reg, reg) {
610         MONO_EMIT_BIALU (s, tree, OP_IMUL, state->reg1, state->left->reg1, state->right->reg1);
613 reg: CEE_MUL (reg, OP_ICONST) {
614         MONO_EMIT_BIALU_IMM (s, tree, OP_IMUL_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
617 reg: CEE_MUL_OVF (reg, reg) {
618         MONO_EMIT_BIALU (s, tree, OP_IMUL_OVF, state->reg1, state->left->reg1, state->right->reg1);
621 reg: CEE_MUL_OVF_UN (reg, reg) {
622         MONO_EMIT_BIALU (s, tree, OP_IMUL_OVF_UN, state->reg1, state->left->reg1, state->right->reg1);
625 reg: CEE_DIV (reg, reg) {
626         MONO_EMIT_BIALU (s, tree, OP_IDIV, state->reg1, state->left->reg1, state->right->reg1);
629 #reg: CEE_DIV (reg, OP_ICONST) {
630 #       MONO_EMIT_BIALU_IMM (s, tree, OP_IDIV_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
633 reg: CEE_DIV_UN (reg, reg) {
634         MONO_EMIT_BIALU (s, tree, OP_IDIV_UN, state->reg1, state->left->reg1, state->right->reg1);
637 #reg: CEE_DIV_UN (reg, OP_ICONST) {
638 #       MONO_EMIT_BIALU_IMM (s, tree, OP_IDIV_UN_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
641 reg: CEE_REM (reg, reg) {
642         MONO_EMIT_BIALU (s, tree, OP_IREM, state->reg1, state->left->reg1, state->right->reg1);
645 #reg: CEE_REM (reg, OP_ICONST) {
646 #       MONO_EMIT_BIALU_IMM (s, tree, OP_IREM_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
649 reg: CEE_REM_UN (reg, reg) {
650         MONO_EMIT_BIALU (s, tree, OP_IREM_UN, state->reg1, state->left->reg1, state->right->reg1);
653 #reg: CEE_REM_UN (reg, OP_ICONST) {
654 #       MONO_EMIT_BIALU_IMM (s, tree, OP_IREM_UN_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
657 reg: OP_IMUL_IMM (reg) {
658         tree->sreg1 = state->left->reg1;
659         tree->dreg = state->reg1;
660         mono_bblock_add_inst (s->cbb, tree);
663 reg: OP_LMUL_IMM (reg) {
664         tree->sreg1 = state->left->reg1;
665         tree->dreg = state->reg1;
666         mono_bblock_add_inst (s->cbb, tree);
669 c32flags: OP_COMPARE (reg, reg) {
670         tree->opcode = OP_ICOMPARE;
671         tree->sreg1 = state->left->reg1;
672         tree->sreg2 = state->right->reg1;
673         mono_bblock_add_inst (s->cbb, tree);
676 c32flags: OP_COMPARE (CEE_LDIND_I (OP_REGVAR), CEE_LDIND_I (OP_REGVAR)) {
677         tree->opcode = OP_ICOMPARE;
678         tree->sreg1 = state->left->left->tree->dreg;
679         tree->sreg2 = state->right->left->tree->dreg;
680         mono_bblock_add_inst (s->cbb, tree);
683 c32flags: OP_COMPARE (CEE_LDIND_I (OP_REGVAR), OP_ICONST) {
684         tree->opcode = OP_ICOMPARE_IMM;
685         tree->sreg1 = state->left->left->tree->dreg;
686         tree->inst_imm = state->right->tree->inst_c0;
687         mono_bblock_add_inst (s->cbb, tree);
690 c32flags: OP_COMPARE (CEE_LDIND_I4 (OP_REGVAR), reg) {
691         tree->opcode = OP_ICOMPARE;
692         tree->sreg1 = state->left->left->tree->dreg;
693         tree->sreg2 = state->right->reg1;
694         mono_bblock_add_inst (s->cbb, tree);
697 c32flags: OP_COMPARE (CEE_LDIND_I4 (OP_REGVAR), OP_ICONST) {
698         tree->opcode = OP_ICOMPARE_IMM;
699         tree->sreg1 = state->left->left->tree->dreg;
700         tree->inst_imm = state->right->tree->inst_c0;
701         mono_bblock_add_inst (s->cbb, tree);
704 c32flags: OP_COMPARE (reg, OP_ICONST) {
705         tree->opcode = OP_ICOMPARE_IMM;
706         tree->sreg1 = state->left->reg1;
707         tree->inst_imm = state->right->tree->inst_c0;
708         mono_bblock_add_inst (s->cbb, tree);
711 stmt: CEE_BNE_UN (c32flags) {
712         tree->opcode = OP_IBNE_UN;
713         mono_bblock_add_inst (s->cbb, tree);
716 stmt: CEE_BEQ (c32flags) {
717         tree->opcode = OP_IBEQ;
718         mono_bblock_add_inst (s->cbb, tree);
721 stmt: CEE_BLT (c32flags) {
722         tree->opcode = OP_IBLT;
723         mono_bblock_add_inst (s->cbb, tree);
726 stmt: CEE_BLT_UN (c32flags) {
727         tree->opcode = OP_IBLT_UN;
728         mono_bblock_add_inst (s->cbb, tree);
731 stmt: CEE_BGT (c32flags) {
732         tree->opcode = OP_IBGT;
733         mono_bblock_add_inst (s->cbb, tree);
736 stmt: CEE_BGT_UN (c32flags) {
737         tree->opcode = OP_IBGT_UN;
738         mono_bblock_add_inst (s->cbb, tree);
741 stmt: CEE_BGE  (c32flags) {
742         tree->opcode = OP_IBGE;
743         mono_bblock_add_inst (s->cbb, tree);
746 stmt: CEE_BGE_UN (c32flags) {
747         tree->opcode = OP_IBGE_UN;
748         mono_bblock_add_inst (s->cbb, tree);
751 stmt: CEE_BLE  (c32flags) {
752         tree->opcode = OP_IBLE;
753         mono_bblock_add_inst (s->cbb, tree);
756 stmt: CEE_BLE_UN (c32flags) {
757         tree->opcode = OP_IBLE_UN;
758         mono_bblock_add_inst (s->cbb, tree);
761 reg: OP_CEQ (c32flags) {        
762         tree->opcode = OP_ICEQ;
763         tree->dreg = state->reg1;
764         mono_bblock_add_inst (s->cbb, tree);
767 reg: OP_CLT (c32flags) {        
768         tree->opcode = OP_ICLT;
769         tree->dreg = state->reg1;
770         mono_bblock_add_inst (s->cbb, tree);
773 reg: OP_CLT_UN (c32flags) {     
774         tree->opcode = OP_ICLT_UN;
775         tree->dreg = state->reg1;
776         mono_bblock_add_inst (s->cbb, tree);
779 reg: OP_CGT (c32flags) {        
780         tree->opcode = OP_ICGT;
781         tree->dreg = state->reg1;
782         mono_bblock_add_inst (s->cbb, tree);
785 reg: OP_CGT_UN (c32flags) {     
786         tree->opcode = OP_ICGT_UN;
787         tree->dreg = state->reg1;
788         mono_bblock_add_inst (s->cbb, tree);