4 # inssel-long.brg: burg file for 64bit architectures
7 # Dietmar Maurer (dietmar@ximian.com)
9 # (C) 2002 Ximian, Inc.
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);
74 MONO_EMIT_NEW_UNALU (s, CEE_NEG, state->reg1, state->left->reg1);
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_LSHR_UN_32 (reg) {
115 MONO_EMIT_BIALU_IMM (s, tree, OP_LSHR_UN_IMM, state->reg1, state->left->reg1, 32);
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);
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" {
167 * This is needed since constant propagation eliminates some
168 * stind.i4/ldind.i4 pairs, along with the conversions done by them.
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 /* The int cast is needed for the VS compiler. See Compiler Warning (level 2) C4146. */
280 MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT, state->left->reg1, 0x7fffffff, "OverflowException");
281 MONO_EMIT_NEW_COMPARE_IMM_EXC (s, LT, state->left->reg1, ((int)-2147483648), "OverflowException");
282 MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
285 reg: OP_LCONV_TO_OVF_I4_UN (reg) {
286 MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT_UN, state->left->reg1, 0x7fffffff, "OverflowException");
287 MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
290 reg: OP_LCONV_TO_OVF_U4 (reg) {
291 MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT, state->left->reg1, 0xffffffffUL, "OverflowException");
292 MONO_EMIT_NEW_COMPARE_IMM_EXC (s, LT, state->left->reg1, 0, "OverflowException");
293 MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
296 reg: OP_LCONV_TO_OVF_U4_UN (reg) {
297 MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT_UN, state->left->reg1, 0xffffffff, "OverflowException");
298 MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
301 reg: OP_LCONV_TO_OVF_I_UN (reg),
302 reg: OP_LCONV_TO_OVF_I8_UN (reg) {
303 MONO_EMIT_NEW_COMPARE_IMM_EXC (s, LT, state->left->reg1, 0, "OverflowException");
304 MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
307 reg: OP_LCONV_TO_OVF_U8 (reg),
308 reg: OP_LCONV_TO_OVF_U (reg) {
309 MONO_EMIT_NEW_COMPARE_IMM_EXC (s, LT, state->left->reg1, 0, "OverflowException");
310 MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
313 reg: OP_LCONV_TO_OVF_I8 (reg),
314 reg: OP_LCONV_TO_OVF_U_UN (reg) {
315 MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
318 reg: OP_LCONV_TO_OVF_U8_UN (reg) {
319 MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
322 reg: OP_LCONV_TO_OVF_I (reg) {
323 MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
326 freg: OP_LCONV_TO_R_UN (lreg) {
327 MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
330 reg: CEE_CONV_OVF_I8 (reg),
331 reg: CEE_CONV_OVF_I (reg) {
332 /* Sign extend the value in the lower word into the upper word */
333 MONO_EMIT_UNALU (s, tree, CEE_CONV_I8, state->reg1, state->left->reg1);
336 reg: CEE_CONV_OVF_I8_UN (reg),
337 reg: CEE_CONV_OVF_U8_UN (reg),
338 reg: CEE_CONV_OVF_I_UN (reg),
339 reg: CEE_CONV_OVF_U_UN (reg) {
340 /* an unsigned 32 bit num always fits in an (un)signed 64 bit one */
341 /* Clean out the upper word */
342 MONO_EMIT_UNALU (s, tree, CEE_CONV_U8, state->reg1, state->left->reg1);
345 reg: CEE_CONV_OVF_U8 (reg),
346 reg: CEE_CONV_OVF_U (reg) {
347 MONO_EMIT_NEW_COMPARE_IMM_EXC (s, LT, state->left->reg1, 0, "OverflowException");
348 MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
351 reg: OP_LCALLVIRT (reg) {
352 mini_emit_virtual_call (s, state, tree, OP_LCALL, OP_LCALL_MEMBASE);
355 reg: OP_LCALLVIRT_IMT (reg, reg) {
356 tree->opcode = OP_LCALLVIRT;
357 mini_emit_virtual_imt_call (s, state, tree, OP_LCALL, OP_LCALL_MEMBASE, state->right->reg1);
361 tree->dreg = state->reg1;
362 mono_bblock_add_inst (s->cbb, tree);
365 reg: OP_LCALL_RGCTX (reg) {
366 emit_rgctx_argument (s, tree, state->left->reg1, OP_LCALL);
368 tree->dreg = state->reg1;
369 mono_bblock_add_inst (s->cbb, tree);
372 reg: OP_LCALL_REG (reg) {
373 tree->sreg1 = state->left->reg1;
374 tree->dreg = state->reg1;
375 mono_bblock_add_inst (s->cbb, tree);
378 reg: OP_LCALL_REG_RGCTX (reg, reg) {
379 emit_rgctx_argument (s, tree, state->right->reg1, OP_LCALL_REG);
381 tree->sreg1 = state->left->reg1;
382 tree->dreg = state->reg1;
383 mono_bblock_add_inst (s->cbb, tree);
386 reg: OP_LCALL_REG (OP_ICONST),
387 reg: OP_LCALL_REG (OP_I8CONST) {
388 tree->opcode = OP_LCALL;
389 ((MonoCallInst*)tree)->fptr = state->left->tree->inst_p0;
390 tree->dreg = state->reg1;
391 mono_bblock_add_inst (s->cbb, tree);
394 stmt: CEE_STIND_I4 (OP_REGVAR, OP_ICONST) {
395 tree->inst_c0 = state->right->tree->inst_c0;
396 tree->opcode = OP_ICONST;
397 tree->dreg = state->left->tree->dreg;
398 mono_bblock_add_inst (s->cbb, tree);
401 stmt: CEE_STIND_I4 (OP_REGVAR, reg) {
402 MONO_EMIT_UNALU (s, tree, OP_MOVE, state->left->tree->dreg, state->right->reg1);
405 stmt: CEE_STIND_I4 (OP_REGVAR, CEE_LDIND_I4 (OP_REGVAR)) {
406 MONO_EMIT_UNALU (s, tree, OP_MOVE, state->left->tree->dreg, state->right->left->tree->dreg);
409 stmt: CEE_STIND_I4 (OP_REGVAR, CEE_LDIND_I4 (base)) {
410 MONO_EMIT_LOAD_MEMBASE_OP (s, tree, OP_LOADI4_MEMBASE, state->left->tree->dreg,
411 state->right->left->tree->inst_basereg,
412 state->right->left->tree->inst_offset);
415 cflags: OP_LCOMPARE (reg, reg) {
416 tree->sreg1 = state->left->reg1;
417 tree->sreg2 = state->right->reg1;
418 mono_bblock_add_inst (s->cbb, tree);
421 cflags: OP_LCOMPARE (CEE_LDIND_I8 (OP_REGVAR), reg) {
422 tree->sreg1 = state->left->left->tree->dreg;
423 tree->sreg2 = state->right->reg1;
424 mono_bblock_add_inst (s->cbb, tree);
427 cflags: OP_LCOMPARE (CEE_LDIND_I (OP_REGVAR), CEE_LDIND_I (OP_REGVAR)) {
428 tree->sreg1 = state->left->left->tree->dreg;
429 tree->sreg2 = state->right->left->tree->dreg;
430 mono_bblock_add_inst (s->cbb, tree);
433 cflags: OP_LCOMPARE (CEE_LDIND_I8 (OP_REGVAR), OP_ICONST) {
434 tree->opcode = OP_COMPARE_IMM;
435 tree->sreg1 = state->left->left->tree->dreg;
436 tree->inst_imm = state->right->tree->inst_c0;
437 mono_bblock_add_inst (s->cbb, tree);
439 MBCOND (mono_arch_is_inst_imm (state->right->tree->inst_c0));
444 cflags: OP_LCOMPARE (reg, OP_ICONST) {
445 tree->opcode = OP_COMPARE_IMM;
446 tree->sreg1 = state->left->reg1;
447 tree->inst_imm = state->right->tree->inst_c0;
448 mono_bblock_add_inst (s->cbb, tree);
450 MBCOND (mono_arch_is_inst_imm (state->right->tree->inst_c0));
455 cflags: OP_LCOMPARE (reg, OP_I8CONST) {
456 tree->opcode = OP_COMPARE_IMM;
457 tree->sreg1 = state->left->reg1;
458 tree->inst_imm = state->right->tree->inst_l;
459 mono_bblock_add_inst (s->cbb, tree);
461 MBCOND (mono_arch_is_inst_imm (state->right->tree->inst_l));
466 stmt: CEE_BNE_UN (cflags) {
467 mono_bblock_add_inst (s->cbb, tree);
470 stmt: CEE_BEQ (cflags) {
471 mono_bblock_add_inst (s->cbb, tree);
474 stmt: CEE_BLT (cflags) {
475 mono_bblock_add_inst (s->cbb, tree);
478 stmt: CEE_BLT_UN (cflags) {
479 mono_bblock_add_inst (s->cbb, tree);
482 stmt: CEE_BGT (cflags) {
483 mono_bblock_add_inst (s->cbb, tree);
486 stmt: CEE_BGT_UN (cflags) {
487 mono_bblock_add_inst (s->cbb, tree);
490 stmt: CEE_BGE (cflags) {
491 mono_bblock_add_inst (s->cbb, tree);
494 stmt: CEE_BGE_UN (cflags) {
495 mono_bblock_add_inst (s->cbb, tree);
498 stmt: CEE_BLE (cflags) {
499 mono_bblock_add_inst (s->cbb, tree);
502 stmt: CEE_BLE_UN (cflags) {
503 mono_bblock_add_inst (s->cbb, tree);
511 # basic alu operations
514 reg: CEE_AND (reg, reg) {
515 MONO_EMIT_BIALU (s, tree, OP_IAND, state->reg1, state->left->reg1, state->right->reg1);
518 reg: CEE_AND (reg, OP_ICONST) {
519 MONO_EMIT_BIALU_IMM (s, tree, OP_IAND_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
522 reg: CEE_OR (reg, reg) {
523 MONO_EMIT_BIALU (s, tree, OP_IOR, state->reg1, state->left->reg1, state->right->reg1);
526 reg: CEE_OR (reg, OP_ICONST) {
527 MONO_EMIT_BIALU_IMM (s, tree, OP_IOR_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
530 reg: CEE_XOR (reg, reg) {
531 MONO_EMIT_BIALU (s, tree, OP_IXOR, state->reg1, state->left->reg1, state->right->reg1);
534 reg: CEE_XOR (reg, OP_ICONST) {
535 MONO_EMIT_BIALU_IMM (s, tree, OP_IXOR_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
539 MONO_EMIT_UNALU (s, tree, OP_INEG, state->reg1, state->left->reg1);
543 MONO_EMIT_UNALU (s, tree, OP_INOT, state->reg1, state->left->reg1);
546 reg: CEE_ADD (reg, reg) {
547 MONO_EMIT_BIALU (s, tree, OP_IADD, state->reg1, state->left->reg1, state->right->reg1);
550 reg: CEE_ADD (reg, OP_ICONST) {
551 MONO_EMIT_BIALU_IMM (s, tree, OP_IADD_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
554 reg: CEE_ADD_OVF (reg, reg) {
555 MONO_EMIT_NEW_BIALU (s, OP_IADDCC, state->reg1, state->left->reg1, state->right->reg1);
556 MONO_EMIT_NEW_COND_EXC (s, IOV, "OverflowException");
559 reg: CEE_ADD_OVF_UN (reg, reg) {
560 MONO_EMIT_NEW_BIALU (s, OP_IADDCC, state->reg1, state->left->reg1, state->right->reg1);
561 MONO_EMIT_NEW_COND_EXC (s, IC, "OverflowException");
564 reg: CEE_SUB (reg, reg) {
565 MONO_EMIT_BIALU (s, tree, OP_ISUB, state->reg1, state->left->reg1, state->right->reg1);
568 reg: CEE_SUB (reg, CEE_LDIND_I4 (OP_REGVAR)) {
569 MONO_EMIT_BIALU (s, tree, OP_ISUB, state->reg1, state->left->reg1, state->right->left->tree->dreg);
572 reg: CEE_SUB (reg, OP_ICONST) {
573 MONO_EMIT_BIALU_IMM (s, tree, OP_ISUB_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
576 reg: CEE_SUB_OVF (reg, reg) {
577 MONO_EMIT_NEW_BIALU (s, OP_ISUBCC, state->reg1, state->left->reg1, state->right->reg1);
578 MONO_EMIT_NEW_COND_EXC (s, IOV, "OverflowException");
581 reg: CEE_SUB_OVF_UN (reg, reg) {
582 MONO_EMIT_NEW_BIALU (s, OP_ISUBCC, state->reg1, state->left->reg1, state->right->reg1);
583 MONO_EMIT_NEW_COND_EXC (s, IC, "OverflowException");
590 reg: CEE_SHL (reg, reg) {
591 MONO_EMIT_BIALU (s, tree, OP_ISHL, state->reg1, state->left->reg1, state->right->reg1);
594 reg: CEE_SHL (reg, OP_ICONST) {
595 MONO_EMIT_BIALU_IMM (s, tree, OP_ISHL_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
598 reg: CEE_SHR (reg, reg) {
599 MONO_EMIT_BIALU (s, tree, OP_ISHR, state->reg1, state->left->reg1, state->right->reg1);
602 reg: CEE_SHR (reg, OP_ICONST) {
603 MONO_EMIT_BIALU_IMM (s, tree, OP_ISHR_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
606 reg: CEE_SHR_UN (reg, reg) {
607 MONO_EMIT_BIALU (s, tree, OP_ISHR_UN, state->reg1, state->left->reg1, state->right->reg1);
610 reg: CEE_SHR_UN (reg, OP_ICONST) {
611 MONO_EMIT_BIALU_IMM (s, tree, OP_ISHR_UN_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
615 # mult/div operations
618 reg: CEE_MUL (reg, reg) {
619 MONO_EMIT_BIALU (s, tree, OP_IMUL, state->reg1, state->left->reg1, state->right->reg1);
622 reg: CEE_MUL (reg, OP_ICONST) {
623 MONO_EMIT_BIALU_IMM (s, tree, OP_IMUL_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
626 reg: CEE_MUL_OVF (reg, reg) {
627 MONO_EMIT_BIALU (s, tree, OP_IMUL_OVF, state->reg1, state->left->reg1, state->right->reg1);
630 reg: CEE_MUL_OVF_UN (reg, reg) {
631 MONO_EMIT_BIALU (s, tree, OP_IMUL_OVF_UN, state->reg1, state->left->reg1, state->right->reg1);
634 reg: CEE_DIV (reg, reg) {
635 MONO_EMIT_BIALU (s, tree, OP_IDIV, state->reg1, state->left->reg1, state->right->reg1);
638 #reg: CEE_DIV (reg, OP_ICONST) {
639 # MONO_EMIT_BIALU_IMM (s, tree, OP_IDIV_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
642 reg: CEE_DIV_UN (reg, reg) {
643 MONO_EMIT_BIALU (s, tree, OP_IDIV_UN, state->reg1, state->left->reg1, state->right->reg1);
646 #reg: CEE_DIV_UN (reg, OP_ICONST) {
647 # MONO_EMIT_BIALU_IMM (s, tree, OP_IDIV_UN_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
650 reg: CEE_REM (reg, reg) {
651 MONO_EMIT_BIALU (s, tree, OP_IREM, state->reg1, state->left->reg1, state->right->reg1);
654 #reg: CEE_REM (reg, OP_ICONST) {
655 # MONO_EMIT_BIALU_IMM (s, tree, OP_IREM_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
658 reg: CEE_REM_UN (reg, reg) {
659 MONO_EMIT_BIALU (s, tree, OP_IREM_UN, state->reg1, state->left->reg1, state->right->reg1);
662 #reg: CEE_REM_UN (reg, OP_ICONST) {
663 # MONO_EMIT_BIALU_IMM (s, tree, OP_IREM_UN_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
666 reg: OP_IMUL_IMM (reg) {
667 tree->sreg1 = state->left->reg1;
668 tree->dreg = state->reg1;
669 mono_bblock_add_inst (s->cbb, tree);
672 reg: OP_LMUL_IMM (reg) {
673 tree->sreg1 = state->left->reg1;
674 tree->dreg = state->reg1;
675 mono_bblock_add_inst (s->cbb, tree);
678 c32flags: OP_COMPARE (reg, reg) {
679 tree->opcode = OP_ICOMPARE;
680 tree->sreg1 = state->left->reg1;
681 tree->sreg2 = state->right->reg1;
682 mono_bblock_add_inst (s->cbb, tree);
685 c32flags: OP_COMPARE (CEE_LDIND_I (OP_REGVAR), CEE_LDIND_I (OP_REGVAR)) {
686 tree->opcode = OP_ICOMPARE;
687 tree->sreg1 = state->left->left->tree->dreg;
688 tree->sreg2 = state->right->left->tree->dreg;
689 mono_bblock_add_inst (s->cbb, tree);
692 c32flags: OP_COMPARE (CEE_LDIND_I (OP_REGVAR), OP_ICONST) {
693 tree->opcode = OP_ICOMPARE_IMM;
694 tree->sreg1 = state->left->left->tree->dreg;
695 tree->inst_imm = state->right->tree->inst_c0;
696 mono_bblock_add_inst (s->cbb, tree);
699 c32flags: OP_COMPARE (CEE_LDIND_I4 (OP_REGVAR), reg) {
700 tree->opcode = OP_ICOMPARE;
701 tree->sreg1 = state->left->left->tree->dreg;
702 tree->sreg2 = state->right->reg1;
703 mono_bblock_add_inst (s->cbb, tree);
706 c32flags: OP_COMPARE (CEE_LDIND_I4 (OP_REGVAR), OP_ICONST) {
707 tree->opcode = OP_ICOMPARE_IMM;
708 tree->sreg1 = state->left->left->tree->dreg;
709 tree->inst_imm = state->right->tree->inst_c0;
710 mono_bblock_add_inst (s->cbb, tree);
713 c32flags: OP_COMPARE (reg, OP_ICONST) {
714 tree->opcode = OP_ICOMPARE_IMM;
715 tree->sreg1 = state->left->reg1;
716 tree->inst_imm = state->right->tree->inst_c0;
717 mono_bblock_add_inst (s->cbb, tree);
720 stmt: CEE_BNE_UN (c32flags) {
721 tree->opcode = OP_IBNE_UN;
722 mono_bblock_add_inst (s->cbb, tree);
725 stmt: CEE_BEQ (c32flags) {
726 tree->opcode = OP_IBEQ;
727 mono_bblock_add_inst (s->cbb, tree);
730 stmt: CEE_BLT (c32flags) {
731 tree->opcode = OP_IBLT;
732 mono_bblock_add_inst (s->cbb, tree);
735 stmt: CEE_BLT_UN (c32flags) {
736 tree->opcode = OP_IBLT_UN;
737 mono_bblock_add_inst (s->cbb, tree);
740 stmt: CEE_BGT (c32flags) {
741 tree->opcode = OP_IBGT;
742 mono_bblock_add_inst (s->cbb, tree);
745 stmt: CEE_BGT_UN (c32flags) {
746 tree->opcode = OP_IBGT_UN;
747 mono_bblock_add_inst (s->cbb, tree);
750 stmt: CEE_BGE (c32flags) {
751 tree->opcode = OP_IBGE;
752 mono_bblock_add_inst (s->cbb, tree);
755 stmt: CEE_BGE_UN (c32flags) {
756 tree->opcode = OP_IBGE_UN;
757 mono_bblock_add_inst (s->cbb, tree);
760 stmt: CEE_BLE (c32flags) {
761 tree->opcode = OP_IBLE;
762 mono_bblock_add_inst (s->cbb, tree);
765 stmt: CEE_BLE_UN (c32flags) {
766 tree->opcode = OP_IBLE_UN;
767 mono_bblock_add_inst (s->cbb, tree);
770 reg: OP_CEQ (c32flags) {
771 tree->opcode = OP_ICEQ;
772 tree->dreg = state->reg1;
773 mono_bblock_add_inst (s->cbb, tree);
776 reg: OP_CLT (c32flags) {
777 tree->opcode = OP_ICLT;
778 tree->dreg = state->reg1;
779 mono_bblock_add_inst (s->cbb, tree);
782 reg: OP_CLT_UN (c32flags) {
783 tree->opcode = OP_ICLT_UN;
784 tree->dreg = state->reg1;
785 mono_bblock_add_inst (s->cbb, tree);
788 reg: OP_CGT (c32flags) {
789 tree->opcode = OP_ICGT;
790 tree->dreg = state->reg1;
791 mono_bblock_add_inst (s->cbb, tree);
794 reg: OP_CGT_UN (c32flags) {
795 tree->opcode = OP_ICGT_UN;
796 tree->dreg = state->reg1;
797 mono_bblock_add_inst (s->cbb, tree);