2008-07-25 Zoltan Varga <vargaz@gmail.com>
[mono.git] / mono / mini / inssel-float.brg
index cc9bc579dcb03a9360daeca42071072eda49b538..d797e7d3b5086e2ffe33f38b204ce79fb04d43e4 100644 (file)
@@ -1,3 +1,14 @@
+#if defined(MONO_ARCH_SOFT_FLOAT)
+#define SOFT_FLOAT_IMPL TRUE
+#else
+#define SOFT_FLOAT_IMPL FALSE
+#endif
+
+typedef union {
+       guint32 vali [2];
+       double vald;
+} DVal;
+
 %%
 
 #
 #
 
 freg: CEE_LDIND_R4 (base) {
-       MONO_EMIT_LOAD_MEMBASE_OP (s, tree, OP_LOADR4_MEMBASE, state->reg1, 
+       if (SOFT_FLOAT_IMPL) {
+               g_assert_not_reached ();
+       } else {
+               MONO_EMIT_LOAD_MEMBASE_OP (s, tree, OP_LOADR4_MEMBASE, state->reg1, 
                                   state->left->tree->inst_basereg, state->left->tree->inst_offset);
+       }
 }
 
 freg: CEE_LDIND_R8 (base) {
-       MONO_EMIT_LOAD_MEMBASE_OP (s, tree, OP_LOADR8_MEMBASE, state->reg1, 
+       if (SOFT_FLOAT_IMPL) {
+               MONO_EMIT_NEW_LOAD_MEMBASE_OP (s, OP_LOADI4_MEMBASE, state->reg1, 
+                                      state->left->tree->inst_basereg, state->left->tree->inst_offset + MINI_LS_WORD_OFFSET);
+               MONO_EMIT_NEW_LOAD_MEMBASE_OP (s, OP_LOADI4_MEMBASE, state->reg2, 
+                                      state->left->tree->inst_basereg, state->left->tree->inst_offset + MINI_MS_WORD_OFFSET);
+       } else {
+               MONO_EMIT_LOAD_MEMBASE_OP (s, tree, OP_LOADR8_MEMBASE, state->reg1, 
                                   state->left->tree->inst_basereg, state->left->tree->inst_offset);
+       }
 }
 
 stmt: CEE_STIND_R4 (base, freg) {
-       MONO_EMIT_STORE_MEMBASE (s, tree, OP_STORER4_MEMBASE_REG, state->left->tree->inst_basereg,
+       if (SOFT_FLOAT_IMPL) {
+               g_assert_not_reached ();
+       } else {
+               MONO_EMIT_STORE_MEMBASE (s, tree, OP_STORER4_MEMBASE_REG, state->left->tree->inst_basereg,
                                 state->left->tree->inst_offset, state->right->reg1);
+       }
 }
 
 stmt: CEE_STIND_R8 (base, freg) {
-       MONO_EMIT_STORE_MEMBASE (s, tree, OP_STORER8_MEMBASE_REG, state->left->tree->inst_basereg,
+       if (SOFT_FLOAT_IMPL) {
+               MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STOREI4_MEMBASE_REG, state->left->tree->inst_basereg,
+                                    state->left->tree->inst_offset + MINI_MS_WORD_OFFSET, state->right->reg2);
+               MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STOREI4_MEMBASE_REG, state->left->tree->inst_basereg,
+                                    state->left->tree->inst_offset + MINI_LS_WORD_OFFSET, state->right->reg1);
+       } else {
+               MONO_EMIT_STORE_MEMBASE (s, tree, OP_STORER8_MEMBASE_REG, state->left->tree->inst_basereg,
                                 state->left->tree->inst_offset, state->right->reg1);
+       }
 }
 
 freg: OP_R4CONST {
-       tree->dreg = state->reg1;
-       mono_bblock_add_inst (s->cbb, tree);
+       if (SOFT_FLOAT_IMPL) {
+               DVal d;
+               /* we load the r8 value */
+               d.vald = *(float*)tree->inst_p0;
+               MONO_EMIT_NEW_ICONST (s, state->reg1, d.vali [MINI_LS_WORD_IDX]);
+               MONO_EMIT_NEW_ICONST (s, state->reg2, d.vali [MINI_MS_WORD_IDX]);
+       } else {
+               tree->dreg = state->reg1;
+               mono_bblock_add_inst (s->cbb, tree);
+       }
 }
 
 freg: OP_R8CONST {
-       tree->dreg = state->reg1;
-       mono_bblock_add_inst (s->cbb, tree);
+       if (SOFT_FLOAT_IMPL) {
+               DVal d;
+               d.vald = *(double*)tree->inst_p0;
+               MONO_EMIT_NEW_ICONST (s, state->reg1, d.vali [MINI_LS_WORD_IDX]);
+               MONO_EMIT_NEW_ICONST (s, state->reg2, d.vali [MINI_MS_WORD_IDX]);
+       } else {
+               tree->dreg = state->reg1;
+               mono_bblock_add_inst (s->cbb, tree);
+       }
 }
 
 #
@@ -71,7 +119,7 @@ freg: OP_FNEG (freg) {
        MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
 }
 
-freg: CEE_CKFINITE (freg) {
+freg: OP_CKFINITE (freg) {
        MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
 }
 
@@ -202,32 +250,6 @@ fpcflags: OP_COMPARE (freg, freg) {
 stmt: CEE_POP (freg) {
        /* do nothing */
 }     
-
-
-freg: CEE_CKFINITE (freg) {
-       MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
 
 %%
+