+#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);
+ }
}
#
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);
}
stmt: CEE_POP (freg) {
/* do nothing */
}
-
-
-freg: CEE_CKFINITE (freg) {
- MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
-}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
%%
+