Author: zoltan
Date: 2005-06-22 18:22:44 -0400 (Wed, 22 Jun 2005)
New Revision: 46402

Modified:
   trunk/mono/mono/mini/ChangeLog
   trunk/mono/mono/mini/inssel-long.brg
   trunk/mono/mono/mini/mini-ia64.c
Log:
2005-06-22  Zoltan Varga  <[EMAIL PROTECTED]>

        * inssel-long.brg: Use OP_LSHR_UN_IMM instead of OP_SHR_UN_IMM in
        u4->i8 conversion.

        * mini-ia64.c: Ongoing IA64 work.


Modified: trunk/mono/mono/mini/ChangeLog
===================================================================
--- trunk/mono/mono/mini/ChangeLog      2005-06-22 22:00:43 UTC (rev 46401)
+++ trunk/mono/mono/mini/ChangeLog      2005-06-22 22:22:44 UTC (rev 46402)
@@ -1,3 +1,10 @@
+2005-06-22  Zoltan Varga  <[EMAIL PROTECTED]>
+
+       * inssel-long.brg: Use OP_LSHR_UN_IMM instead of OP_SHR_UN_IMM in
+       u4->i8 conversion.
+
+       * mini-ia64.c: Ongoing IA64 work.
+
 2005-06-19  Zoltan Varga  <[EMAIL PROTECTED]>
 
        * mini-ia64.c: Ongoing IA64 work.

Modified: trunk/mono/mono/mini/inssel-long.brg
===================================================================
--- trunk/mono/mono/mini/inssel-long.brg        2005-06-22 22:00:43 UTC (rev 
46401)
+++ trunk/mono/mono/mini/inssel-long.brg        2005-06-22 22:22:44 UTC (rev 
46402)
@@ -340,7 +340,7 @@
 reg: CEE_CONV_OVF_U8_UN (reg) {
        /* an unsigned 32 bit num always fits in an (un)signed 64 bit one */
        /* Clean out the upper word */
-       MONO_EMIT_BIALU_IMM (s, tree, OP_SHR_UN_IMM, state->reg1, 
state->left->reg1, 0);
+       MONO_EMIT_BIALU_IMM (s, tree, OP_LSHR_UN_IMM, state->reg1, 
state->left->reg1, 0);
 }
 
 reg: CEE_CONV_OVF_U8 (reg) {

Modified: trunk/mono/mono/mini/mini-ia64.c
===================================================================
--- trunk/mono/mono/mini/mini-ia64.c    2005-06-22 22:00:43 UTC (rev 46401)
+++ trunk/mono/mono/mini/mini-ia64.c    2005-06-22 22:22:44 UTC (rev 46402)
@@ -1669,7 +1669,97 @@
        mono_local_regalloc (cfg, bb);
 }
 
+/*
+ * emit_load_volatile_arguments:
+ *
+ *  Load volatile arguments from the stack to the original input registers.
+ * Required before a tail call.
+ */
 static Ia64CodegenState
