state->left->tree->inst_offset, state->right->tree->inst_c0);
}
+lreg: OP_BIGMUL (reg, reg) {
+ MONO_EMIT_NEW_BIALU (s, OP_BIGMUL, state->reg1, state->left->reg1, state->right->reg1);
+}
lreg: OP_LADD (lreg, lreg) {
- MONO_EMIT_NEW_BIALU (s, CEE_ADD, state->reg1, state->left->reg1, state->right->reg1);
+ 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);
}
lreg: OP_LADD_OVF (lreg, lreg) {
/* ADC sets the condition code */
- MONO_EMIT_NEW_BIALU (s, CEE_ADD, state->reg1, state->left->reg1, state->right->reg1);
+ MONO_EMIT_NEW_BIALU (s, OP_ADDCC, state->reg1, state->left->reg1, state->right->reg1);
MONO_EMIT_NEW_BIALU (s, OP_ADC, state->reg2, state->left->reg2, state->right->reg2);
MONO_EMIT_NEW_COND_EXC (s, OV, "OverflowException");
}
lreg: OP_LADD_OVF_UN (lreg, lreg) {
/* ADC sets the condition code */
- MONO_EMIT_NEW_BIALU (s, CEE_ADD, state->reg1, state->left->reg1, state->right->reg1);
+ MONO_EMIT_NEW_BIALU (s, OP_ADDCC, state->reg1, state->left->reg1, state->right->reg1);
MONO_EMIT_NEW_BIALU (s, OP_ADC, state->reg2, state->left->reg2, state->right->reg2);
MONO_EMIT_NEW_COND_EXC (s, C, "OverflowException");
}
}
lreg: OP_LSUB (lreg, lreg) {
- MONO_EMIT_NEW_BIALU (s, CEE_SUB, state->reg1, state->left->reg1, state->right->reg1);
+ MONO_EMIT_NEW_BIALU (s, OP_SUBCC, state->reg1, state->left->reg1, state->right->reg1);
MONO_EMIT_BIALU (s, tree, OP_SBB, state->reg2, state->left->reg2, state->right->reg2);
}
lreg: OP_LSUB_OVF (lreg, lreg) {
/* SBB sets the condition code */
- MONO_EMIT_NEW_BIALU (s, CEE_SUB, state->reg1, state->left->reg1, state->right->reg1);
+ MONO_EMIT_NEW_BIALU (s, OP_SUBCC, state->reg1, state->left->reg1, state->right->reg1);
MONO_EMIT_NEW_BIALU (s, OP_SBB, state->reg2, state->left->reg2, state->right->reg2);
MONO_EMIT_NEW_COND_EXC (s, OV, "OverflowException");
}
MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
}
+lreg: CEE_CONV_OVF_I8 (reg) {
+ /* a signed 32 bit num always fits in a signed 64 bit one */
+ MONO_EMIT_NEW_ICONST (s, state->reg2, 0);
+ MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
+}
+
+lreg: CEE_CONV_OVF_I8_UN (reg) {
+ /* an unsigned 32 bit num always fits in a signed 64 bit one */
+ MONO_EMIT_NEW_ICONST (s, state->reg2, 0);
+ MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
+}
+
+lreg: CEE_CONV_OVF_U8_UN (reg) {
+ MONO_EMIT_NEW_ICONST (s, state->reg2, 0);
+ MONO_EMIT_UNALU (s, tree, OP_MOVE, state->reg1, state->left->reg1);
+}
+
freg: OP_LCONV_TO_R_UN (lreg) {
MONO_EMIT_BIALU (s, tree, tree->opcode, state->reg1, state->left->reg1, state->left->reg2);
}