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_LSUB (reg, reg) {
57 MONO_EMIT_NEW_BIALU (s, CEE_SUB, state->reg1, state->left->reg1, state->right->reg1);
61 MONO_EMIT_NEW_UNALU (s, CEE_NEG, state->reg1, state->left->reg1);
65 MONO_EMIT_NEW_UNALU (s, CEE_NOT, state->reg1, state->left->reg1);
68 reg: OP_LAND (reg, reg) {
69 MONO_EMIT_NEW_BIALU (s, CEE_AND, state->reg1, state->left->reg1, state->right->reg1);
72 reg: OP_LOR (reg, reg) {
73 MONO_EMIT_NEW_BIALU (s, CEE_OR, state->reg1, state->left->reg1, state->right->reg1);
76 reg: OP_LXOR (reg, reg) {
77 MONO_EMIT_NEW_BIALU (s, CEE_XOR, state->reg1, state->left->reg1, state->right->reg1);
81 reg: OP_LADD_OVF (reg, reg) {
82 MONO_EMIT_NEW_BIALU (s, OP_ADDCC, state->reg1, state->left->reg1, state->right->reg1);
83 MONO_EMIT_NEW_COND_EXC (s, OV, "OverflowException");
86 reg: OP_LADD_OVF_UN (reg, reg) {
87 MONO_EMIT_NEW_BIALU (s, OP_ADDCC, state->reg1, state->left->reg1, state->right->reg1);
88 MONO_EMIT_NEW_COND_EXC (s, C, "OverflowException");
91 reg: OP_LSUB_OVF (reg, reg) {
92 MONO_EMIT_NEW_BIALU (s, OP_SUBCC, state->reg1, state->left->reg1, state->right->reg1);
93 MONO_EMIT_NEW_COND_EXC (s, OV, "OverflowException");
96 reg: OP_LSUB_OVF_UN (reg, reg) {
97 MONO_EMIT_NEW_BIALU (s, OP_SUBCC, state->reg1, state->left->reg1, state->right->reg1);
98 MONO_EMIT_NEW_COND_EXC (s, C, "OverflowException");
101 reg: OP_LONG_SHRUN_32 (reg) {
102 MONO_EMIT_BIALU_IMM (s, tree, OP_LSHR_UN_IMM, state->reg1, state->left->reg1, 32);
109 reg: OP_LSHL (reg, reg) {
110 MONO_EMIT_BIALU (s, tree, tree->opcode, state->reg1, state->left->reg1, state->right->reg1);
113 reg: OP_LSHL (reg, OP_ICONST) {
114 MONO_EMIT_BIALU_IMM (s, tree, OP_LSHL_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
117 reg: OP_LSHR (reg, reg) {
118 MONO_EMIT_BIALU (s, tree, tree->opcode, state->reg1, state->left->reg1, state->right->reg1);
121 reg: OP_LSHR_IMM (reg, OP_ICONST) {
122 MONO_EMIT_BIALU_IMM (s, tree, OP_LSHR_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
125 reg: OP_LSHR_UN (reg, reg) {
126 MONO_EMIT_BIALU (s, tree, tree->opcode, state->reg1, state->left->reg1, state->right->reg1);
129 reg: OP_LSHR_UN (reg, OP_ICONST) {
130 MONO_EMIT_BIALU_IMM (s, tree, OP_LSHR_UN_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
137 reg: CEE_CONV_I8 (reg) {
138 /* Sign extend the value in the lower word into the upper word */
139 tree->sreg1 = state->left->reg1;
140 tree->dreg = state->reg1;
141 mono_bblock_add_inst (s->cbb, tree);
144 reg: CEE_CONV_U8 (reg) {
145 /* Clean out the upper word */
146 /* Sign extend the value in the lower word into the upper word */
147 tree->sreg1 = state->left->reg1;
148 tree->dreg = state->reg1;
149 mono_bblock_add_inst (s->cbb, tree);
152 i8con: CEE_CONV_U8 (OP_ICONST) "0" {
154 * This is needed since constant propagation eliminates some
155 * stind.i4/ldind.i4 pairs, along with the conversions done by them.
157 int data = state->left->tree->inst_c0;
158 tree->opcode = OP_I8CONST;
159 tree->inst_ls_word = data;
160 tree->inst_ms_word = 0;
163 reg: OP_LCONV_TO_I4 (reg) {
164 MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
167 reg: OP_FCONV_TO_I8 (freg) {
168 MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
171 reg: OP_FCONV_TO_U8 (freg) {
172 MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
175 reg: OP_LCONV_TO_I4 (i8con) {
176 MONO_EMIT_NEW_ICONST (s, state->reg1, state->left->tree->inst_ls_word);
179 reg: OP_LCONV_TO_I4 (reg) {
180 /* Sign extend the value in the lower word into the upper word */
181 MONO_EMIT_BIALU_IMM (s, tree, OP_SHR_IMM, state->reg1, state->left->reg1, 0);
184 reg: OP_LCONV_TO_U4 (reg) {
185 /* Clean out the upper word */
186 MONO_EMIT_BIALU_IMM (s, tree, OP_SHR_UN_IMM, state->reg1, state->left->reg1, 0);
189 reg: OP_LCONV_TO_U8 (reg) {
190 MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
193 reg: OP_LCONV_TO_I8 (reg) {
194 MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
197 reg: OP_LCONV_TO_U (reg) {
198 MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
201 reg: OP_LCONV_TO_I (reg) {
202 MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
205 reg: OP_LCONV_TO_I1 (reg) {
206 MONO_EMIT_UNALU (s, tree, CEE_CONV_I1, state->reg1, state->left->reg1);
209 reg: OP_LCONV_TO_U1 (reg) {
210 MONO_EMIT_UNALU (s, tree, CEE_CONV_U1, state->reg1, state->left->reg1);
213 reg: OP_LCONV_TO_I2 (reg) {
214 MONO_EMIT_UNALU (s, tree, CEE_CONV_I2, state->reg1, state->left->reg1);
217 reg: OP_LCONV_TO_U2 (reg) {
218 MONO_EMIT_UNALU (s, tree, CEE_CONV_U2, state->reg1, state->left->reg1);
222 reg: OP_LCONV_TO_OVF_I1 (reg) {
223 MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 127);
224 MONO_EMIT_NEW_COND_EXC (s, GT, "OverflowException");
225 MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, -128);
226 MONO_EMIT_NEW_COND_EXC (s, LT, "OverflowException");
227 MONO_EMIT_UNALU (s, tree, CEE_CONV_I1, state->reg1, state->left->reg1);
230 reg: OP_LCONV_TO_OVF_U1 (reg) {
231 /* probe value to be within 0 to 255 */
232 MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 255);
233 MONO_EMIT_NEW_COND_EXC (s, GT_UN, "OverflowException");
234 MONO_EMIT_BIALU_IMM (s, tree, OP_AND_IMM, state->reg1, state->left->reg1, 0xff);
237 reg: OP_LCONV_TO_OVF_U1_UN (reg) {
238 /* probe value to be within 0 to 255 */
239 MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 255);
240 MONO_EMIT_NEW_COND_EXC (s, GT_UN, "OverflowException");
241 MONO_EMIT_BIALU_IMM (s, tree, OP_AND_IMM, state->reg1, state->left->reg1, 0xff);
244 reg: OP_LCONV_TO_OVF_I2 (reg) {
245 /* Probe value to be within -32768 and 32767 */
246 MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 32767);
247 MONO_EMIT_NEW_COND_EXC (s, GT, "OverflowException");
248 MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, -32768);
249 MONO_EMIT_NEW_COND_EXC (s, LT, "OverflowException");
250 MONO_EMIT_UNALU (s, tree, CEE_CONV_I2, state->reg1, state->left->reg1);
253 reg: OP_LCONV_TO_OVF_U2 (reg) {
254 /* Probe value to be within 0 and 65535 */
255 MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 0xffff);
256 MONO_EMIT_NEW_COND_EXC (s, GT_UN, "OverflowException");
257 MONO_EMIT_BIALU_IMM (s, tree, OP_AND_IMM, state->reg1, state->left->reg1, 0xffff);
260 reg: OP_LCONV_TO_OVF_U2_UN (reg) {
261 /* Probe value to be within 0 and 65535 */
262 MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 0xffff);
263 MONO_EMIT_NEW_COND_EXC (s, GT_UN, "OverflowException");
264 MONO_EMIT_BIALU_IMM (s, tree, OP_AND_IMM, state->reg1, state->left->reg1, 0xffff);
267 reg: OP_LCONV_TO_OVF_I4 (reg) {
268 MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 0x7fffffff);
269 MONO_EMIT_NEW_COND_EXC (s, GT, "OverflowException");
270 MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, -2147483648);
271 MONO_EMIT_NEW_COND_EXC (s, LT, "OverflowException");
272 MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
275 reg: OP_LCONV_TO_OVF_I4_UN (reg) {
276 MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 0x7fffffff);
277 MONO_EMIT_NEW_COND_EXC (s, GT, "OverflowException");
278 MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
281 reg: OP_LCONV_TO_OVF_U4_UN (reg) {
282 MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 0xffffffff);
283 MONO_EMIT_NEW_COND_EXC (s, GT_UN, "OverflowException");
284 MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
287 reg: OP_LCONV_TO_OVF_U4 (reg) {
288 MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 0xffffffffUL);
289 MONO_EMIT_NEW_COND_EXC (s, GT, "OverflowException");
290 MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg1, 0);
291 MONO_EMIT_NEW_COND_EXC (s, LT, "OverflowException");
292 MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
295 reg: OP_LCONV_TO_OVF_I_UN (reg),
296 reg: OP_LCONV_TO_OVF_I8_UN (reg) {
297 MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg1, 0);
298 MONO_EMIT_NEW_COND_EXC (s, LT, "OverflowException");
300 MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
303 reg: OP_LCONV_TO_OVF_U8 (reg) {
304 MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg1, 0);
305 MONO_EMIT_NEW_COND_EXC (s, LT, "OverflowException");
307 MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
310 reg: OP_LCONV_TO_OVF_I8 (reg) {
311 MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
314 reg: OP_LCONV_TO_OVF_U8_UN (reg) {
315 MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
318 reg: OP_LCONV_TO_OVF_I (reg) {
319 MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
322 freg: OP_LCONV_TO_R_UN (lreg) {
323 MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
326 reg: CEE_CONV_OVF_I8 (reg) {
327 /* Sign extend the value in the lower word into the upper word */
328 MONO_EMIT_BIALU_IMM (s, tree, OP_LSHR_IMM, state->reg1, state->left->reg1, 0);
331 reg: CEE_CONV_OVF_I8_UN (reg) {
332 /* an unsigned 32 bit num always fits in a signed 64 bit one */
333 /* Clean out the upper word */
334 MONO_EMIT_BIALU_IMM (s, tree, OP_SHR_UN_IMM, state->reg1, state->left->reg1, 0);
337 reg: CEE_CONV_OVF_U8 (reg) {
338 MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 0);
339 MONO_EMIT_NEW_COND_EXC (s, LT, "OverflowException");
340 MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
343 reg: CEE_CONV_OVF_U8_UN (reg) {
344 g_assert_not_reached ();
350 reg: OP_LCALLVIRT (reg) {
351 mini_emit_virtual_call (s, state, tree, OP_LCALL, OP_LCALL_MEMBASE);
355 tree->dreg = state->reg1;
356 mono_bblock_add_inst (s->cbb, tree);
359 reg: OP_LCALL_REG (reg) {
360 tree->sreg1 = state->left->reg1;
361 tree->dreg = state->reg1;
362 mono_bblock_add_inst (s->cbb, tree);
365 reg: OP_LCALL_REG (OP_ICONST) {
366 tree->opcode = OP_LCALL;
367 ((MonoCallInst*)tree)->fptr = state->left->tree->inst_p0;
368 tree->dreg = state->reg1;
369 mono_bblock_add_inst (s->cbb, tree);
374 stmt: CEE_STIND_I4 (OP_REGVAR, OP_ICONST) {
375 tree->inst_c0 = state->right->tree->inst_c0;
376 tree->opcode = OP_ICONST;
377 tree->dreg = state->left->tree->dreg;
378 mono_bblock_add_inst (s->cbb, tree);
381 stmt: CEE_STIND_I4 (OP_REGVAR, reg) {
382 MONO_EMIT_UNALU (s, tree, OP_MOVE, state->left->tree->dreg, state->right->reg1);
385 stmt: CEE_STIND_I4 (OP_REGVAR, CEE_LDIND_I4 (OP_REGVAR)) {
386 MONO_EMIT_UNALU (s, tree, OP_MOVE, state->left->tree->dreg, state->right->left->tree->dreg);
389 stmt: CEE_STIND_I4 (OP_REGVAR, CEE_LDIND_I4 (base)) {
390 MONO_EMIT_LOAD_MEMBASE_OP (s, tree, OP_LOADI4_MEMBASE, state->left->tree->dreg,
391 state->right->left->tree->inst_basereg,
392 state->right->left->tree->inst_offset);
395 cflags: OP_LCOMPARE (reg, reg) {
396 tree->sreg1 = state->left->reg1;
397 tree->sreg2 = state->right->reg1;
398 mono_bblock_add_inst (s->cbb, tree);
401 cflags: OP_LCOMPARE (CEE_LDIND_I8 (OP_REGVAR), reg) {
402 tree->sreg1 = state->left->left->tree->dreg;
403 tree->sreg2 = state->right->reg1;
404 mono_bblock_add_inst (s->cbb, tree);
407 cflags: OP_LCOMPARE (CEE_LDIND_I (OP_REGVAR), CEE_LDIND_I (OP_REGVAR)) {
408 tree->sreg1 = state->left->left->tree->dreg;
409 tree->sreg2 = state->right->left->tree->dreg;
410 mono_bblock_add_inst (s->cbb, tree);
413 cflags: OP_LCOMPARE (CEE_LDIND_I8 (OP_REGVAR), OP_ICONST) {
414 tree->opcode = OP_COMPARE_IMM;
415 tree->sreg1 = state->left->left->tree->dreg;
416 tree->inst_imm = state->right->tree->inst_c0;
417 mono_bblock_add_inst (s->cbb, tree);
419 MBCOND (mono_arch_is_inst_imm (state->right->tree->inst_c0));
424 cflags: OP_LCOMPARE (reg, OP_ICONST) {
425 tree->opcode = OP_COMPARE_IMM;
426 tree->sreg1 = state->left->reg1;
427 tree->inst_imm = state->right->tree->inst_c0;
428 mono_bblock_add_inst (s->cbb, tree);
430 MBCOND (mono_arch_is_inst_imm (state->right->tree->inst_c0));
435 cflags: OP_LCOMPARE (reg, OP_I8CONST) {
436 tree->opcode = OP_COMPARE_IMM;
437 tree->sreg1 = state->left->reg1;
438 tree->inst_imm = state->right->tree->inst_l;
439 mono_bblock_add_inst (s->cbb, tree);
441 MBCOND (mono_arch_is_inst_imm (state->right->tree->inst_l));
446 stmt: CEE_BNE_UN (cflags) {
447 mono_bblock_add_inst (s->cbb, tree);
450 stmt: CEE_BEQ (cflags) {
451 mono_bblock_add_inst (s->cbb, tree);
454 stmt: CEE_BLT (cflags) {
455 mono_bblock_add_inst (s->cbb, tree);
458 stmt: CEE_BLT_UN (cflags) {
459 mono_bblock_add_inst (s->cbb, tree);
462 stmt: CEE_BGT (cflags) {
463 mono_bblock_add_inst (s->cbb, tree);
466 stmt: CEE_BGT_UN (cflags) {
467 mono_bblock_add_inst (s->cbb, tree);
470 stmt: CEE_BGE (cflags) {
471 mono_bblock_add_inst (s->cbb, tree);
474 stmt: CEE_BGE_UN (cflags) {
475 mono_bblock_add_inst (s->cbb, tree);
478 stmt: CEE_BLE (cflags) {
479 mono_bblock_add_inst (s->cbb, tree);
482 stmt: CEE_BLE_UN (cflags) {
483 mono_bblock_add_inst (s->cbb, tree);
491 # basic alu operations
494 reg: CEE_AND (reg, reg) {
495 MONO_EMIT_BIALU (s, tree, OP_IAND, state->reg1, state->left->reg1, state->right->reg1);
498 reg: CEE_AND (reg, OP_ICONST) {
499 MONO_EMIT_BIALU_IMM (s, tree, OP_IAND_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
502 reg: CEE_OR (reg, reg) {
503 MONO_EMIT_BIALU (s, tree, OP_IOR, state->reg1, state->left->reg1, state->right->reg1);
506 reg: CEE_OR (reg, OP_ICONST) {
507 MONO_EMIT_BIALU_IMM (s, tree, OP_IOR_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
510 reg: CEE_XOR (reg, reg) {
511 MONO_EMIT_BIALU (s, tree, OP_IXOR, state->reg1, state->left->reg1, state->right->reg1);
514 reg: CEE_XOR (reg, OP_ICONST) {
515 MONO_EMIT_BIALU_IMM (s, tree, OP_IXOR_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
519 MONO_EMIT_UNALU (s, tree, OP_INEG, state->reg1, state->left->reg1);
523 MONO_EMIT_UNALU (s, tree, OP_INOT, state->reg1, state->left->reg1);
526 reg: CEE_ADD (reg, reg) {
527 MONO_EMIT_BIALU (s, tree, OP_IADD, state->reg1, state->left->reg1, state->right->reg1);
530 reg: CEE_ADD (reg, OP_ICONST) {
531 MONO_EMIT_BIALU_IMM (s, tree, OP_IADD_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
534 reg: CEE_ADD_OVF (reg, reg) {
535 MONO_EMIT_NEW_BIALU (s, OP_IADDCC, state->reg1, state->left->reg1, state->right->reg1);
536 MONO_EMIT_NEW_COND_EXC (s, IOV, "OverflowException");
539 reg: CEE_ADD_OVF_UN (reg, reg) {
540 MONO_EMIT_NEW_BIALU (s, OP_IADDCC, state->reg1, state->left->reg1, state->right->reg1);
541 MONO_EMIT_NEW_COND_EXC (s, IC, "OverflowException");
544 reg: CEE_SUB (reg, reg) {
545 MONO_EMIT_BIALU (s, tree, OP_ISUB, state->reg1, state->left->reg1, state->right->reg1);
548 reg: CEE_SUB (reg, CEE_LDIND_I4 (OP_REGVAR)) {
549 MONO_EMIT_BIALU (s, tree, OP_ISUB, state->reg1, state->left->reg1, state->right->left->tree->dreg);
552 reg: CEE_SUB (reg, OP_ICONST) {
553 MONO_EMIT_BIALU_IMM (s, tree, OP_ISUB_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
556 reg: CEE_SUB_OVF (reg, reg) {
557 MONO_EMIT_NEW_BIALU (s, OP_ISUBCC, state->reg1, state->left->reg1, state->right->reg1);
558 MONO_EMIT_NEW_COND_EXC (s, IOV, "OverflowException");
561 reg: CEE_SUB_OVF_UN (reg, reg) {
562 MONO_EMIT_NEW_BIALU (s, OP_ISUBCC, state->reg1, state->left->reg1, state->right->reg1);
563 MONO_EMIT_NEW_COND_EXC (s, IC, "OverflowException");
570 reg: CEE_SHL (reg, reg) {
571 MONO_EMIT_BIALU (s, tree, OP_ISHL, state->reg1, state->left->reg1, state->right->reg1);
574 reg: CEE_SHL (reg, OP_ICONST) {
575 MONO_EMIT_BIALU_IMM (s, tree, OP_ISHL_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
578 reg: CEE_SHR (reg, reg) {
579 MONO_EMIT_BIALU (s, tree, OP_ISHR, state->reg1, state->left->reg1, state->right->reg1);
582 reg: CEE_SHR (reg, OP_ICONST) {
583 MONO_EMIT_BIALU_IMM (s, tree, OP_ISHR_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
586 reg: CEE_SHR_UN (reg, reg) {
587 MONO_EMIT_BIALU (s, tree, OP_ISHR_UN, state->reg1, state->left->reg1, state->right->reg1);
590 reg: CEE_SHR_UN (reg, OP_ICONST) {
591 MONO_EMIT_BIALU_IMM (s, tree, OP_ISHR_UN_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
595 # mult/div operations
598 reg: CEE_MUL (reg, reg) {
599 MONO_EMIT_BIALU (s, tree, OP_IMUL, state->reg1, state->left->reg1, state->right->reg1);
602 reg: CEE_MUL (reg, OP_ICONST) {
603 MONO_EMIT_BIALU_IMM (s, tree, OP_IMUL_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
606 reg: CEE_MUL_OVF (reg, reg) {
607 MONO_EMIT_BIALU (s, tree, OP_IMUL_OVF, state->reg1, state->left->reg1, state->right->reg1);
610 reg: CEE_MUL_OVF_UN (reg, reg) {
611 MONO_EMIT_BIALU (s, tree, OP_IMUL_OVF_UN, state->reg1, state->left->reg1, state->right->reg1);
614 reg: CEE_DIV (reg, reg) {
615 MONO_EMIT_BIALU (s, tree, OP_IDIV, state->reg1, state->left->reg1, state->right->reg1);
618 #reg: CEE_DIV (reg, OP_ICONST) {
619 # MONO_EMIT_BIALU_IMM (s, tree, OP_IDIV_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
622 reg: CEE_DIV_UN (reg, reg) {
623 MONO_EMIT_BIALU (s, tree, OP_IDIV_UN, state->reg1, state->left->reg1, state->right->reg1);
626 #reg: CEE_DIV_UN (reg, OP_ICONST) {
627 # MONO_EMIT_BIALU_IMM (s, tree, OP_IDIV_UN_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
630 reg: CEE_REM (reg, reg) {
631 MONO_EMIT_BIALU (s, tree, OP_IREM, state->reg1, state->left->reg1, state->right->reg1);
634 #reg: CEE_REM (reg, OP_ICONST) {
635 # MONO_EMIT_BIALU_IMM (s, tree, OP_IREM_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
638 reg: CEE_REM_UN (reg, reg) {
639 MONO_EMIT_BIALU (s, tree, OP_IREM_UN, state->reg1, state->left->reg1, state->right->reg1);
642 #reg: CEE_REM_UN (reg, OP_ICONST) {
643 # MONO_EMIT_BIALU_IMM (s, tree, OP_IREM_UN_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0);
646 c32flags: OP_COMPARE (reg, reg) {
647 tree->opcode = OP_ICOMPARE;
648 tree->sreg1 = state->left->reg1;
649 tree->sreg2 = state->right->reg1;
650 mono_bblock_add_inst (s->cbb, tree);
653 c32flags: OP_COMPARE (CEE_LDIND_I (OP_REGVAR), CEE_LDIND_I (OP_REGVAR)) {
654 tree->opcode = OP_ICOMPARE;
655 tree->sreg1 = state->left->left->tree->dreg;
656 tree->sreg2 = state->right->left->tree->dreg;
657 mono_bblock_add_inst (s->cbb, tree);
660 c32flags: OP_COMPARE (CEE_LDIND_I (OP_REGVAR), OP_ICONST) {
661 tree->opcode = OP_ICOMPARE_IMM;
662 tree->sreg1 = state->left->left->tree->dreg;
663 tree->inst_imm = state->right->tree->inst_c0;
664 mono_bblock_add_inst (s->cbb, tree);
667 c32flags: OP_COMPARE (CEE_LDIND_I4 (OP_REGVAR), reg) {
668 tree->opcode = OP_ICOMPARE;
669 tree->sreg1 = state->left->left->tree->dreg;
670 tree->sreg2 = state->right->reg1;
671 mono_bblock_add_inst (s->cbb, tree);
674 c32flags: OP_COMPARE (CEE_LDIND_I4 (OP_REGVAR), OP_ICONST) {
675 tree->opcode = OP_ICOMPARE_IMM;
676 tree->sreg1 = state->left->left->tree->dreg;
677 tree->inst_imm = state->right->tree->inst_c0;
678 mono_bblock_add_inst (s->cbb, tree);
681 c32flags: OP_COMPARE (reg, OP_ICONST) {
682 tree->opcode = OP_ICOMPARE_IMM;
683 tree->sreg1 = state->left->reg1;
684 tree->inst_imm = state->right->tree->inst_c0;
685 mono_bblock_add_inst (s->cbb, tree);
688 stmt: CEE_BNE_UN (c32flags) {
689 tree->opcode = OP_IBNE_UN;
690 mono_bblock_add_inst (s->cbb, tree);
693 stmt: CEE_BEQ (c32flags) {
694 tree->opcode = OP_IBEQ;
695 mono_bblock_add_inst (s->cbb, tree);
698 stmt: CEE_BLT (c32flags) {
699 tree->opcode = OP_IBLT;
700 mono_bblock_add_inst (s->cbb, tree);
703 stmt: CEE_BLT_UN (c32flags) {
704 tree->opcode = OP_IBLT_UN;
705 mono_bblock_add_inst (s->cbb, tree);
708 stmt: CEE_BGT (c32flags) {
709 tree->opcode = OP_IBGT;
710 mono_bblock_add_inst (s->cbb, tree);
713 stmt: CEE_BGT_UN (c32flags) {
714 tree->opcode = OP_IBGT_UN;
715 mono_bblock_add_inst (s->cbb, tree);
718 stmt: CEE_BGE (c32flags) {
719 tree->opcode = OP_IBGE;
720 mono_bblock_add_inst (s->cbb, tree);
723 stmt: CEE_BGE_UN (c32flags) {
724 tree->opcode = OP_IBGE_UN;
725 mono_bblock_add_inst (s->cbb, tree);
728 stmt: CEE_BLE (c32flags) {
729 tree->opcode = OP_IBLE;
730 mono_bblock_add_inst (s->cbb, tree);
733 stmt: CEE_BLE_UN (c32flags) {
734 tree->opcode = OP_IBLE_UN;
735 mono_bblock_add_inst (s->cbb, tree);
738 reg: OP_CEQ (c32flags) {
739 tree->opcode = OP_ICEQ;
740 tree->dreg = state->reg1;
741 mono_bblock_add_inst (s->cbb, tree);
744 reg: OP_CLT (c32flags) {
745 tree->opcode = OP_ICLT;
746 tree->dreg = state->reg1;
747 mono_bblock_add_inst (s->cbb, tree);
750 reg: OP_CLT_UN (c32flags) {
751 tree->opcode = OP_ICLT_UN;
752 tree->dreg = state->reg1;
753 mono_bblock_add_inst (s->cbb, tree);
756 reg: OP_CGT (c32flags) {
757 tree->opcode = OP_ICGT;
758 tree->dreg = state->reg1;
759 mono_bblock_add_inst (s->cbb, tree);
762 reg: OP_CGT_UN (c32flags) {
763 tree->opcode = OP_ICGT_UN;
764 tree->dreg = state->reg1;
765 mono_bblock_add_inst (s->cbb, tree);