+emit_load_volatile_arguments (MonoCompile *cfg, Ia64CodegenState code)
+{
+       MonoMethod *method = cfg->method;
+       MonoMethodSignature *sig;
+       MonoInst *ins;
+       CallInfo *cinfo;
+       guint32 i;
+
+       /* FIXME: Generate intermediate code instead */
+
+       sig = mono_method_signature (method);
+
+       cinfo = get_call_info (sig, FALSE);
+       
+       /* This is the opposite of the code in emit_prolog */
+       for (i = 0; i < sig->param_count + sig->hasthis; ++i) {
+               ArgInfo *ainfo = cinfo->args + i;
+               gint32 stack_offset;
+               MonoType *arg_type;
+               ins = cfg->varinfo [i];
+
+               if (sig->hasthis && (i == 0))
+                       arg_type = &mono_defaults.object_class->byval_arg;
+               else
+                       arg_type = sig->params [i - sig->hasthis];
+
+               arg_type = mono_type_get_underlying_type (arg_type);
+
+               stack_offset = ainfo->offset + ARGS_OFFSET;
+
+               /* Save volatile arguments to the stack */
+               if (ins->opcode != OP_REGVAR) {
+                       switch (ainfo->storage) {
+                       case ArgInIReg:
+                       case ArgInFloatReg:
+                               /* FIXME: big offsets */
+                               g_assert (ins->opcode == OP_REGOFFSET);
+                               ia64_adds_imm (code, GP_SCRATCH_REG, 
ins->inst_offset, ins->inst_basereg);
+                               if (arg_type->byref)
+                                       ia64_ld8 (code, cfg->arch.reg_in0 + 
ainfo->reg, GP_SCRATCH_REG);
+                               else {
+                                       switch (arg_type->type) {
+                                       case MONO_TYPE_R4:
+                                               ia64_ldfs (code, ainfo->reg, 
GP_SCRATCH_REG);
+                                               break;
+                                       case MONO_TYPE_R8:
+                                               ia64_ldfd (code, ainfo->reg, 
GP_SCRATCH_REG);
+                                               break;
+                                       default:
+                                               ia64_ld8 (code, 
cfg->arch.reg_in0 + ainfo->reg, GP_SCRATCH_REG);
+                                               break;
+                                       }
+                               }
+                               break;
+                       case ArgOnStack:
+                               break;
+                       default:
+                               NOT_IMPLEMENTED;
+                       }
+               }
+
+               if (ins->opcode == OP_REGVAR) {
+                       /* Argument allocated to (non-volatile) register */
+                       switch (ainfo->storage) {
+                       case ArgInIReg:
+                               if (ins->dreg != cfg->arch.reg_in0 + ainfo->reg)
+                                       ia64_mov (code, cfg->arch.reg_in0 + 
ainfo->reg, ins->dreg);
+                               break;
+                       case ArgOnStack:
+                               ia64_adds_imm (code, GP_SCRATCH_REG, 16 + 
ainfo->offset, cfg->frame_reg);
+                               ia64_st8 (code, GP_SCRATCH_REG, ins->dreg);
+                               break;
+                       default:
+                               NOT_IMPLEMENTED;
+                       }
+               }
+       }
+
+       g_free (cinfo);
+
+       return code;
+}
+
+static Ia64CodegenState
 emit_move_return_value (MonoCompile *cfg, MonoInst *ins, Ia64CodegenState code)
 {
        CallInfo *cinfo;
@@ -2301,6 +2391,12 @@
                        ia64_fcvt_xf (code, ins->dreg, ins->dreg);
                        ia64_fnorm_d_sf (code, ins->dreg, ins->dreg, 0);
                        break;
+               case OP_LCONV_TO_R4:
+                       /* FIXME: Difference with CEE_CONV_R4 ? */
+                       ia64_setf_sig (code, ins->dreg, ins->sreg1);
+                       ia64_fcvt_xf (code, ins->dreg, ins->dreg);
+                       ia64_fnorm_s_sf (code, ins->dreg, ins->dreg, 0);
+                       break;
                case OP_FCONV_TO_R4:
                        ia64_fnorm_s_sf (code, ins->dreg, ins->sreg1, 0);
                        break;
@@ -2394,7 +2490,32 @@
 
                        code = emit_move_return_value (cfg, ins, code);
                        break;
+               case CEE_JMP: {
+                       /*
+                        * Keep in sync with the code in emit_epilog.
+                        */
 
+                       if (cfg->prof_options & MONO_PROFILE_ENTER_LEAVE)
+                               NOT_IMPLEMENTED;
+
+                       g_assert (!cfg->method->save_lmf);
+
+                       /* Load arguments into their original registers */
+                       code = emit_load_volatile_arguments (cfg, code);
+
+                       if (cfg->arch.stack_alloc_size)
+                               ia64_mov (code, IA64_SP, 
cfg->arch.reg_saved_sp);
+                       ia64_mov_to_ar_i (code, IA64_PFS, 
cfg->arch.reg_saved_ar_pfs);
+                       ia64_mov_ret_to_br (code, IA64_B0, 
cfg->arch.reg_saved_b0);
+
+                       mono_add_patch_info (cfg, code.buf - cfg->native_code, 
MONO_PATCH_INFO_METHOD_JUMP, ins->inst_p0);
+                       ia64_movl (code, GP_SCRATCH_REG, 0);
+                       ia64_mov_to_br (code, IA64_B6, GP_SCRATCH_REG);
+                       ia64_br_cond_reg (code, IA64_B6);
+
+                       break;
+               }
+
                case OP_LOCALLOC:
                        /* keep alignment */
                        ia64_adds_imm (code, GP_SCRATCH_REG, 
MONO_ARCH_FRAME_ALIGNMENT - 1, ins->sreg1);
@@ -2807,6 +2928,10 @@
                alloc_size += 16;
        alloc_size = ALIGN_TO (alloc_size, MONO_ARCH_FRAME_ALIGNMENT);
 
+       if (cfg->flags & MONO_CFG_HAS_ALLOCA)
+               /* Force sp to be saved/restored */
+               alloc_size += MONO_ARCH_FRAME_ALIGNMENT;
+
        cfg->arch.stack_alloc_size = alloc_size;
 
        pos = 0;

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to