2005-06-04 Zoltan Varga <vargaz@freemail.hu>
authorZoltan Varga <vargaz@gmail.com>
Sat, 4 Jun 2005 11:20:50 +0000 (11:20 -0000)
committerZoltan Varga <vargaz@gmail.com>
Sat, 4 Jun 2005 11:20:50 +0000 (11:20 -0000)
* mini-ia64.c mini-ia64.h: Fix cleanup of memory stack.

svn path=/trunk/mono/; revision=45397

mono/mini/ChangeLog
mono/mini/mini-ia64.c
mono/mini/mini-ia64.h

index 892fb9bcd557f8d753a2bcdbe824fb93ee1bfb88..9c3b17ddeae33ee018532c13f6bf66551d89ecfd 100644 (file)
@@ -1,3 +1,7 @@
+2005-06-04  Zoltan Varga  <vargaz@freemail.hu>
+
+       * mini-ia64.c mini-ia64.h: Fix cleanup of memory stack.
+
 2005-06-03  Zoltan Varga  <vargaz@freemail.hu>
 
        * mini-amd64.c (emit_call): Fix yet another bug in the near call optimization.
index 1110889b8a9eacdd802a8489ed0099392277a579..87f57c44e07a62d3d389c7ab10c01c93c71bee6a 100644 (file)
@@ -2307,7 +2307,7 @@ ia64_patch (unsigned char* code, gpointer target)
 {
        int template, i;
        guint64 instructions [3];
-       guint8 gen_buf [8];
+       guint8 gen_buf [16];
        Ia64CodegenState gen;
 
        template = ia64_bundle_template (code);
@@ -2340,6 +2340,16 @@ ia64_patch (unsigned char* code, gpointer target)
                        continue;
 
                switch (ins_types_in_template [template][i]) {
+               case IA64_INS_TYPE_A:
+               case IA64_INS_TYPE_M:
+                       if ((opcode == 8) && (ia64_ins_x2a (ins) == 2) && (ia64_ins_ve (ins) == 0)) {
+                               /* adds */
+                               ia64_adds_imm_pred (gen, ia64_ins_qp (ins), ia64_ins_r1 (ins), (guint64)target, ia64_ins_r3 (ins));
+                               instructions [i] = gen.instructions [0];
+                       }
+                       else
+                               NOT_IMPLEMENTED;
+                       break;
                case IA64_INS_TYPE_B:
                        if ((opcode == 4) && (ia64_ins_btype (ins) == 0)) {
                                /* br.cond */
@@ -2436,6 +2446,8 @@ mono_arch_emit_prolog (MonoCompile *cfg)
                alloc_size += 16;
        alloc_size = ALIGN_TO (alloc_size, MONO_ARCH_FRAME_ALIGNMENT);
 
+       cfg->arch.stack_alloc_size = alloc_size;
+
        pos = 0;
 
        if (method->save_lmf) {
@@ -2608,7 +2620,7 @@ mono_arch_emit_epilog (MonoCompile *cfg)
        }
        g_free (cinfo);
 
-       if (cfg->stack_offset)
+       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);
index 8dc9e7a0037996faa70fa7277635d4c95d06c8e2..47ee90c89b55f6f30c75778dd2beb61acc3d2ae1 100644 (file)
@@ -57,6 +57,7 @@ typedef struct MonoContext {
 } MonoContext;
 
 typedef struct MonoCompileArch {
+       gint32 stack_alloc_size;
        gint32 lmf_offset;
        gint32 localloc_offset;
        gint32 n_out_regs;
@@ -106,5 +107,4 @@ typedef struct MonoCompileArch {
 #define MONO_ARCH_HAVE_PIC_AOT 1
 #define MONO_ARCH_HAVE_CREATE_TRAMPOLINE_FROM_TOKEN 1
 
-
 #endif /* __MONO_MINI_IA64_H__ */