Author: lupus
Date: 2006-10-06 10:02:25 -0400 (Fri, 06 Oct 2006)
New Revision: 66350
Modified:
trunk/mono/mono/mini/ChangeLog
trunk/mono/mono/mini/inssel-float.brg
trunk/mono/mono/mini/jit-icalls.c
trunk/mono/mono/mini/mini.c
Log:
Fri Oct 6 16:01:38 CEST 2006 Paolo Molaro <[EMAIL PROTECTED]>
* mini.c, jit-icalls.c, inssel-float.brg: beginnings of support
for soft-float.
Modified: trunk/mono/mono/mini/ChangeLog
===================================================================
--- trunk/mono/mono/mini/ChangeLog 2006-10-06 13:33:02 UTC (rev 66349)
+++ trunk/mono/mono/mini/ChangeLog 2006-10-06 14:02:25 UTC (rev 66350)
@@ -1,3 +1,9 @@
+
+Fri Oct 6 16:01:38 CEST 2006 Paolo Molaro <[EMAIL PROTECTED]>
+
+ * mini.c, jit-icalls.c, inssel-float.brg: beginnings of support
+ for soft-float.
+
2006-10-05 Zoltan Varga <[EMAIL PROTECTED]>
* mini-x86.c (emit_load_volatile_arguments): New function to handle
arguments of
Modified: trunk/mono/mono/mini/inssel-float.brg
===================================================================
--- trunk/mono/mono/mini/inssel-float.brg 2006-10-06 13:33:02 UTC (rev
66349)
+++ trunk/mono/mono/mini/inssel-float.brg 2006-10-06 14:02:25 UTC (rev
66350)
@@ -208,26 +208,18 @@
MONO_EMIT_UNALU (s, tree, tree->opcode, state->reg1, state->left->reg1);
}
+# when using soft float
+reg: OP_FBEQ (freg, freg),
+reg: OP_FBGE (freg, freg),
+reg: OP_FBGT (freg, freg),
+reg: OP_FBLE (freg, freg),
+reg: OP_FBLT (freg, freg),
+reg: OP_FBNE_UN (freg, freg),
+reg: OP_FBGE_UN (freg, freg),
+reg: OP_FBGT_UN (freg, freg),
+reg: OP_FBLE_UN (freg, freg),
+reg: OP_FBLT_UN (freg, freg) {
+ g_assert_not_reached ();
+}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
%%
Modified: trunk/mono/mono/mini/jit-icalls.c
===================================================================
--- trunk/mono/mono/mini/jit-icalls.c 2006-10-06 13:33:02 UTC (rev 66349)
+++ trunk/mono/mono/mini/jit-icalls.c 2006-10-06 14:02:25 UTC (rev 66350)
@@ -310,7 +310,9 @@
return res;
}
+#endif
+#if defined(MONO_ARCH_EMULATE_MUL_DIV) || defined(MONO_ARCH_SOFT_FLOAT)
double
mono_fdiv (double a, double b)
{
@@ -417,6 +419,130 @@
#endif
+#ifdef MONO_ARCH_SOFT_FLOAT
+
+double
+mono_fsub (double a, double b)
+{
+ return a - b;
+}
+
+double
+mono_fadd (double a, double b)
+{
+ return a + b;
+}
+
+double
+mono_fmul (double a, double b)
+{
+ return a * b;
+}
+
+double
+mono_fneg (double a)
+{
+ return -a;
+}
+
+double
+mono_fconv_r4 (double a)
+{
+ return (float)a;
+}
+
+gint8
+mono_fconv_i1 (double a)
+{
+ return (gint8)a;
+}
+
+gint16
+mono_fconv_i2 (double a)
+{
+ return (gint16)a;
+}
+
+gint32
+mono_fconv_i4 (double a)
+{
+ return (gint32)a;
+}
+
+guint8
+mono_fconv_u1 (double a)
+{
+ return (guint8)a;
+}
+
+guint16
+mono_fconv_u2 (double a)
+{
+ return (guint16)a;
+}
+
+gboolean
+mono_fcmp_eq (double a, double b)
+{
+ return a == b;
+}
+
+gboolean
+mono_fcmp_ge (double a, double b)
+{
+ return a >= b;
+}
+
+gboolean
+mono_fcmp_gt (double a, double b)
+{
+ return a > b;
+}
+
+gboolean
+mono_fcmp_le (double a, double b)
+{
+ return a <= b;
+}
+
+gboolean
+mono_fcmp_lt (double a, double b)
+{
+ return a < b;
+}
+
+gboolean
+mono_fcmp_ne_un (double a, double b)
+{
+ return isunordered (a, b) || a != b;
+}
+
+gboolean
+mono_fcmp_ge_un (double a, double b)
+{
+ return isunordered (a, b) || a >= b;
+}
+
+gboolean
+mono_fcmp_gt_un (double a, double b)
+{
+ return isunordered (a, b) || a > b;
+}
+
+gboolean
+mono_fcmp_le_un (double a, double b)
+{
+ return isunordered (a, b) || a <= b;
+}
+
+gboolean
+mono_fcmp_lt_un (double a, double b)
+{
+ return isunordered (a, b) || a < b;
+}
+
+#endif
+
/**
* ves_array_element_address:
* @this: a pointer to the array object
Modified: trunk/mono/mono/mini/mini.c
===================================================================
--- trunk/mono/mono/mini/mini.c 2006-10-06 13:33:02 UTC (rev 66349)
+++ trunk/mono/mono/mini/mini.c 2006-10-06 14:02:25 UTC (rev 66350)
@@ -1075,6 +1075,27 @@
return opcode;
}
+#ifdef MONO_ARCH_SOFT_FLOAT
+static int
+condbr_to_fp_br (int opcode)
+{
+ switch (opcode) {
+ case CEE_BEQ: return OP_FBEQ;
+ case CEE_BGE: return OP_FBGE;
+ case CEE_BGT: return OP_FBGT;
+ case CEE_BLE: return OP_FBLE;
+ case CEE_BLT: return OP_FBLT;
+ case CEE_BNE_UN: return OP_FBNE_UN;
+ case CEE_BGE_UN: return OP_FBGE_UN;
+ case CEE_BGT_UN: return OP_FBGT_UN;
+ case CEE_BLE_UN: return OP_FBLE_UN;
+ case CEE_BLT_UN: return OP_FBLT_UN;
+ }
+ g_assert_not_reached ();
+ return 0;
+}
+#endif
+
/*
* Returns the type used in the eval stack when @type is loaded.
* FIXME: return a MonoType/MonoClass for the byref and VALUETYPE cases.
@@ -4863,7 +4884,20 @@
ins->cil_code = ip++;
target = ip + 1 + *(signed char*)ip;
ip++;
+#ifdef MONO_ARCH_SOFT_FLOAT
+ if (sp [-1]->type == STACK_R8 || sp [-2]->type ==
STACK_R8) {
+ ins->opcode = condbr_to_fp_br (ins->opcode);
+ sp -= 2;
+ ins->inst_left = sp [0];
+ ins->inst_right = sp [1];
+ *sp++ = emit_tree (cfg, bblock, ins,
ins->cil_code);
+ ADD_UNCOND (TRUE);
+ } else {
+ ADD_BINCOND (NULL);
+ }
+#else
ADD_BINCOND (NULL);
+#endif
if (sp != stack_start) {
handle_stack_args (cfg, bblock, stack_start, sp
- stack_start);
sp = stack_start;
@@ -4924,7 +4958,20 @@
ins->cil_code = ip++;
target = ip + 4 + (gint32)read32(ip);
ip += 4;
- ADD_BINCOND(NULL);
+#ifdef MONO_ARCH_SOFT_FLOAT
+ if (sp [-1]->type == STACK_R8 || sp [-2]->type ==
STACK_R8) {
+ ins->opcode = condbr_to_fp_br (ins->opcode);
+ sp -= 2;
+ ins->inst_left = sp [0];
+ ins->inst_right = sp [1];
+ *sp++ = emit_tree (cfg, bblock, ins,
ins->cil_code);
+ ADD_UNCOND (TRUE);
+ } else {
+ ADD_BINCOND (NULL);
+ }
+#else
+ ADD_BINCOND (NULL);
+#endif
if (sp != stack_start) {
handle_stack_args (cfg, bblock, stack_start, sp
- stack_start);
sp = stack_start;
@@ -11193,6 +11240,8 @@
mono_register_opcode_emulation (CEE_MUL_OVF, "__emul_imul_ovf", "int32
int32 int32", mono_imul_ovf, FALSE);
mono_register_opcode_emulation (CEE_MUL_OVF_UN, "__emul_imul_ovf_un",
"int32 int32 int32", mono_imul_ovf_un, FALSE);
mono_register_opcode_emulation (CEE_MUL, "__emul_imul", "int32 int32
int32", mono_imul, TRUE);
+#endif
+#if defined(MONO_ARCH_EMULATE_MUL_DIV) || defined(MONO_ARCH_SOFT_FLOAT)
mono_register_opcode_emulation (OP_FDIV, "__emul_fdiv", "double double
double", mono_fdiv, FALSE);
#endif
@@ -11220,6 +11269,30 @@
mono_register_opcode_emulation (OP_FREM, "__emul_frem", "double double
double", fmod, FALSE);
#endif
+#ifdef MONO_ARCH_SOFT_FLOAT
+ mono_register_opcode_emulation (OP_FSUB, "__emul_fsub", "double double
double", mono_fsub, FALSE);
+ mono_register_opcode_emulation (OP_FADD, "__emul_fadd", "double double
double", mono_fadd, FALSE);
+ mono_register_opcode_emulation (OP_FMUL, "__emul_fmul", "double double
double", mono_fmul, FALSE);
+ mono_register_opcode_emulation (OP_FNEG, "__emul_fneg", "double
double", mono_fneg, FALSE);
+ mono_register_opcode_emulation (OP_FCONV_TO_R4, "__emul_fconv_to_r4",
"double double", mono_fconv_r4, FALSE);
+ mono_register_opcode_emulation (OP_FCONV_TO_I1, "__emul_fconv_to_i1",
"int8 double", mono_fconv_i1, FALSE);
+ mono_register_opcode_emulation (OP_FCONV_TO_I2, "__emul_fconv_to_i2",
"int16 double", mono_fconv_i2, FALSE);
+ mono_register_opcode_emulation (OP_FCONV_TO_I4, "__emul_fconv_to_i4",
"int32 double", mono_fconv_i4, FALSE);
+ mono_register_opcode_emulation (OP_FCONV_TO_U1, "__emul_fconv_to_u1",
"uint8 double", mono_fconv_u1, FALSE);
+ mono_register_opcode_emulation (OP_FCONV_TO_U2, "__emul_fconv_to_u2",
"uint16 double", mono_fconv_u2, FALSE);
+
+ mono_register_opcode_emulation (OP_FBEQ, "__emul_fcmp_eq", "uint32
double double", mono_fcmp_eq, FALSE);
+ mono_register_opcode_emulation (OP_FBLT, "__emul_fcmp_lt", "uint32
double double", mono_fcmp_lt, FALSE);
+ mono_register_opcode_emulation (OP_FBGT, "__emul_fcmp_gt", "uint32
double double", mono_fcmp_gt, FALSE);
+ mono_register_opcode_emulation (OP_FBLE, "__emul_fcmp_le", "uint32
double double", mono_fcmp_le, FALSE);
+ mono_register_opcode_emulation (OP_FBGE, "__emul_fcmp_ge", "uint32
double double", mono_fcmp_ge, FALSE);
+ mono_register_opcode_emulation (OP_FBNE_UN, "__emul_fcmp_ne_un",
"uint32 double double", mono_fcmp_ne_un, FALSE);
+ mono_register_opcode_emulation (OP_FBLT_UN, "__emul_fcmp_lt_un",
"uint32 double double", mono_fcmp_lt_un, FALSE);
+ mono_register_opcode_emulation (OP_FBGT_UN, "__emul_fcmp_gt_un",
"uint32 double double", mono_fcmp_gt_un, FALSE);
+ mono_register_opcode_emulation (OP_FBLE_UN, "__emul_fcmp_le_un",
"uint32 double double", mono_fcmp_le_un, FALSE);
+ mono_register_opcode_emulation (OP_FBGE_UN, "__emul_fcmp_ge_un",
"uint32 double double", mono_fcmp_ge_un, FALSE);
+#endif
+
#if SIZEOF_VOID_P == 4
mono_register_opcode_emulation (OP_FCONV_TO_U, "__emul_fconv_to_u",
"uint32 double", mono_fconv_u4, TRUE);
#endif
_______________________________________________
Mono-patches maillist - [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches