Don't run test-318 with gmcs.
[mono.git] / mono / mini / inssel-long32.brg
index 6c7359ce0a7dd9aceb5345526f54243fe570c61c..404ce75e6f36091ccd75038de70e57a07994c7df 100644 (file)
@@ -244,6 +244,27 @@ lreg: OP_LONG_SHRUN_32 (lreg) {
        MONO_EMIT_NEW_ICONST (s, state->reg2, 0);
 }
 
+reg: OP_LCONV_TO_I4 (OP_LONG_SHRUN_32 (lreg)),
+reg: OP_LCONV_TO_U4 (OP_LONG_SHRUN_32 (lreg)) {
+       MONO_EMIT_NEW_UNALU (s, OP_MOVE, state->reg1, state->left->left->reg2);
+}
+
+
+lreg: OP_LONG_SHRUN_32 (CEE_LDIND_I8 (base)) {
+       /* just move the upper half to the lower and zero the high word */
+       MONO_EMIT_NEW_LOAD_MEMBASE_OP (s, OP_LOADI4_MEMBASE, state->reg1, 
+                                      state->left->left->tree->inst_basereg, state->left->left->tree->inst_offset + MINI_MS_WORD_OFFSET);
+       MONO_EMIT_NEW_ICONST (s, state->reg2, 0);
+}
+
+reg: OP_LCONV_TO_I4 (OP_LONG_SHRUN_32 (CEE_LDIND_I8 (base))),
+reg: OP_LCONV_TO_U4 (OP_LONG_SHRUN_32 (CEE_LDIND_I8 (base))) {
+       /* just move the upper half to the lower and zero the high word */
+       MONO_EMIT_NEW_LOAD_MEMBASE_OP (s, OP_LOADI4_MEMBASE, state->reg1, 
+                                      state->left->left->left->tree->inst_basereg,
+                                      state->left->left->left->tree->inst_offset + MINI_MS_WORD_OFFSET);
+}
+
 lreg: OP_LADD (lreg, lreg) {
        MONO_EMIT_NEW_BIALU (s, OP_ADDCC, state->reg1, state->left->reg1, state->right->reg1);
        MONO_EMIT_BIALU (s, tree, OP_ADC, state->reg2, state->left->reg2, state->right->reg2);
@@ -264,7 +285,7 @@ lreg: OP_LADD_OVF_UN (lreg, lreg) {
 }
 
 lreg: OP_LADD (lreg, i8con) {
-       MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, state->reg1, state->left->reg1, state->right->tree->inst_ls_word);
+       MONO_EMIT_NEW_BIALU_IMM (s, OP_ADDCC_IMM, state->reg1, state->left->reg1, state->right->tree->inst_ls_word);
        MONO_EMIT_BIALU_IMM (s, tree, OP_ADC_IMM, state->reg2, state->left->reg2, state->right->tree->inst_ms_word);
 }
 
@@ -274,7 +295,7 @@ lreg: OP_LSUB (lreg, lreg) {
 }
 
 lreg: OP_LSUB (lreg, i8con) {
-       MONO_EMIT_NEW_BIALU_IMM (s, OP_SUB_IMM, state->reg1, state->left->reg1, state->right->tree->inst_ls_word);
+       MONO_EMIT_NEW_BIALU_IMM (s, OP_SUBCC_IMM, state->reg1, state->left->reg1, state->right->tree->inst_ls_word);
        MONO_EMIT_BIALU_IMM (s, tree, OP_SBB_IMM, state->reg2, state->left->reg2, state->right->tree->inst_ms_word);
 }
 
@@ -677,28 +698,25 @@ reg: OP_LCONV_TO_I4 (i8con) {
        MONO_EMIT_NEW_ICONST (s, state->reg1, state->left->tree->inst_ls_word);
 }
 
-reg: OP_LCONV_TO_I4 (lreg) {
-       MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
-}
-
+reg: OP_LCONV_TO_I4 (lreg),
 reg: OP_LCONV_TO_U4 (lreg) {
        MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
 }
 
