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