X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Finssel-long.brg;h=d9d430987988f2f1a7aa2b811b427a868af95309;hb=dba1e96418a00b863db3565d5997314105bd8aa3;hp=4cd1b505c169e4028a428d64b62d73174c3ee236;hpb=2b391313e9af29d817cc7fe1f270ff47a23703ec;p=mono.git diff --git a/mono/mini/inssel-long.brg b/mono/mini/inssel-long.brg index 4cd1b505c16..d9d43098798 100644 --- a/mono/mini/inssel-long.brg +++ b/mono/mini/inssel-long.brg @@ -53,6 +53,19 @@ reg: OP_LADD (reg, reg) { MONO_EMIT_NEW_BIALU (s, CEE_ADD, state->reg1, state->left->reg1, state->right->reg1); } +reg: OP_LADD (reg, OP_ICONST) { + MONO_EMIT_BIALU_IMM (s, tree, OP_ADD_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0); +} + +reg: OP_LADD (reg, OP_ICONST) { + MONO_EMIT_BIALU_IMM (s, tree, OP_ADD_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0); +} + +reg: OP_LADD (CEE_LDIND_I (OP_REGVAR), OP_ICONST), +reg: OP_LADD (CEE_LDIND_REF (OP_REGVAR), OP_ICONST) { + MONO_EMIT_BIALU_IMM (s, tree, OP_ADD_IMM, state->reg1, state->left->left->tree->dreg, state->right->tree->inst_c0); +} + reg: OP_LSUB (reg, reg) { MONO_EMIT_NEW_BIALU (s, CEE_SUB, state->reg1, state->left->reg1, state->right->reg1); } @@ -118,7 +131,7 @@ reg: OP_LSHR (reg, reg) { MONO_EMIT_BIALU (s, tree, tree->opcode, state->reg1, state->left->reg1, state->right->reg1); } -reg: OP_LSHR_IMM (reg, OP_ICONST) { +reg: OP_LSHR (reg, OP_ICONST) { MONO_EMIT_BIALU_IMM (s, tree, OP_LSHR_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0); } @@ -160,10 +173,6 @@ i8con: CEE_CONV_U8 (OP_ICONST) "0" { tree->inst_ms_word = 0; } -reg: OP_LCONV_TO_I4 (reg) { - MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1); -} - reg: OP_FCONV_TO_I8 (freg) { MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1); } @@ -178,12 +187,12 @@ reg: OP_LCONV_TO_I4 (i8con) { reg: OP_LCONV_TO_I4 (reg) { /* Sign extend the value in the lower word into the upper word */ - MONO_EMIT_BIALU_IMM (s, tree, OP_SHR_IMM, state->reg1, state->left->reg1, 0); + MONO_EMIT_BIALU_IMM (s, tree, OP_LSHR_IMM, state->reg1, state->left->reg1, 0); } reg: OP_LCONV_TO_U4 (reg) { /* Clean out the upper word */ - MONO_EMIT_BIALU_IMM (s, tree, OP_SHR_UN_IMM, state->reg1, state->left->reg1, 0); + MONO_EMIT_BIALU_IMM (s, tree, OP_ISHR_UN_IMM, state->reg1, state->left->reg1, 0); } reg: OP_LCONV_TO_U8 (reg) { @@ -218,92 +227,84 @@ reg: OP_LCONV_TO_U2 (reg) { MONO_EMIT_UNALU (s, tree, CEE_CONV_U2, state->reg1, state->left->reg1); } - reg: OP_LCONV_TO_OVF_I1 (reg) { - MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 127); - MONO_EMIT_NEW_COND_EXC (s, GT, "OverflowException"); - MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, -128); - MONO_EMIT_NEW_COND_EXC (s, LT, "OverflowException"); + MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT, state->left->reg1, 127, "OverflowException"); + MONO_EMIT_NEW_COMPARE_IMM_EXC (s, LT, state->left->reg1, -128, "OverflowException"); + MONO_EMIT_UNALU (s, tree, CEE_CONV_I1, state->reg1, state->left->reg1); +} + +reg: OP_LCONV_TO_OVF_I1_UN (reg) { + MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT_UN, state->left->reg1, 127, "OverflowException"); MONO_EMIT_UNALU (s, tree, CEE_CONV_I1, state->reg1, state->left->reg1); } reg: OP_LCONV_TO_OVF_U1 (reg) { /* probe value to be within 0 to 255 */ - MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 255); - MONO_EMIT_NEW_COND_EXC (s, GT_UN, "OverflowException"); + MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT_UN, state->left->reg1, 255, "OverflowException"); MONO_EMIT_BIALU_IMM (s, tree, OP_AND_IMM, state->reg1, state->left->reg1, 0xff); } reg: OP_LCONV_TO_OVF_U1_UN (reg) { /* probe value to be within 0 to 255 */ - MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 255); - MONO_EMIT_NEW_COND_EXC (s, GT_UN, "OverflowException"); + MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT_UN, state->left->reg1, 255, "OverflowException"); MONO_EMIT_BIALU_IMM (s, tree, OP_AND_IMM, state->reg1, state->left->reg1, 0xff); } reg: OP_LCONV_TO_OVF_I2 (reg) { /* Probe value to be within -32768 and 32767 */ - MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 32767); - MONO_EMIT_NEW_COND_EXC (s, GT, "OverflowException"); - MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, -32768); - MONO_EMIT_NEW_COND_EXC (s, LT, "OverflowException"); + MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT, state->left->reg1, 32767, "OverflowException"); + MONO_EMIT_NEW_COMPARE_IMM_EXC (s, LT, state->left->reg1, -32768, "OverflowException"); + MONO_EMIT_UNALU (s, tree, CEE_CONV_I2, state->reg1, state->left->reg1); +} + +reg: OP_LCONV_TO_OVF_I2_UN (reg) { + /* Probe value to be within 0 and 32767 */ + MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT_UN, state->left->reg1, 32767, "OverflowException"); MONO_EMIT_UNALU (s, tree, CEE_CONV_I2, state->reg1, state->left->reg1); } reg: OP_LCONV_TO_OVF_U2 (reg) { /* Probe value to be within 0 and 65535 */ - MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 0xffff); - MONO_EMIT_NEW_COND_EXC (s, GT_UN, "OverflowException"); + MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT_UN, state->left->reg1, 0xffff, "OverflowException"); MONO_EMIT_BIALU_IMM (s, tree, OP_AND_IMM, state->reg1, state->left->reg1, 0xffff); } reg: OP_LCONV_TO_OVF_U2_UN (reg) { /* Probe value to be within 0 and 65535 */ - MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 0xffff); - MONO_EMIT_NEW_COND_EXC (s, GT_UN, "OverflowException"); + MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT_UN, state->left->reg1, 0xffff, "OverflowException"); MONO_EMIT_BIALU_IMM (s, tree, OP_AND_IMM, state->reg1, state->left->reg1, 0xffff); } reg: OP_LCONV_TO_OVF_I4 (reg) { - MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 0x7fffffff); - MONO_EMIT_NEW_COND_EXC (s, GT, "OverflowException"); - MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, -2147483648); - MONO_EMIT_NEW_COND_EXC (s, LT, "OverflowException"); + MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT, state->left->reg1, 0x7fffffff, "OverflowException"); + MONO_EMIT_NEW_COMPARE_IMM_EXC (s, LT, state->left->reg1, -2147483648, "OverflowException"); MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1); } reg: OP_LCONV_TO_OVF_I4_UN (reg) { - MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 0x7fffffff); - MONO_EMIT_NEW_COND_EXC (s, GT, "OverflowException"); + MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT_UN, state->left->reg1, 0x7fffffff, "OverflowException"); MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1); } -reg: OP_LCONV_TO_OVF_U4_UN (reg) { - MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 0xffffffff); - MONO_EMIT_NEW_COND_EXC (s, GT_UN, "OverflowException"); +reg: OP_LCONV_TO_OVF_U4 (reg) { + MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT, state->left->reg1, 0xffffffffUL, "OverflowException"); + MONO_EMIT_NEW_COMPARE_IMM_EXC (s, LT, state->left->reg1, 0, "OverflowException"); MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1); } -reg: OP_LCONV_TO_OVF_U4 (reg) { - MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 0xffffffffUL); - MONO_EMIT_NEW_COND_EXC (s, GT, "OverflowException"); - MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg1, 0); - MONO_EMIT_NEW_COND_EXC (s, LT, "OverflowException"); +reg: OP_LCONV_TO_OVF_U4_UN (reg) { + MONO_EMIT_NEW_COMPARE_IMM_EXC (s, GT_UN, state->left->reg1, 0xffffffff, "OverflowException"); MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1); } reg: OP_LCONV_TO_OVF_I_UN (reg), reg: OP_LCONV_TO_OVF_I8_UN (reg) { - MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg1, 0); - MONO_EMIT_NEW_COND_EXC (s, LT, "OverflowException"); - + MONO_EMIT_NEW_COMPARE_IMM_EXC (s, LT, state->left->reg1, 0, "OverflowException"); MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1); } reg: OP_LCONV_TO_OVF_U8 (reg) { - MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg1, 0); - MONO_EMIT_NEW_COND_EXC (s, LT, "OverflowException"); - + MONO_EMIT_NEW_COMPARE_IMM_EXC (s, LT, state->left->reg1, 0, "OverflowException"); MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1); } @@ -325,28 +326,21 @@ freg: OP_LCONV_TO_R_UN (lreg) { reg: CEE_CONV_OVF_I8 (reg) { /* Sign extend the value in the lower word into the upper word */ - MONO_EMIT_BIALU_IMM (s, tree, OP_LSHR_IMM, state->reg1, state->left->reg1, 0); + MONO_EMIT_UNALU (s, tree, CEE_CONV_I8, state->reg1, state->left->reg1); } -reg: CEE_CONV_OVF_I8_UN (reg) { - /* an unsigned 32 bit num always fits in a signed 64 bit one */ +reg: CEE_CONV_OVF_I8_UN (reg), +reg: CEE_CONV_OVF_U8_UN (reg) { + /* an unsigned 32 bit num always fits in an (un)signed 64 bit one */ /* Clean out the upper word */ - MONO_EMIT_BIALU_IMM (s, tree, OP_SHR_UN_IMM, state->reg1, state->left->reg1, 0); + MONO_EMIT_UNALU (s, tree, CEE_CONV_U8, state->reg1, state->left->reg1); } reg: CEE_CONV_OVF_U8 (reg) { - MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 0); - MONO_EMIT_NEW_COND_EXC (s, LT, "OverflowException"); + MONO_EMIT_NEW_COMPARE_IMM_EXC (s, LT, state->left->reg1, 0, "OverflowException"); MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1); } -reg: CEE_CONV_OVF_U8_UN (reg) { - g_assert_not_reached (); -} - - - - reg: OP_LCALLVIRT (reg) { mini_emit_virtual_call (s, state, tree, OP_LCALL, OP_LCALL_MEMBASE); } @@ -643,6 +637,18 @@ reg: CEE_REM_UN (reg, reg) { # MONO_EMIT_BIALU_IMM (s, tree, OP_IREM_UN_IMM, state->reg1, state->left->reg1, state->right->tree->inst_c0); #} +reg: OP_IMUL_IMM (reg) { + tree->sreg1 = state->left->reg1; + tree->dreg = state->reg1; + mono_bblock_add_inst (s->cbb, tree); +} + +reg: OP_LMUL_IMM (reg) { + tree->sreg1 = state->left->reg1; + tree->dreg = state->reg1; + mono_bblock_add_inst (s->cbb, tree); +} + c32flags: OP_COMPARE (reg, reg) { tree->opcode = OP_ICOMPARE; tree->sreg1 = state->left->reg1;