2008-08-29 Geoff Norton <gnorton@novell.com>
[mono.git] / mono / mini / inssel-alpha.brg
index 479770cff2b215edaa8bd7a04d66949514ca1780..efd3b3ad43b211063e1dba191426a1f0fdd847cf 100644 (file)
@@ -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);
 }
@@ -512,4 +535,12 @@ freg: OP_LCONV_TO_R4 (reg) {
         mono_bblock_add_inst (s->cbb, tree);
 }
 
+reg: CEE_LDIND_REF (OP_REGVAR),
+reg: CEE_LDIND_I (OP_REGVAR),
+reg: CEE_LDIND_I8 (OP_REGVAR),
+reg: CEE_LDIND_I4 (OP_REGVAR),
+reg: CEE_LDIND_U4 (OP_REGVAR) "0" {
+        state->reg1 = state->left->tree->dreg;
+        tree->dreg = state->reg1;
+}