Merge pull request #1150 from ludovic-henry/pr17c-delegate-trampoline
[mono.git] / mono / mini / mini-ia64.c
index 87c474f2e474275b7f36e8f2e7be14e6833da3ed..7d74ad8f45f34aead1f502d2d46f48a2d6006a8d 100644 (file)
@@ -21,6 +21,7 @@
 #include <mono/metadata/threads.h>
 #include <mono/metadata/profiler-private.h>
 #include <mono/utils/mono-math.h>
+#include <mono/utils/mono-hwcap-ia64.h>
 
 #include "trace.h"
 #include "mini-ia64.h"
@@ -109,33 +110,11 @@ mono_arch_fregname (int reg)
                return "unknown";
 }
 
-G_GNUC_UNUSED static void
-break_count (void)
-{
-}
-
-G_GNUC_UNUSED static gboolean
-debug_count (void)
-{
-       static int count = 0;
-       count ++;
-
-       if (count == atoi (getenv ("COUNT"))) {
-               break_count ();
-       }
-
-       if (count > atoi (getenv ("COUNT"))) {
-               return FALSE;
-       }
-
-       return TRUE;
-}
-
 static gboolean
 debug_ins_sched (void)
 {
 #if 0
-       return debug_count ();
+       return mono_debug_count ();
 #else
        return TRUE;
 #endif
@@ -145,7 +124,7 @@ static gboolean
 debug_omit_fp (void)
 {
 #if 0
-       return debug_count ();
+       return mono_debug_count ();
 #else
        return TRUE;
 #endif
@@ -575,7 +554,7 @@ get_call_info (MonoCompile *cfg, MonoMemPool *mp, MonoMethodSignature *sig, gboo
  * Returns the size of the argument area on the stack.
  */
 int
-mono_arch_get_argument_info (MonoMethodSignature *csig, int param_count, MonoJitArgumentInfo *arg_info)
+mono_arch_get_argument_info (MonoGenericSharingContext *gsctx, MonoMethodSignature *csig, int param_count, MonoJitArgumentInfo *arg_info)
 {
        int k;
        CallInfo *cinfo = get_call_info (NULL, NULL, csig, FALSE);
@@ -1508,10 +1487,10 @@ mono_arch_lowering_pass (MonoCompile *cfg, MonoBasicBlock *bb)
                case OP_LOADR8_MEMBASE:
                case OP_ATOMIC_EXCHANGE_I4:
                case OP_ATOMIC_EXCHANGE_I8:
-               case OP_ATOMIC_ADD_NEW_I4:
-               case OP_ATOMIC_ADD_NEW_I8:
-               case OP_ATOMIC_ADD_IMM_NEW_I4:
-               case OP_ATOMIC_ADD_IMM_NEW_I8:
+               case OP_ATOMIC_ADD_I4:
+               case OP_ATOMIC_ADD_I8:
+               case OP_ATOMIC_ADD_IMM_I4:
+               case OP_ATOMIC_ADD_IMM_I8:
                        /* There are no membase instructions on ia64 */
                        if (ins->inst_offset == 0) {
                                break;
@@ -2955,12 +2934,12 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                case OP_MEMORY_BARRIER:
                        ia64_mf (code);
                        break;
-               case OP_ATOMIC_ADD_IMM_NEW_I4:
+               case OP_ATOMIC_ADD_IMM_I4:
                        g_assert (ins->inst_offset == 0);
                        ia64_fetchadd4_acq_hint (code, ins->dreg, ins->inst_basereg, ins->inst_imm, 0);
                        ia64_adds_imm (code, ins->dreg, ins->inst_imm, ins->dreg);
                        break;
-               case OP_ATOMIC_ADD_IMM_NEW_I8:
+               case OP_ATOMIC_ADD_IMM_I8:
                        g_assert (ins->inst_offset == 0);
                        ia64_fetchadd8_acq_hint (code, ins->dreg, ins->inst_basereg, ins->inst_imm, 0);
                        ia64_adds_imm (code, ins->dreg, ins->inst_imm, ins->dreg);
@@ -2972,7 +2951,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                case OP_ATOMIC_EXCHANGE_I8:
                        ia64_xchg8_hint (code, ins->dreg, ins->inst_basereg, ins->sreg2, 0);
                        break;
-               case OP_ATOMIC_ADD_NEW_I4: {
+               case OP_ATOMIC_ADD_I4: {
                        guint8 *label, *buf;
 
                        /* From libatomic_ops */
@@ -2992,7 +2971,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        ia64_add (code, ins->dreg, GP_SCRATCH_REG, ins->sreg2);
                        break;
                }
-               case OP_ATOMIC_ADD_NEW_I8: {
+               case OP_ATOMIC_ADD_I8: {
                        guint8 *label, *buf;
 
                        /* From libatomic_ops */
@@ -4547,8 +4526,6 @@ mono_arch_free_jit_tls_data (MonoJitTlsData *tls)
 {
 }
 
-#ifdef MONO_ARCH_HAVE_IMT
-
 /*
  * LOCKING: called with the domain lock held
  */
@@ -4659,7 +4636,6 @@ mono_arch_emit_imt_argument (MonoCompile *cfg, MonoCallInst *call, MonoInst *imt
 {
        /* Done by the implementation of the CALL_MEMBASE opcodes */
 }
-#endif
 
 gpointer
 mono_arch_get_this_arg_from_call (mgreg_t *regs, guint8 *code)
@@ -4690,9 +4666,9 @@ mono_arch_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMetho
                        guint32 opcode;
 
                        if (fsig->params [0]->type == MONO_TYPE_I4)
-                               opcode = OP_ATOMIC_ADD_IMM_NEW_I4;
+                               opcode = OP_ATOMIC_ADD_IMM_I4;
                        else if (fsig->params [0]->type == MONO_TYPE_I8)
-                               opcode = OP_ATOMIC_ADD_IMM_NEW_I8;
+                               opcode = OP_ATOMIC_ADD_IMM_I8;
                        else
                                g_assert_not_reached ();
                        MONO_INST_NEW (cfg, ins, opcode);
@@ -4705,9 +4681,9 @@ mono_arch_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMetho
                        guint32 opcode;
 
                        if (fsig->params [0]->type == MONO_TYPE_I4)
-                               opcode = OP_ATOMIC_ADD_IMM_NEW_I4;
+                               opcode = OP_ATOMIC_ADD_IMM_I4;
                        else if (fsig->params [0]->type == MONO_TYPE_I8)
-                               opcode = OP_ATOMIC_ADD_IMM_NEW_I8;
+                               opcode = OP_ATOMIC_ADD_IMM_I8;
                        else
                                g_assert_not_reached ();
                        MONO_INST_NEW (cfg, ins, opcode);
@@ -4729,9 +4705,9 @@ mono_arch_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMetho
 
                        if (is_imm) {
                                if (fsig->params [0]->type == MONO_TYPE_I4)
-                                       opcode = OP_ATOMIC_ADD_IMM_NEW_I4;
+                                       opcode = OP_ATOMIC_ADD_IMM_I4;
                                else if (fsig->params [0]->type == MONO_TYPE_I8)
-                                       opcode = OP_ATOMIC_ADD_IMM_NEW_I8;
+                                       opcode = OP_ATOMIC_ADD_IMM_I8;
                                else
                                        g_assert_not_reached ();
 
@@ -4740,12 +4716,12 @@ mono_arch_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMetho
                                ins->inst_basereg = args [0]->dreg;
                                ins->inst_offset = 0;
                                ins->inst_imm = imm;
-                               ins->type = (opcode == OP_ATOMIC_ADD_IMM_NEW_I4) ? STACK_I4 : STACK_I8;
+                               ins->type = (opcode == OP_ATOMIC_ADD_IMM_I4) ? STACK_I4 : STACK_I8;
                        } else {
                                if (fsig->params [0]->type == MONO_TYPE_I4)
-                                       opcode = OP_ATOMIC_ADD_NEW_I4;
+                                       opcode = OP_ATOMIC_ADD_I4;
                                else if (fsig->params [0]->type == MONO_TYPE_I8)
-                                       opcode = OP_ATOMIC_ADD_NEW_I8;
+                                       opcode = OP_ATOMIC_ADD_I8;
                                else
                                        g_assert_not_reached ();
 
@@ -4754,7 +4730,7 @@ mono_arch_emit_inst_for_method (MonoCompile *cfg, MonoMethod *cmethod, MonoMetho
                                ins->inst_basereg = args [0]->dreg;
                                ins->inst_offset = 0;
                                ins->sreg2 = args [1]->dreg;
-                               ins->type = (opcode == OP_ATOMIC_ADD_NEW_I4) ? STACK_I4 : STACK_I8;
+                               ins->type = (opcode == OP_ATOMIC_ADD_I4) ? STACK_I4 : STACK_I8;
                        }
                        MONO_ADD_INS (cfg->cbb, ins);
                }
@@ -4769,15 +4745,23 @@ mono_arch_print_tree (MonoInst *tree, int arity)
        return 0;
 }
 
-MonoInst*
-mono_arch_get_domain_intrinsic (MonoCompile* cfg)
-{
-       return mono_get_domain_intrinsic (cfg);
-}
-
 mgreg_t
 mono_arch_context_get_int_reg (MonoContext *ctx, int reg)
 {
        /* FIXME: implement */
        g_assert_not_reached ();
 }
+
+gboolean
+mono_arch_opcode_supported (int opcode)
+{
+       switch (opcode) {
+       case OP_ATOMIC_ADD_I4:
+       case OP_ATOMIC_ADD_I8:
+       case OP_ATOMIC_EXCHANGE_I4:
+       case OP_ATOMIC_EXCHANGE_I8:
+               return TRUE;
+       default:
+               return FALSE;
+       }
+}