2007-04-06 Andreas Faerber <andreas.faerber@web.de>
[mono.git] / mono / mini / tramp-alpha.c
index a7837dbf9d12d0ede7a06267f761fbcc25365af0..2f2882422b6bcaa19570054230013cc71bcf99c7 100644 (file)
@@ -508,6 +508,21 @@ mono_arch_nullify_class_init_trampoline (guint8 *code, gssize *regs)
 
   ALPHA_DEBUG("mono_arch_nullify_class_init_trampoline");
 
+  // pcode[-2] ldq     t12,n(gp)
+  // pcode[-1] jsr     ra,(t12),0x20003efcb40
+  if ((pcode[-2] & 0xFFFF0000) == 0xa77d0000 &&
+       pcode[-1] == 0x6b5b4000)
+  {
+      // Put "unop" into call inst
+      pcode--;
+      alpha_nop(pcode);
+      alpha_nop(pcode);
+      alpha_nop(pcode);
+
+      mono_arch_flush_icache ((code-4), 3*4);
+  }
+  else
+      g_assert_not_reached ();
 }
 
 /*
@@ -535,9 +550,9 @@ mono_arch_patch_delegate_trampoline (guint8 *code, guint8 *tramp,
   // -2 - mov     v0,t12
   // -1 - jsr     ra,(t12),0x200041476e4
   //  0 - ldah    gp,0(ra)
-  if (((pcode[-4] & 0xFF000000) == 0xA4000000) &&
-      ((pcode[-3] & 0xFF000000) == 0xA4000000) &&
-      ((pcode[-2] & 0xFF00FF00) == 0x47000400) &&
+  if (((pcode[-4] & 0xFC000000) == 0xA4000000) &&
+      ((pcode[-3] & 0xFC000000) == 0xA4000000) &&
+      ((pcode[-2] & 0xFC000FE0) == 0x44000400) &&
       ((pcode[-1] & 0xFFFF0000) == 0x6B5B0000))
     {
       fp_disp = (pcode[-4] & 0xFFFF);
@@ -547,7 +562,6 @@ mono_arch_patch_delegate_trampoline (guint8 *code, guint8 *tramp,
       obj = *pobj;
       reg = 0;
     }
-  else
     // The non-optimized call signature for now is
     // -5 - ldq     v0,24(fp)
     // -4 - mov     v0,v0
@@ -555,21 +569,39 @@ mono_arch_patch_delegate_trampoline (guint8 *code, guint8 *tramp,
     // -2 - mov     v0,t12
     // -1 - jsr     ra,(t12),0x200041476e4
     //  0 - ldah    gp,0(ra)
-    if (((pcode[-5] & 0xFF000000) == 0xA4000000) &&
-       ((pcode[-4] & 0xFF00FF00) == 0x47000400) &&
-       ((pcode[-3] & 0xFF000000) == 0xA4000000) &&
-       ((pcode[-2] & 0xFF00FF00) == 0x47000400) &&
-       ((pcode[-1] & 0xFFFF0000) == 0x6B5B0000))
-      {
-       fp_disp = (pcode[-5] & 0xFFFF);
-       obj_disp = (pcode[-3] & 0xFFFF);
+  else if (((pcode[-5] & 0xFC000000) == 0xA4000000) &&
+          ((pcode[-4] & 0xFC000FE0) == 0x44000400) &&
+          ((pcode[-3] & 0xFC000000) == 0xA4000000) &&
+          ((pcode[-2] & 0xFC000FE0) == 0x44000400) &&
+          ((pcode[-1] & 0xFFFF0000) == 0x6B5B0000))
+    {
+      fp_disp = (pcode[-5] & 0xFFFF);
+      obj_disp = (pcode[-3] & 0xFFFF);
 
-       pobj = regs[15] + fp_disp;
-       obj = *pobj;
-       reg = 0;
-      }
-    else
-      g_assert_not_reached ();
+      pobj = regs[15] + fp_disp;
+      obj = *pobj;
+      reg = 0;
+    }
+      // Code with linears optimization
+      // -4 - mov     reg,v0
+      // -3 - ldq     v0,40(v0)
+      // -2 - mov     v0,t12
+      // -1 - jsr     ra,(t12)
+      //  0 - ldah    gp,0(ra)
+  else if (((pcode[-4] & 0xFC000FE0) == 0x44000400) &&
+          ((pcode[-3] & 0xFC000000) == 0xA4000000) &&
+          ((pcode[-2] & 0xFC000FE0) == 0x44000400) &&
+          ((pcode[-1] & 0xFFFF0000) == 0x6B5B0000))
+    {
+      fp_disp = (pcode[-4] >> AXP_REG2_SHIFT) & AXP_REG_MASK;
+      obj_disp = (pcode[-3] & 0xFFFF);
+
+      obj = regs[fp_disp];
+      //obj = *pobj;
+      reg = 0;
+    }
+  else
+    g_assert_not_reached ();
 
   *((gpointer*)(obj + obj_disp)) = addr;
 }
@@ -684,13 +716,13 @@ mono_arch_patch_plt_entry (guint8 *code, guint8 *addr)
 /*
  * This method is only called when running in the Mono Debugger.
  */
-guint8 *
-mono_debugger_create_notification_function (MonoCodeManager *codeman)
+gpointer
+mono_debugger_create_notification_function (void)
 {
   guint8 *code;
   unsigned int *buf;
 
-  code = mono_code_manager_reserve (codeman, 16);
+  code = mono_global_codeman_reserve (16);
   buf = (unsigned int *)code;
 
   *buf = 0;