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

Reply via email to