Move the helper signatures along with their init function to method-to-ir.c.
[mono.git] / mono / mini / mini-ia64.c
index e2a92592d7b06d386bfc0a26a840c6a743e0616e..8bf2379b942a7f707c6c3458953f78543e8b7abd 100644 (file)
@@ -401,7 +401,7 @@ get_call_info (MonoCompile *cfg, MonoMemPool *mp, MonoMethodSignature *sig, gboo
                        cinfo->ret.reg = 8;
                        break;
                case MONO_TYPE_GENERICINST:
-                       if (!mono_type_generic_inst_is_valuetype (sig->ret)) {
+                       if (!mono_type_generic_inst_is_valuetype (ret_type)) {
                                cinfo->ret.storage = ArgInIReg;
                                cinfo->ret.reg = IA64_R8;
                                break;
@@ -432,6 +432,13 @@ get_call_info (MonoCompile *cfg, MonoMemPool *mp, MonoMethodSignature *sig, gboo
                }
        }
 
+       /*
+        * IA64 has MONO_ARCH_THIS_AS_FIRST_ARG defined, but we don't need to really pass
+        * this as first, because this is stored in a non-stacked register by the calling
+        * sequence.
+        * FIXME: mono_arch_get_unbox_trampoline () depends on this.
+        */
+
        /* this */
        if (sig->hasthis)
                add_general (&gr, &stack_size, cinfo->args + 0);
@@ -494,7 +501,7 @@ get_call_info (MonoCompile *cfg, MonoMemPool *mp, MonoMethodSignature *sig, gboo
                        add_general (&gr, &stack_size, ainfo);
                        break;
                case MONO_TYPE_GENERICINST:
-                       if (!mono_type_generic_inst_is_valuetype (sig->params [i])) {
+                       if (!mono_type_generic_inst_is_valuetype (ptype)) {
                                add_general (&gr, &stack_size, ainfo);
                                break;
                        }
@@ -612,7 +619,7 @@ mono_arch_get_allocatable_int_vars (MonoCompile *cfg)
        MonoMethodHeader *header;
        CallInfo *cinfo;
 
-       header = mono_method_get_header (cfg->method);
+       header = cfg->header;
 
        sig = mono_method_signature (cfg->method);
 
@@ -670,7 +677,7 @@ mono_ia64_alloc_stacked_registers (MonoCompile *cfg)
 
        cinfo = get_call_info (cfg, cfg->mempool, mono_method_signature (cfg->method), FALSE);
 
-       header = mono_method_get_header (cfg->method);
+       header = cfg->header;
        
        /* Some registers are reserved for use by the prolog/epilog */
        reserved_regs = header->num_clauses ? 4 : 3;
@@ -756,7 +763,7 @@ mono_arch_allocate_vars (MonoCompile *cfg)
        gint32 *offsets;
        CallInfo *cinfo;
 
-       header = mono_method_get_header (cfg->method);
+       header = cfg->header;
 
        sig = mono_method_signature (cfg->method);
 
@@ -2686,7 +2693,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                /* Calls */
                case OP_CHECK_THIS:
                        /* ensure ins->sreg1 is not NULL */
-                       ia64_ld8 (code, GP_SCRATCH_REG, ins->sreg1);
+                       /* Can't use ld8 as this could be a vtype address */
+                       ia64_ld1 (code, GP_SCRATCH_REG, ins->sreg1);
                        break;
                case OP_ARGLIST:
                        ia64_adds_imm (code, GP_SCRATCH_REG, cfg->sig_cookie, cfg->frame_reg);
@@ -2719,7 +2727,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        int out_reg;
 
                        /* 
-                        * mono_arch_find_this_arg () needs to find the this argument in a global 
+                        * mono_arch_get_this_arg_from_call () needs to find the this argument in a global 
                         * register.
                         */
                        cinfo = get_call_info (cfg, cfg->mempool, call->signature, FALSE);
@@ -2748,12 +2756,6 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        CallInfo *cinfo;
                        int out_reg;
 
-                       /* 
-                        * There are no membase instructions on ia64, but we can't 
-                        * lower this since get_vcall_slot_addr () needs to decode it.
-                        */
-
-                       /* Keep this in synch with get_vcall_slot_addr */
                        ia64_mov (code, IA64_R11, ins->sreg1);
                        if (ia64_is_imm14 (ins->inst_offset))
                                ia64_adds_imm (code, IA64_R8, ins->inst_offset, ins->sreg1);
@@ -2781,23 +2783,12 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                                out_reg ++;
                        ia64_mov (code, IA64_R10, out_reg);
 
-                       ia64_begin_bundle (code);
-                       ia64_codegen_set_one_ins_per_bundle (code, TRUE);
-
                        ia64_ld8 (code, GP_SCRATCH_REG, IA64_R8);
 
                        ia64_mov_to_br (code, IA64_B6, GP_SCRATCH_REG);
 
-                       /*
-                        * This nop will tell get_vcall_slot_addr that this is a virtual 
-                        * call.
-                        */
-                       ia64_nop_i (code, 0x12345);
-
                        ia64_br_call_reg (code, IA64_B0, IA64_B6);
 
-                       ia64_codegen_set_one_ins_per_bundle (code, FALSE);
-
                        code = emit_move_return_value (cfg, ins, code);
                        break;
                }
@@ -3007,6 +2998,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        ia64_movl (code, GP_SCRATCH_REG2, 0);
                        ia64_mov_to_br (code, IA64_B6, GP_SCRATCH_REG2);
                        ia64_br_cond_reg (code, IA64_B6);
+                       // FIXME:
+                       //mono_cfg_add_try_hole (cfg, ins->inst_eh_block, code, bb);
                        ia64_codegen_set_one_ins_per_bundle (code, FALSE);
                        break;
                case OP_START_HANDLER: {
@@ -3809,7 +3802,7 @@ mono_arch_emit_prolog (MonoCompile *cfg)
 
        cinfo = get_call_info (cfg, cfg->mempool, sig, FALSE);
 
-       cfg->code_size =  MAX (((MonoMethodNormal *)method)->header->code_size * 4, 512);
+       cfg->code_size =  MAX (cfg->header->code_size * 4, 512);
 
        if (mono_jit_trace_calls != NULL && mono_trace_eval (method))
                cfg->code_size += 1024;
@@ -4505,64 +4498,6 @@ mono_arch_get_patch_offset (guint8 *code)
        return 0;
 }
 
-gpointer
-mono_arch_get_vcall_slot (guint8* code, mgreg_t *regs, int *displacement)
-{
-       guint8 *bundle2 = code - 48;
-       guint8 *bundle3 = code - 32;
-       guint8 *bundle4 = code - 16;
-       guint64 ins21 = ia64_bundle_ins1 (bundle2);
-       guint64 ins22 = ia64_bundle_ins2 (bundle2);
-       guint64 ins23 = ia64_bundle_ins3 (bundle2);
-       guint64 ins31 = ia64_bundle_ins1 (bundle3);
-       guint64 ins32 = ia64_bundle_ins2 (bundle3);
-       guint64 ins33 = ia64_bundle_ins3 (bundle3);
-       guint64 ins41 = ia64_bundle_ins1 (bundle4);
-       guint64 ins42 = ia64_bundle_ins2 (bundle4);
-       guint64 ins43 = ia64_bundle_ins3 (bundle4);
-
-       /* 
-        * Virtual calls are made with:
-        *
-        * [MII]       ld8 r31=[r8]
-        *             nop.i 0x0
-        *             nop.i 0x0;;
-        * [MII]       nop.m 0x0
-        *             mov.sptk b6=r31,0x2000000000f32a80
-        *             nop.i 0x0
-        * [MII]       nop.m 0x0
-        *             nop.i 0x123456
-        *             nop.i 0x0
-        * [MIB]       nop.m 0x0
-        *             nop.i 0x0
-        *             br.call.sptk.few b0=b6;;
-        */
-
-       if (((ia64_bundle_template (bundle3) == IA64_TEMPLATE_MII) ||
-                (ia64_bundle_template (bundle3) == IA64_TEMPLATE_MIIS)) &&
-               (ia64_bundle_template (bundle4) == IA64_TEMPLATE_MIBS) &&
-               (ins31 == IA64_NOP_M) && 
-               (ia64_ins_opcode (ins32) == 0) && (ia64_ins_x3 (ins32) == 0) && (ia64_ins_x6 (ins32) == 0x1) && (ia64_ins_y (ins32) == 0) &&
-               (ins33 == IA64_NOP_I) &&
-               (ins41 == IA64_NOP_M) &&
-               (ins42 == IA64_NOP_I) &&
-               (ia64_ins_opcode (ins43) == 1) && (ia64_ins_b1 (ins43) == 0) && (ia64_ins_b2 (ins43) == 6) &&
-               ((ins32 >> 6) & 0xfffff) == 0x12345) {
-               g_assert (ins21 == IA64_NOP_M);
-               g_assert (ins23 == IA64_NOP_I);
-               g_assert (ia64_ins_opcode (ins22) == 0);
-               g_assert (ia64_ins_x3 (ins22) == 7);
-               g_assert (ia64_ins_x (ins22) == 0);
-               g_assert (ia64_ins_b1 (ins22) == IA64_B6);
-
-               *displacement = (gssize)regs [IA64_R8] - (gssize)regs [IA64_R11];
-
-               return (gpointer)regs [IA64_R11];
-       }
-
-       return NULL;
-}
-
 gpointer*
 mono_arch_get_delegate_method_ptr_addr (guint8* code, mgreg_t *regs)
 {
@@ -4616,15 +4551,19 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain, MonoIMTCheckI
                                item->jmp_code = (guint8*)code.buf + code.nins;
                                ia64_br_cond_pred (code, 7, 0);
 
-                               ia64_movl (code, GP_SCRATCH_REG, &(vtable->vtable [item->value.vtable_slot]));
-                               ia64_ld8 (code, GP_SCRATCH_REG, GP_SCRATCH_REG);
+                               if (item->has_target_code) {
+                                       ia64_movl (code, GP_SCRATCH_REG, item->value.target_code);
+                               } else {
+                                       ia64_movl (code, GP_SCRATCH_REG, &(vtable->vtable [item->value.vtable_slot]));
+                                       ia64_ld8 (code, GP_SCRATCH_REG, GP_SCRATCH_REG);
+                               }
                                ia64_mov_to_br (code, IA64_B6, GP_SCRATCH_REG);
                                ia64_br_cond_reg (code, IA64_B6);
 
                                if (fail_case) {
+                                       ia64_begin_bundle (code);
                                        ia64_patch (item->jmp_code, (guint8*)code.buf + code.nins);
                                        ia64_movl (code, GP_SCRATCH_REG, fail_tramp);
-                                       ia64_ld8 (code, GP_SCRATCH_REG, GP_SCRATCH_REG);
                                        ia64_mov_to_br (code, IA64_B6, GP_SCRATCH_REG);
                                        ia64_br_cond_reg (code, IA64_B6);
                                        item->jmp_code = NULL;
@@ -4692,17 +4631,11 @@ mono_arch_emit_imt_argument (MonoCompile *cfg, MonoCallInst *call, MonoInst *imt
 #endif
 
 gpointer
-mono_arch_get_this_arg_from_call (MonoGenericSharingContext *gsctx, MonoMethodSignature *sig, mgreg_t *regs, guint8 *code)
+mono_arch_get_this_arg_from_call (mgreg_t *regs, guint8 *code)
 {
        return (gpointer)regs [IA64_R10];
 }
 
-MonoObject*
-mono_arch_find_this_argument (mgreg_t *regs, MonoMethod *method, MonoGenericSharingContext *gsctx)
-{
-       return mono_arch_get_this_arg_from_call (gsctx, mono_method_signature (method), regs, NULL);
-}
-
 gpointer
 mono_arch_get_delegate_invoke_impl (MonoMethodSignature *sig, gboolean has_target)
 {
@@ -4811,12 +4744,6 @@ mono_arch_get_domain_intrinsic (MonoCompile* cfg)
        return mono_get_domain_intrinsic (cfg);
 }
 
-MonoInst*
-mono_arch_get_thread_intrinsic (MonoCompile* cfg)
-{
-       return mono_get_thread_intrinsic (cfg);
-}
-
 gpointer
 mono_arch_context_get_int_reg (MonoContext *ctx, int reg)
 {