2007-10-10 Mark Probst <mark.probst@gmail.com>
[mono.git] / mono / mini / mini-amd64.c
index 6e6f5116fa5c40eda2bbf594bc6765b4112f670d..8381c2fa1a18ac0bfdf039cb16e021bd914b5a1c 100644 (file)
@@ -191,6 +191,12 @@ amd64_patch (unsigned char* code, gpointer target)
                x86_patch (code, (unsigned char*)target);
 }
 
+void 
+mono_amd64_patch (unsigned char* code, gpointer target)
+{
+       amd64_patch (code, target);
+}
+
 typedef enum {
        ArgInIReg,
        ArgInFloatSSEReg,
@@ -492,7 +498,7 @@ add_valuetype (MonoMethodSignature *sig, ArgInfo *ainfo, MonoType *type,
  * Draft Version 0.23" document for more information.
  */
 static CallInfo*
-get_call_info (MonoMemPool *mp, MonoMethodSignature *sig, gboolean is_pinvoke)
+get_call_info (MonoCompile *cfg, MonoMemPool *mp, MonoMethodSignature *sig, gboolean is_pinvoke)
 {
        guint32 i, gr, fr;
        MonoType *ret_type;
@@ -511,6 +517,7 @@ get_call_info (MonoMemPool *mp, MonoMethodSignature *sig, gboolean is_pinvoke)
        /* return value */
        {
                ret_type = mono_type_get_underlying_type (sig->ret);
+               ret_type = mini_get_basic_type_from_generic (cfg, ret_type);
                switch (ret_type->type) {
                case MONO_TYPE_BOOLEAN:
                case MONO_TYPE_I1:
@@ -607,6 +614,7 @@ get_call_info (MonoMemPool *mp, MonoMethodSignature *sig, gboolean is_pinvoke)
                        continue;
                }
                ptype = mono_type_get_underlying_type (sig->params [i]);
+               ptype = mini_get_basic_type_from_generic (cfg, ptype);
                switch (ptype->type) {
                case MONO_TYPE_BOOLEAN:
                case MONO_TYPE_I1:
@@ -696,7 +704,7 @@ int
 mono_arch_get_argument_info (MonoMethodSignature *csig, int param_count, MonoJitArgumentInfo *arg_info)
 {
        int k;
-       CallInfo *cinfo = get_call_info (NULL, csig, FALSE);
+       CallInfo *cinfo = get_call_info (NULL, NULL, csig, FALSE);
        guint32 args_size = cinfo->stack_usage;
 
        /* The arguments are saved to a stack area in mono_arch_instrument_prolog */
@@ -831,7 +839,7 @@ mono_arch_compute_omit_fp (MonoCompile *cfg)
 {
        MonoMethodSignature *sig;
        MonoMethodHeader *header;
-       int i;
+       int i, locals_size;
        CallInfo *cinfo;
 
        if (cfg->arch.omit_fp_computed)
@@ -842,7 +850,7 @@ mono_arch_compute_omit_fp (MonoCompile *cfg)
        sig = mono_method_signature (cfg->method);
 
        if (!cfg->arch.cinfo)
-               cfg->arch.cinfo = get_call_info (cfg->mempool, sig, FALSE);
+               cfg->arch.cinfo = get_call_info (cfg, cfg->mempool, sig, FALSE);
        cinfo = cfg->arch.cinfo;
 
        /*
@@ -885,7 +893,15 @@ mono_arch_compute_omit_fp (MonoCompile *cfg)
                }
        }
 
-       if (cfg->num_varinfo > 10000) {
+       locals_size = 0;
+       for (i = cfg->locals_start; i < cfg->num_varinfo; i++) {
+               MonoInst *ins = cfg->varinfo [i];
+               int ialign;
+
+               locals_size += mono_type_size (ins->inst_vtype, &ialign);
+       }
+
+       if ((cfg->num_varinfo > 10000) || (locals_size >= (1 << 15))) {
                /* Avoid hitting the stack_alloc_size < (1 << 16) assertion in emit_epilog () */
                cfg->arch.omit_fp = FALSE;
        }
@@ -1126,7 +1142,7 @@ mono_arch_create_vars (MonoCompile *cfg)
        sig = mono_method_signature (cfg->method);
 
        if (!cfg->arch.cinfo)
-               cfg->arch.cinfo = get_call_info (cfg->mempool, sig, FALSE);
+               cfg->arch.cinfo = get_call_info (cfg, cfg->mempool, sig, FALSE);
        cinfo = cfg->arch.cinfo;
 
        if (cinfo->ret.storage == ArgValuetypeInReg)
@@ -1236,7 +1252,7 @@ mono_arch_call_opcode (MonoCompile *cfg, MonoBasicBlock* bb, MonoCallInst *call,
        sig = call->signature;
        n = sig->param_count + sig->hasthis;
 
-       cinfo = get_call_info (cfg->mempool, sig, sig->pinvoke);
+       cinfo = get_call_info (cfg, cfg->mempool, sig, sig->pinvoke);
 
        for (i = 0; i < n; ++i) {
                ainfo = cinfo->args + i;
@@ -2373,7 +2389,7 @@ emit_move_return_value (MonoCompile *cfg, MonoInst *ins, guint8 *code)
        case OP_VCALL:
        case OP_VCALL_REG:
        case OP_VCALL_MEMBASE:
-               cinfo = get_call_info (cfg->mempool, ((MonoCallInst*)ins)->signature, FALSE);
+               cinfo = get_call_info (cfg, cfg->mempool, ((MonoCallInst*)ins)->signature, FALSE);
                if (cinfo->ret.storage == ArgValuetypeInReg) {
                        /* Pop the destination address from the stack */
                        amd64_alu_reg_imm (code, X86_ADD, AMD64_RSP, 8);
@@ -4325,7 +4341,7 @@ mono_arch_emit_prolog (MonoCompile *cfg)
        CallInfo *cinfo;
        gint32 lmf_offset = cfg->arch.lmf_offset;
 
-       cfg->code_size =  MAX (((MonoMethodNormal *)method)->header->code_size * 4, 512);
+       cfg->code_size =  MAX (((MonoMethodNormal *)method)->header->code_size * 4, 1024);
 
        if (cfg->prof_options & MONO_PROFILE_ENTER_LEAVE)
                cfg->code_size += 512;
@@ -4962,7 +4978,7 @@ mono_arch_instrument_prolog (MonoCompile *cfg, void *func, void *p, gboolean ena
                /* Allocate a new area on the stack and save arguments there */
                sig = mono_method_signature (cfg->method);
 
-               cinfo = get_call_info (cfg->mempool, sig, FALSE);
+               cinfo = get_call_info (cfg, cfg->mempool, sig, FALSE);
 
                n = sig->param_count + sig->hasthis;
 
@@ -5412,7 +5428,7 @@ void
 mono_arch_emit_this_vret_args (MonoCompile *cfg, MonoCallInst *inst, int this_reg, int this_type, int vt_reg)
 {
        MonoCallInst *call = (MonoCallInst*)inst;
-       CallInfo * cinfo = get_call_info (cfg->mempool, inst->signature, FALSE);
+       CallInfo * cinfo = get_call_info (cfg, cfg->mempool, inst->signature, FALSE);
 
        if (vt_reg != -1) {
                MonoInst *vtarg;