This seems to work.<br><br>Thanks a lot,<br><br>Dan<br><br><b><i>Paolo Molaro &lt;lupus@ximian.com&gt;</i></b> wrote:<blockquote class="replbq" style="border-left: 2px solid rgb(16, 16, 255); margin-left: 5px; padding-left: 5px;"> On 11/14/06 D M wrote:<br>&gt; I think the issue is with the mini-arm.c add_general (guint *gr, guint *stack_size, ArgInfo *ainfo, gboolean simple) function.<br>&gt; It doesn't work properly for MONO_TYPE_I8/MONO_TYPE_R8 if just the first half fits in one register and the other on the stack.<br>&gt; mono_arch_create_trampoline seems to handle this case.<br>&gt; Is there an easy fix ?<br><br>You may want to try this mostly untested patch.<br><br>lupus<br><br>-- <br>-----------------------------------------------------------------<br>lupus@debian.org                                     debian/rules<br>lupus@ximian.com                             Monkeys do it better<br>Index:
 inssel-arm.brg<br>===================================================================<br>--- inssel-arm.brg (revision 67852)<br>+++ inssel-arm.brg (working copy)<br>@@ -274,6 +274,21 @@<br> <br> stmt: OP_OUTARG_MEMBASE (lreg) {<br>  int offset = tree-&gt;backend.arg_info &gt;&gt; 8;<br>+ int partial = (tree-&gt;backend.arg_info &amp; 0xff) == 0xff;<br>+ if (partial) {<br>+  MonoCallInst *call = (MonoCallInst*)tree-&gt;inst_right;<br>+  if (G_BYTE_ORDER == G_BIG_ENDIAN) {<br>+   MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STORE_MEMBASE_REG, ARMREG_SP, offset, state-&gt;left-&gt;reg1);<br>+  } else {<br>+   MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STORE_MEMBASE_REG, ARMREG_SP, offset, state-&gt;left-&gt;reg2);<br>+  }<br>+  tree-&gt;opcode = OP_SETREG;<br>+  tree-&gt;dreg = mono_regstate_next_int (s-&gt;rs);<br>+  tree-&gt;sreg1 = G_BYTE_ORDER == G_BIG_ENDIAN? state-&gt;left-&gt;reg2: state-&gt;left-&gt;reg1;<br>+  mono_bblock_add_inst (s-&gt;cbb, tree);<br>+  mono_call_inst_add_outarg_reg
 (s, call, tree-&gt;dreg, ARMREG_R3, FALSE);<br>+  return;<br>+ }<br>  if (G_BYTE_ORDER == G_BIG_ENDIAN) {<br>   MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STORE_MEMBASE_REG, ARMREG_SP, offset, state-&gt;left-&gt;reg2);<br>   MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STORE_MEMBASE_REG, ARMREG_SP, offset + 4, state-&gt;left-&gt;reg1);<br>@@ -286,6 +301,7 @@<br> stmt: OP_OUTARG_MEMBASE (freg) {<br>  int offset = tree-&gt;backend.arg_info &gt;&gt; 8;<br>  if (SOFT_FLOAT_IMPL) {<br>+  int partial = (tree-&gt;backend.arg_info &amp; 0xff) == 0xff;<br>   /* same as OP_OUTARG_MEMBASE (lreg) */<br>   if (G_BYTE_ORDER == G_BIG_ENDIAN) {<br>    MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STORE_MEMBASE_REG, ARMREG_SP, offset, state-&gt;left-&gt;reg2);<br>@@ -299,7 +315,17 @@<br>    MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STORER8_MEMBASE_REG, ARMREG_SP, offset, state-&gt;left-&gt;reg1);<br>   else if ((tree-&gt;backend.arg_info &amp; 0xff) == 4)<br>    MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STORER4_MEMBASE_REG,
 ARMREG_SP, offset, state-&gt;left-&gt;reg1);<br>-  else<br>+  else if ((tree-&gt;backend.arg_info &amp; 0xff) == 0xff) {<br>+   MonoCallInst *call = (MonoCallInst*)tree-&gt;inst_right;<br>+   int creg;<br>+   MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STORER8_MEMBASE_REG, ARMREG_SP, (s-&gt;param_area - 8), state-&gt;left-&gt;reg1);<br>+   creg = mono_regstate_next_int (s-&gt;rs);<br>+   mono_call_inst_add_outarg_reg (s, call, creg, ARMREG_R3, FALSE);<br>+   MONO_EMIT_NEW_LOAD_MEMBASE_OP (s, OP_LOAD_MEMBASE, creg, ARMREG_SP, (s-&gt;param_area - 8));<br>+   creg = mono_regstate_next_int (s-&gt;rs);<br>+   MONO_EMIT_NEW_LOAD_MEMBASE_OP (s, OP_LOAD_MEMBASE, creg, ARMREG_SP, (s-&gt;param_area - 4));<br>+   MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STORE_MEMBASE_REG, ARMREG_SP, offset, creg);<br>+  } else<br>    g_assert_not_reached ();<br>  }<br> }<br>Index: mini-arm.c<br>===================================================================<br>--- mini-arm.c (revision 67852)<br>+++ mini-arm.c
 (working copy)<br>@@ -318,6 +318,7 @@<br> enum {<br>  RegTypeGeneral,<br>  RegTypeBase,<br>+ RegTypeBaseGen,<br>  RegTypeFP,<br>  RegTypeStructByVal,<br>  RegTypeStructByAddr<br>@@ -355,7 +356,13 @@<br>    ainfo-&gt;reg = *gr;<br>   }<br>  } else {<br>-  if (*gr &gt; ARMREG_R2) {<br>+  if (*gr == ARMREG_R3) {<br>+   /* first word in r3 and the second on the stack */<br>+   ainfo-&gt;offset = *stack_size;<br>+   ainfo-&gt;reg = ARMREG_SP; /* in the caller */<br>+   ainfo-&gt;regtype = RegTypeBaseGen;<br>+   *stack_size += 4;<br>+  } else if (*gr &gt; ARMREG_R3) {<br>    /**stack_size += 7;<br>    *stack_size &amp;= ~7;*/<br>    ainfo-&gt;offset = *stack_size;<br>@@ -820,6 +827,12 @@<br>    } else if (ainfo-&gt;regtype == RegTypeBase) {<br>     arg-&gt;opcode = OP_OUTARG_MEMBASE;<br>     arg-&gt;backend.arg_info = (ainfo-&gt;offset &lt;&lt; 8) | ainfo-&gt;size;<br>+   } else if (ainfo-&gt;regtype == RegTypeBaseGen) {<br>+    call-&gt;used_iregs |= 1 &lt;&lt; ARMREG_R3;<br>+ 
   arg-&gt;opcode = OP_OUTARG_MEMBASE;<br>+    arg-&gt;backend.arg_info = (ainfo-&gt;offset &lt;&lt; 8) | 0xff;<br>+    if (arg-&gt;type == STACK_R8)<br>+     cfg-&gt;flags |= MONO_CFG_HAS_FPOUT;<br>    } else if (ainfo-&gt;regtype == RegTypeFP) {<br>     arg-&gt;backend.reg3 = ainfo-&gt;reg;<br>     /* FP args are passed in int regs */<br>@@ -2984,6 +2997,12 @@<br>      }<br>      break;<br>     }<br>+   } else if (ainfo-&gt;regtype == RegTypeBaseGen) {<br>+    g_assert (arm_is_imm12 (prev_sp_offset + ainfo-&gt;offset));<br>+    g_assert (arm_is_imm12 (inst-&gt;inst_offset));<br>+    ARM_LDR_IMM (code, ARMREG_LR, ARMREG_SP, (prev_sp_offset + ainfo-&gt;offset));<br>+    ARM_STR_IMM (code, ARMREG_LR, inst-&gt;inst_basereg, inst-&gt;inst_offset + 4);<br>+    ARM_STR_IMM (code, ARMREG_R3, inst-&gt;inst_basereg, inst-&gt;inst_offset);<br>    } else if (ainfo-&gt;regtype == RegTypeBase) {<br>     g_assert (arm_is_imm12 (prev_sp_offset + ainfo-&gt;offset));<br>     switch
 (ainfo-&gt;size) {<br>_______________________________________________<br>Mono-devel-list mailing list<br>Mono-devel-list@lists.ximian.com<br>http://lists.ximian.com/mailman/listinfo/mono-devel-list<br></blockquote><br><p>&#32;

<hr size=1>Cheap Talk? <a href="http://us.rd.yahoo.com/mail_us/taglines/postman8/*http://us.rd.yahoo.com/evt=39663/*http://voice.yahoo.com">Check out</a> Yahoo! Messenger's low PC-to-Phone call rates.