Fix move instruction to handle large offsets
authorNeale Ferguson <neale@mono-cvs.ximian.com>
Thu, 29 Jul 2004 00:32:20 +0000 (00:32 -0000)
committerNeale Ferguson <neale@mono-cvs.ximian.com>
Thu, 29 Jul 2004 00:32:20 +0000 (00:32 -0000)
svn path=/trunk/mono/; revision=31592

mono/mini/mini-s390.c
mono/mini/mini-s390.h

index b49314315b4d2cfa1f1d0201a9df71548ea68581..06d176a02ffbfcf67abf5fe0b6f3648fb4ea9168 100644 (file)
@@ -616,8 +616,6 @@ enum_parmtype:
 /*                                                                 */
 /*------------------------------------------------------------------*/
 
-static int methodCount = 0;
-
 static void
 enter_method (MonoMethod *method, RegParm *rParm, char *sp)
 {
@@ -633,18 +631,13 @@ enter_method (MonoMethod *method, RegParm *rParm, char *sp)
        size_data sz;
        void *curParm;
 
-methodCount++;
-if (methodCount > 150000) {
-methodCount = 0;
-rewind(stdout);
-}
        fname = mono_method_full_name (method, TRUE);
        indent (1);
        printf ("ENTER: %s(", fname);
        g_free (fname);
 
        ip  = (*(guint32 *) (sp+S390_RET_ADDR_OFFSET)) & 0x7fffffff;
-       printf (") ip: %p sp: %p\n", ip, sp); 
+       printf (") ip: %p sp: %p - ", ip, sp); 
 
        if (rParm == NULL)
                return;
@@ -4428,16 +4421,16 @@ guint8 cond;
                                                s390_word (code, ins->inst_offset);
                                                s390_a    (code, s390_r0, 0, s390_r13, 4);
                                        }
-                                       s390_lr   (code, s390_r1, ins->sreg2);
+                                       s390_lr   (code, s390_r12, ins->sreg1);
                                        if (s390_is_imm16 (ins->inst_imm)) {
-                                               s390_ahi  (code, s390_r1, ins->inst_imm);
+                                               s390_ahi  (code, s390_r12, ins->inst_imm);
                                        } else {
                                                s390_basr (code, s390_r13, 0);
                                                s390_j    (code, 4);
                                                        s390_word (code, ins->inst_imm);
-                                               s390_a    (code, s390_r1, 0, s390_r13, 4);
+                                               s390_a    (code, s390_r12, 0, s390_r13, 4);
                                        }
-                                       s390_lr   (code, s390_r12, ins->sreg1);
+                                       s390_lr   (code, s390_r1, ins->sreg1);
                                        s390_lr   (code, s390_r13, s390_r1);
                                        s390_mvcle(code, s390_r0, s390_r12, 0, 0);
                                        s390_jo   (code, -2);
index 9c208b40ea4f8386785e0a309dcec1fa4f9f1d74..8a400e0299fa6e3e84446080c0db3b7642c9c3f6 100644 (file)
 #define MONO_EMIT_NEW_MOVE(cfg,dest,offset,src,imm,size) do {                  \
                 MonoInst *inst;                                                \
                int tmpr = 0;                                                   \
+               int sReg, dReg;                                                 \
                                                                                \
                inst = mono_mempool_alloc0 ((cfg)->mempool, sizeof (MonoInst)); \
                if (size > 256) {                                               \
                        tmpr = mono_regstate_next_int (cfg->rs);                \
                        MONO_EMIT_NEW_ICONST(cfg,tmpr,size);                    \
+                       inst->dreg        = dest;                               \
+                       inst->inst_offset = offset;                             \
+                       inst->sreg1       = src;                                \
+                       inst->inst_imm    = imm;                                \
+                       inst->sreg2       = tmpr;                               \
+               } else {                                                        \
+                       if (s390_is_uimm12(offset)) {                           \
+                               inst->dreg        = dest;                       \
+                               inst->inst_offset = offset;                     \
+                       } else {                                                \
+                               dReg = mono_regstate_next_int (cfg->rs);        \
+                               MONO_EMIT_NEW_BIALU_IMM(cfg, OP_ADD_IMM,        \
+                                       dReg, dest, offset);                    \
+                               inst->dreg        = dReg;                       \
+                               inst->inst_offset = 0;                          \
+                       }                                                       \
+                       if (s390_is_uimm12(imm)) {                              \
+                               inst->sreg1       = src;                        \
+                               inst->inst_imm    = imm;                        \
+                       } else {                                                \
+                               sReg = mono_regstate_next_int (cfg->rs);        \
+                               MONO_EMIT_NEW_BIALU_IMM(cfg, OP_ADD_IMM,        \
+                                       sReg, src, imm);                        \
+                               inst->sreg1       = sReg;                       \
+                               inst->inst_imm    = 0;                          \
+                       }                                                       \
                }                                                               \
                 inst->opcode     = OP_S390_MOVE;                               \
-                inst->dreg       = dest;                                       \
-                inst->inst_offset = offset;                                    \
-                inst->inst_imm   = imm;                                        \
-               inst->sreg1       = src;                                        \
-               inst->sreg2       = tmpr;                                       \
                inst->unused      = size;                                       \
                mono_bblock_add_inst (cfg->cbb, inst);                          \
        } while (0)