-lreg: OP_LCONV_TO_U8 (lreg) {
-       MONO_EMIT_NEW_UNALU (s, OP_MOVE, state->reg1, state->left->reg1);
-       MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg2, state->left->reg2);
+reg: OP_LCONV_TO_I4 (CEE_LDIND_I8 (base)),
+reg: OP_LCONV_TO_U4 (CEE_LDIND_I8 (base)) {
+       MONO_EMIT_LOAD_MEMBASE_OP (s, tree, OP_LOADI4_MEMBASE, state->reg1, 
+                                  state->left->left->tree->inst_basereg, 
+                                  state->left->left->tree->inst_offset + MINI_LS_WORD_OFFSET);
 }
 
+lreg: OP_LCONV_TO_U8 (lreg),
 lreg: OP_LCONV_TO_I8 (lreg) {
        MONO_EMIT_NEW_UNALU (s, OP_MOVE, state->reg1, state->left->reg1);
        MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg2, state->left->reg2);
 }
 
-reg: OP_LCONV_TO_U (lreg) {
-       MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
-}
-
+reg: OP_LCONV_TO_U (lreg),
 reg: OP_LCONV_TO_I (lreg) {
        MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
 }
@@ -731,15 +749,30 @@ reg: OP_LCONV_TO_OVF_I1_UN (lreg) {
 }
 
 reg: OP_LCONV_TO_OVF_I1 (lreg) {
+       MonoInst *is_negative, *end_label;
+
+       MONO_NEW_LABEL (s, is_negative);
+       MONO_NEW_LABEL (s, end_label);
+
        MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg2, 0);
        MONO_EMIT_NEW_COND_EXC (s, GT, "OverflowException");
        MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg2, -1);
        MONO_EMIT_NEW_COND_EXC (s, LT, "OverflowException");
 
+       MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg2, 0);
+       MONO_EMIT_NEW_BRANCH_LABEL (s, CEE_BLT, is_negative);
+
+       /* Positive */
        MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 127);
-       MONO_EMIT_NEW_COND_EXC (s, GT, "OverflowException");
+       MONO_EMIT_NEW_COND_EXC (s, GT_UN, "OverflowException");
+       MONO_EMIT_NEW_BRANCH_LABEL (s, CEE_BR, end_label);
+
+       /* Negative */
+       mono_bblock_add_inst (s->cbb, is_negative);
        MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, -128);
-       MONO_EMIT_NEW_COND_EXC (s, LT, "OverflowException");
+       MONO_EMIT_NEW_COND_EXC (s, LT_UN, "OverflowException");
+       mono_bblock_add_inst (s->cbb, end_label);
+
        MONO_EMIT_UNALU (s, tree, CEE_CONV_I1, state->reg1, state->left->reg1);
 }
 
@@ -755,16 +788,30 @@ reg: OP_LCONV_TO_OVF_U1 (lreg) {
 }
 
 reg: OP_LCONV_TO_OVF_I2 (lreg) {
+       MonoInst *is_negative, *end_label;
+
+       MONO_NEW_LABEL (s, is_negative);
+       MONO_NEW_LABEL (s, end_label);
+
        MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg2, 0);
        MONO_EMIT_NEW_COND_EXC (s, GT, "OverflowException");
        MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg2, -1);
        MONO_EMIT_NEW_COND_EXC (s, LT, "OverflowException");
 
-       /* Probe value to be within -32768 and 32767 */
+       MONO_EMIT_NEW_BIALU_IMM (s, OP_COMPARE_IMM, -1, state->left->reg2, 0);
+       MONO_EMIT_NEW_BRANCH_LABEL (s, CEE_BLT, is_negative);
+
+       /* Positive */
        MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, 32767);
-       MONO_EMIT_NEW_COND_EXC (s, GT, "OverflowException");
+       MONO_EMIT_NEW_COND_EXC (s, GT_UN, "OverflowException");
+       MONO_EMIT_NEW_BRANCH_LABEL (s, CEE_BR, end_label);
+
+       /* Negative */
+       mono_bblock_add_inst (s->cbb, is_negative);
        MONO_EMIT_NEW_COMPARE_IMM (s, state->left->reg1, -32768);
-       MONO_EMIT_NEW_COND_EXC (s, LT, "OverflowException");
+       MONO_EMIT_NEW_COND_EXC (s, LT_UN, "OverflowException");
+       mono_bblock_add_inst (s->cbb, end_label);
+
        MONO_EMIT_UNALU (s, tree, CEE_CONV_I2, state->reg1, state->left->reg1);
 }