X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=mono%2Fmini%2Finssel-alpha.brg;h=efd3b3ad43b211063e1dba191426a1f0fdd847cf;hb=72bb61054d706a82a178dc16a4b8a550e62e034f;hp=e81c7b81d9daa3645e2614b6b63761beb46450ec;hpb=4eb352bcb3ef7a71dc9ab62c5cd2d5e7598619f7;p=mono.git diff --git a/mono/mini/inssel-alpha.brg b/mono/mini/inssel-alpha.brg index e81c7b81d9d..efd3b3ad43b 100644 --- a/mono/mini/inssel-alpha.brg +++ b/mono/mini/inssel-alpha.brg @@ -53,6 +53,10 @@ reg: OP_LOCALLOC (OP_ICONST) { /* 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); } @@ -60,6 +64,10 @@ reg: OP_LOCALLOC (OP_ICONST) { 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); } @@ -192,7 +200,7 @@ stmt: OP_START_HANDLER { 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); @@ -205,7 +213,7 @@ stmt: OP_ENDFILTER (reg) { mono_bblock_add_inst (s->cbb, tree); } -stmt: CEE_SWITCH (reg) { +stmt: OP_SWITCH (reg) { MonoInst *label; int offset_reg = mono_regstate_next_int (s->rs); int target_reg = mono_regstate_next_int (s->rs); @@ -276,6 +284,11 @@ stmt: CEE_SWITCH (reg) { 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); @@ -287,55 +300,19 @@ reg: CEE_LDIND_I2 (OP_REGVAR) { } -#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)) { @@ -348,6 +325,17 @@ 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); @@ -358,6 +346,16 @@ stmt: CEE_BLE_UN (OP_COMPARE (freg, freg)) { 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); @@ -368,6 +366,16 @@ stmt: CEE_BGT_UN (OP_COMPARE (freg, freg)) { 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); @@ -378,12 +386,23 @@ stmt: CEE_BGE_UN (OP_COMPARE (freg, freg)) { 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); } @@ -392,6 +411,7 @@ reg: OP_CLT (OP_COMPARE (freg, freg)) { 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); } @@ -403,6 +423,7 @@ reg: OP_CLT_UN (OP_COMPARE (freg, freg)) { 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); } @@ -416,6 +437,7 @@ reg: OP_CGT (OP_COMPARE (freg, freg)) { 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); } @@ -428,6 +450,7 @@ reg: OP_CGT_UN (OP_COMPARE (freg, freg)) { 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); }