Author: zoltan
Date: 2005-03-21 14:00:42 -0500 (Mon, 21 Mar 2005)
New Revision: 42055

Modified:
   trunk/mono/mono/mini/ChangeLog
   trunk/mono/mono/mini/mini-amd64.c
Log:
2005-03-21  Zoltan Varga  <[EMAIL PROTECTED]>

        * mini-amd64.c (mono_arch_output_basic_block): Add inline versions of
        some fp functions in sse2 mode.


Modified: trunk/mono/mono/mini/ChangeLog
===================================================================
--- trunk/mono/mono/mini/ChangeLog      2005-03-21 18:19:29 UTC (rev 42054)
+++ trunk/mono/mono/mini/ChangeLog      2005-03-21 19:00:42 UTC (rev 42055)
@@ -1,3 +1,8 @@
+2005-03-21  Zoltan Varga  <[EMAIL PROTECTED]>
+
+       * mini-amd64.c (mono_arch_output_basic_block): Add inline versions of
+       some fp functions in sse2 mode.
+
 2005-03-20  Zoltan Varga  <[EMAIL PROTECTED]>
 
        * mini-x86.c (emit_tls_get): Move tls handling into a separate helper 
function.

Modified: trunk/mono/mono/mini/mini-amd64.c
===================================================================
--- trunk/mono/mono/mini/mini-amd64.c   2005-03-21 18:19:29 UTC (rev 42054)
+++ trunk/mono/mono/mini/mini-amd64.c   2005-03-21 19:00:42 UTC (rev 42055)
@@ -1260,6 +1260,14 @@
        amd64_fnstsw (code); \
 } while (0); 
 
+#define EMIT_SSE2_FPFUNC(code, op, dreg, sreg1) do { \
+    amd64_movsd_membase_reg (code, AMD64_RSP, -8, (sreg1)); \
+       amd64_fld_membase (code, AMD64_RSP, -8, TRUE); \
+       amd64_ ##op (code); \
+       amd64_fst_membase (code, AMD64_RSP, -8, TRUE, TRUE); \
+       amd64_movsd_reg_membase (code, (dreg), AMD64_RSP, -8); \
+} while (0);
+
 static guint8*
 emit_call (MonoCompile *cfg, guint8 *code, guint32 patch_type, gconstpointer 
data)
 {
@@ -4340,23 +4348,31 @@
                                amd64_fchs (code);
                        break;          
                case OP_SIN:
-                       if (use_sse2)
-                               g_assert_not_reached ();
-                       amd64_fsin (code);
-                       amd64_fldz (code);
-                       amd64_fp_op_reg (code, X86_FADD, 1, TRUE);
+                       if (use_sse2) {
+                               EMIT_SSE2_FPFUNC (code, fsin, ins->dreg, 
ins->sreg1);
+                       }
+                       else {
+                               amd64_fsin (code);
+                               amd64_fldz (code);
+                               amd64_fp_op_reg (code, X86_FADD, 1, TRUE);
+                       }
                        break;          
                case OP_COS:
-                       if (use_sse2)
-                               g_assert_not_reached ();
-                       amd64_fcos (code);
-                       amd64_fldz (code);
-                       amd64_fp_op_reg (code, X86_FADD, 1, TRUE);
+                       if (use_sse2) {
+                               EMIT_SSE2_FPFUNC (code, fcos, ins->dreg, 
ins->sreg1);
+                       }
+                       else {
+                               amd64_fcos (code);
+                               amd64_fldz (code);
+                               amd64_fp_op_reg (code, X86_FADD, 1, TRUE);
+                       }
                        break;          
                case OP_ABS:
-                       if (use_sse2)
-                               g_assert_not_reached ();
-                       amd64_fabs (code);
+                       if (use_sse2) {
+                               EMIT_SSE2_FPFUNC (code, fabs, ins->dreg, 
ins->sreg1);
+                       }
+                       else
+                               amd64_fabs (code);
                        break;          
                case OP_TAN: {
                        /* 
@@ -4404,9 +4420,11 @@
                        amd64_fp_op_reg (code, X86_FADD, 1, TRUE);
                        break;          
                case OP_SQRT:
-                       if (use_sse2)
-                               g_assert_not_reached ();
-                       amd64_fsqrt (code);
+                       if (use_sse2) {
+                               EMIT_SSE2_FPFUNC (code, fsqrt, ins->dreg, 
ins->sreg1);
+                       }
+                       else
+                               amd64_fsqrt (code);
                        break;          
                case OP_X86_FPOP:
                        if (!use_sse2)
@@ -5977,9 +5995,6 @@
 {
        MonoInst *ins = NULL;
 
-       if (use_sse2)
-               return NULL;
-
        if (cmethod->klass == mono_defaults.math_class) {
                if (strcmp (cmethod->name, "Sin") == 0) {
                        MONO_INST_NEW (cfg, ins, OP_SIN);
@@ -5988,9 +6003,13 @@
                        MONO_INST_NEW (cfg, ins, OP_COS);
                        ins->inst_i0 = args [0];
                } else if (strcmp (cmethod->name, "Tan") == 0) {
+                       if (use_sse2)
+                               return ins;
                        MONO_INST_NEW (cfg, ins, OP_TAN);
                        ins->inst_i0 = args [0];
                } else if (strcmp (cmethod->name, "Atan") == 0) {
+                       if (use_sse2)
+                               return ins;
                        MONO_INST_NEW (cfg, ins, OP_ATAN);
                        ins->inst_i0 = args [0];
                } else if (strcmp (cmethod->name, "Sqrt") == 0) {

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to