/* microcoded in mini-arm.c */
tree->sreg1 = mono_regstate_next_int (s->rs);
tree->dreg = state->reg1;
+
+ if (tree->flags & MONO_INST_INIT)
+ tree->sreg2 = mono_regstate_next_int (s->rs);
+
MONO_EMIT_NEW_ICONST (s, tree->sreg1, state->left->tree->inst_c0);
mono_bblock_add_inst (s->cbb, tree);
}
reg: OP_LOCALLOC (reg) {
tree->dreg = state->reg1;
tree->sreg1 = state->left->reg1;
+
+ if (tree->flags & MONO_INST_INIT)
+ tree->sreg2 = mono_regstate_next_int (s->rs);
+
mono_bblock_add_inst (s->cbb, tree);
}
mono_bblock_add_inst (s->cbb, tree);
}
-stmt: CEE_ENDFINALLY {
+stmt: OP_ENDFINALLY {
MonoInst *spvar = mono_find_spvar_for_region (s, s->cbb->region);
tree->inst_left = spvar;
mono_bblock_add_inst (s->cbb, tree);
MONO_EMIT_UNALU (s, tree, OP_BR_REG, -1, target_reg);
}
+stmt: CEE_STIND_I8 (OP_REGVAR, reg) {
+ MONO_EMIT_NEW_UNALU (s, OP_MOVE, state->left->tree->dreg,
+ state->right->reg1);
+}
+
reg: CEE_LDIND_I1 (OP_REGVAR) {
MONO_EMIT_UNALU (s, tree, OP_SEXT_I1, state->reg1,
state->left->tree->dreg);
}
-#stmt: CEE_BEQ (fpcflags) {
-# tree->opcode = OP_FBEQ;
-# mono_bblock_add_inst (s->cbb, tree);
-#}
-#
-#stmt: CEE_BNE_UN (fpcflags) {
-# tree->opcode = OP_FBNE_UN;
-# mono_bblock_add_inst (s->cbb, tree);
-#}
-#
-#stmt: CEE_BLT (fpcflags) {
-# tree->opcode = OP_FBLT;
-# mono_bblock_add_inst (s->cbb, tree);
-#}
-#
-#stmt: CEE_BLT_UN (fpcflags) {
-# tree->opcode = OP_FBLT_UN;
-# mono_bblock_add_inst (s->cbb, tree);
-#}
-#
-#stmt: CEE_BGT (fpcflags) {
-# tree->opcode = OP_FBGT;
-# mono_bblock_add_inst (s->cbb, tree);
-#}
-#
-#stmt: CEE_BGT_UN (fpcflags) {
-# tree->opcode = OP_FBGT_UN;
-# mono_bblock_add_inst (s->cbb, tree);
-#}
-#
-#stmt: CEE_BGE (fpcflags) {
-# tree->opcode = OP_FBGE;
-# mono_bblock_add_inst (s->cbb, tree);
-#}
-#
-#stmt: CEE_BGE_UN (fpcflags) {
-# tree->opcode = OP_FBGE_UN;
-# mono_bblock_add_inst (s->cbb, tree);
-#}
-#
-#stmt: CEE_BLE (fpcflags) {
-# tree->opcode = OP_FBLE;
-# mono_bblock_add_inst (s->cbb, tree);
+
+#stmt: CEE_BEQ (OP_LCOMPARE(reg, OP_I8CONST)) {
+# printf("Found match for CEE_BEQ (OP_LCOMPARE(reg, OP_I8CONST))\n");
#}
+
+# Compare floats sequences (comments from Zoltan Varga)
#
-#stmt: CEE_BLE_UN (fpcflags) {
-# tree->opcode = OP_FBLE_UN;
-# mono_bblock_add_inst (s->cbb, tree);
-#}
+# non-un comparisions should return false if the arguments are not
+# comparable, ie. 1.0 < nan is false. The un comparisions are needed
+# to implement the opposite of normal comparisions, i.e.
+# (a < b) is bl, while !(a < b) is translated into bge.un. This is
+# because fp comparirions can return 4 values, not just three: lesser,
+# greater, equal or unordered
stmt: CEE_BLT_UN (OP_COMPARE (freg, freg)) {
MONO_EMIT_UNALU (s, tree, OP_FBLT_UN, -1, -1);
}
+stmt: CEE_BLT (OP_COMPARE (freg, freg)) {
+ MONO_EMIT_NEW_BIALU (s, OP_ALPHA_CMPT_UN_SU, (alpha_at+1),
+ state->left->left->reg1, state->left->right->reg1);
+ MONO_EMIT_NEW_BIALU (s, OP_ALPHA_CMPT_LT_SU, alpha_at,
+ state->left->left->reg1, state->left->right->reg1);
+ MONO_EMIT_NEW_UNALU (s, OP_ALPHA_TRAPB, -1, -1);
+
+ MONO_EMIT_UNALU (s, tree, OP_FBLT, -1, -1);
+}
+
+
stmt: CEE_BLE_UN (OP_COMPARE (freg, freg)) {
MONO_EMIT_NEW_BIALU (s, OP_ALPHA_CMPT_UN_SU, (alpha_at+1),
state->left->left->reg1, state->left->right->reg1);
MONO_EMIT_UNALU (s, tree, OP_FBLE_UN, -1, -1);
}
+stmt: CEE_BLE (OP_COMPARE (freg, freg)) {
+ MONO_EMIT_NEW_BIALU (s, OP_ALPHA_CMPT_UN_SU, (alpha_at+1),
+ state->left->left->reg1, state->left->right->reg1);
+ MONO_EMIT_NEW_BIALU (s, OP_ALPHA_CMPT_LE_SU, alpha_at,
+ state->left->left->reg1, state->left->right->reg1);
+ MONO_EMIT_NEW_UNALU (s, OP_ALPHA_TRAPB, -1, -1);
+
+ MONO_EMIT_UNALU (s, tree, OP_FBLE, -1, -1);
+}
+
stmt: CEE_BGT_UN (OP_COMPARE (freg, freg)) {
MONO_EMIT_NEW_BIALU (s, OP_ALPHA_CMPT_UN_SU, (alpha_at+1),
state->left->left->reg1, state->left->right->reg1);
MONO_EMIT_UNALU (s, tree, OP_FBGT_UN, -1, -1);
}
+stmt: CEE_BGT (OP_COMPARE (freg, freg)) {
+ MONO_EMIT_NEW_BIALU (s, OP_ALPHA_CMPT_UN_SU, (alpha_at+1),
+ state->left->left->reg1, state->left->right->reg1);
+ MONO_EMIT_NEW_BIALU (s, OP_ALPHA_CMPT_LE_SU, alpha_at,
+ state->left->left->reg1, state->left->right->reg1);
+ MONO_EMIT_NEW_UNALU (s, OP_ALPHA_TRAPB, -1, -1);
+
+ MONO_EMIT_UNALU (s, tree, OP_FBGT, -1, -1);
+}
+
stmt: CEE_BGE_UN (OP_COMPARE (freg, freg)) {
MONO_EMIT_NEW_BIALU (s, OP_ALPHA_CMPT_UN_SU, (alpha_at+1),
state->left->left->reg1, state->left->right->reg1);
MONO_EMIT_UNALU (s, tree, OP_FBGE_UN, -1, -1);
}
+stmt: CEE_BGE (OP_COMPARE (freg, freg)) {
+ MONO_EMIT_NEW_BIALU (s, OP_ALPHA_CMPT_UN_SU, (alpha_at+1),
+ state->left->left->reg1, state->left->right->reg1);
+ MONO_EMIT_NEW_BIALU (s, OP_ALPHA_CMPT_LT_SU, alpha_at,
+ state->left->left->reg1, state->left->right->reg1);
+ MONO_EMIT_NEW_UNALU (s, OP_ALPHA_TRAPB, -1, -1);
+
+ MONO_EMIT_UNALU (s, tree, OP_FBGE, -1, -1);
+}
+
reg: OP_CEQ (OP_COMPARE (freg, freg)) {
MONO_EMIT_NEW_BIALU (s, OP_ALPHA_CMPT_EQ_SU, alpha_at,
state->left->left->reg1, state->left->right->reg1);
MONO_EMIT_NEW_UNALU (s, OP_ALPHA_TRAPB, -1, -1);
- tree->opcode = OP_FCEQ;
+ tree->dreg = state->reg1;
+ tree->opcode = OP_FCEQ;
mono_bblock_add_inst (s->cbb, tree);
}
state->left->left->reg1, state->left->right->reg1);
MONO_EMIT_NEW_UNALU (s, OP_ALPHA_TRAPB, -1, -1);
+ tree->dreg = state->reg1;
tree->opcode = OP_FCLT;
mono_bblock_add_inst (s->cbb, tree);
}
state->left->left->reg1, state->left->right->reg1);
MONO_EMIT_NEW_UNALU (s, OP_ALPHA_TRAPB, -1, -1);
+ tree->dreg = state->reg1;
tree->opcode = OP_FCLT_UN;
mono_bblock_add_inst (s->cbb, tree);
}
MONO_EMIT_NEW_UNALU (s, OP_ALPHA_TRAPB, -1, -1);
// tree->opcode = OP_FCGT;
+ tree->dreg = state->reg1;
tree->opcode = OP_FCLT;
mono_bblock_add_inst (s->cbb, tree);
}
state->left->right->reg1, state->left->left->reg1);
MONO_EMIT_NEW_UNALU (s, OP_ALPHA_TRAPB, -1, -1);
+ tree->dreg = state->reg1;
tree->opcode = OP_FCLT_UN;
mono_bblock_add_inst (s->cbb, tree);
}