Mon Dec 1 16:54:05 CET 2003 Paolo Molaro <lupus@ximian.com>
authorPaolo Molaro <lupus@oddwiz.org>
Mon, 1 Dec 2003 15:49:54 +0000 (15:49 -0000)
committerPaolo Molaro <lupus@oddwiz.org>
Mon, 1 Dec 2003 15:49:54 +0000 (15:49 -0000)
* mini-ppc.c, tramp-ppc.c: save FP arguments in the trampoline.
More FP-related fixes.

svn path=/trunk/mono/; revision=20668

mono/mini/ChangeLog
mono/mini/mini-ppc.c
mono/mini/tramp-ppc.c

index c93259df42b62b213e126cdb1cd7ed050c17f0bc..23c3b991d57b7550a4a29676076361578c366026 100644 (file)
@@ -1,4 +1,14 @@
 
+Mon Dec 1 16:54:05 CET 2003 Paolo Molaro <lupus@ximian.com>
+
+       * mini-ppc.c, tramp-ppc.c: save FP arguments in the trampoline.
+       More FP-related fixes.
+
+Sun Nov 30 19:13:52 CET 2003 Paolo Molaro <lupus@ximian.com>
+
+       * mini-ppc.c, cpu-g4.md, inssel-ppc.brg: fixed finally handlers
+       and register allocation buglet. Hello world now runs.
+
 Fri Nov 28 23:03:05 CET 2003 Paolo Molaro <lupus@ximian.com>
 
        * cpu-g4.md, inssel-ppc.brg, mini-ppc.c: better long return support.
index 9414cd61c913c5409c176c8345cee0ce404908de..12ffbfeb462c85f23716f3bd5f5a5fcd735ffc24 100644 (file)
@@ -900,6 +900,13 @@ mono_arch_call_opcode (MonoCompile *cfg, MonoBasicBlock* bb, MonoCallInst *call,
                                arg->opcode = OP_OUTARG_R8;
                                arg->unused = ainfo->reg;
                                call->used_fregs |= 1 << ainfo->reg;
+                               if (ainfo->size == 4) {
+                                       /* we reduce the precision */
+                                       MonoInst *conv;
+                                       MONO_INST_NEW (cfg, conv, OP_FCONV_TO_R4);
+                                       conv->inst_left = arg->inst_left;
+                                       arg->inst_left = conv;
+                               }
                        } else {
                                g_assert_not_reached ();
                        }
@@ -2837,15 +2844,15 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        ppc_li (code, ins->dreg, 0);
                        break;
                case OP_FCGT:
-                       ppc_fcmpu (code, 0, ins->sreg1, ins->sreg2);
+                       ppc_fcmpo (code, 0, ins->sreg1, ins->sreg2);
                        ppc_li (code, ins->dreg, 1);
-                       ppc_bc (code, PPC_BR_TRUE, PPC_BR_LT, 2);
+                       ppc_bc (code, PPC_BR_TRUE, PPC_BR_GT, 2);
                        ppc_li (code, ins->dreg, 0);
                        break;
                case OP_FCGT_UN:
-                       ppc_fcmpo (code, 0, ins->sreg1, ins->sreg2);
+                       ppc_fcmpu (code, 0, ins->sreg1, ins->sreg2);
                        ppc_li (code, ins->dreg, 1);
-                       ppc_bc (code, PPC_BR_TRUE, PPC_BR_LT, 2);
+                       ppc_bc (code, PPC_BR_TRUE, PPC_BR_GT, 2);
                        ppc_li (code, ins->dreg, 0);
                        break;
                case OP_FBEQ:
index 9f13292e50832899d3bdc47b1fc30055fa229a3a..cca923f36ef88a7cc00aff9d7616a3be28703a92 100644 (file)
@@ -66,7 +66,7 @@ get_unbox_trampoline (MonoMethod *m, gpointer addr)
 }
 
 /* Stack size for trampoline function */
-#define STACK 144
+#define STACK (144 + 8*8)
 
 /* Method-specific trampoline code framgment size */
 #define METHOD_TRAMPOLINE_SIZE 64
@@ -230,6 +230,7 @@ create_trampoline_code (MonoTrampolineType tramp_type)
        guint8 *buf, *code = NULL;
        static guint8* generic_jump_trampoline = NULL;
        static guint8 *generic_class_init_trampoline = NULL;
+       int i, offset;
 
        switch (tramp_type) {
        case MONO_TRAMPOLINE_GENERIC:
@@ -310,6 +311,13 @@ create_trampoline_code (MonoTrampolineType tramp_type)
                /* Save 'method' pseudo-parameter - the one passed in r11 */
                ppc_stw  (buf, ppc_r11, STACK - 124, ppc_r1);
 
+               /* Save the FP registers */
+               offset = 124 + 4 + 8;
+               for (i = ppc_f1; i <= ppc_f8; ++i) {
+                       ppc_stfd  (buf, i, STACK - offset, ppc_r1);
+                       offset += 8;
+               }
+
                /*----------------------------------------------------------
                STEP 1: call 'mono_get_lmf_addr()' to get the address of our
                LMF. We'll need to restore it after the call to
@@ -391,6 +399,12 @@ create_trampoline_code (MonoTrampolineType tramp_type)
                ppc_lwz  (buf, ppc_r9,  STACK - 36,  ppc_r1);
                ppc_lwz  (buf, ppc_r10, STACK - 40,  ppc_r1);
                
+               /* Restore the FP registers */
+               offset = 124 + 4 + 8;
+               for (i = ppc_f1; i <= ppc_f8; ++i) {
+                       ppc_lfd  (buf, i, STACK - offset, ppc_r1);
+                       offset += 8;
+               }
                /* We haven't touched any of these, so there's no need to
                restore them */
                /*