2004-09-24 Zoltan Varga <vargaz@freemail.hu>
[mono.git] / mono / mini / mini-s390.c
index b725c200d4bba6e07cb7a9a95498ad3992800f2c..5da1af2e8920bac83bdb89da3557c40cb737e3b7 100644 (file)
@@ -19,7 +19,7 @@
 /*------------------------------------------------------------------*/
 
 #define NOT_IMPLEMENTED(x) \
-        g_error ("FIXME: %s is not yet implemented. (trampoline)", x);
+        g_error ("FIXME: %s is not yet implemented.", x);
 
 #define EMIT_COND_BRANCH(ins,cond)                                                     \
 {                                                                                      \
@@ -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;
@@ -2972,8 +2965,8 @@ emit_float_to_int (MonoCompile *cfg, guchar *code, int dreg, int sreg, int size,
        } else {
                s390_basr   (code, s390_r13, 0);
                s390_j      (code, 10);
-               s390_double (code, 0x41e0000000000000);
-               s390_double (code, 0x41f0000000000000);
+               s390_llong  (code, 0x41e0000000000000);
+               s390_llong  (code, 0x41f0000000000000);
                s390_ldr    (code, s390_f15, sreg);
                s390_cdb    (code, s390_f15, 0, s390_r13, 0);
                s390_jl     (code, 10);
@@ -3068,6 +3061,8 @@ guint8 cond;
                        code = cfg->native_code + offset;
                }
 
+               mono_debug_record_line_number (cfg, ins, offset);
+
                switch (ins->opcode) {
                case OP_STOREI1_MEMBASE_IMM: {
                        s390_lhi (code, s390_r14, ins->inst_imm);
@@ -3363,6 +3358,7 @@ guint8 cond;
                        s390_alcr (code, ins->dreg, ins->sreg2);
                }
                        break;
+               case OP_ADDCC_IMM:
                case OP_ADD_IMM: {
                        if ((ins->next) &&
                            (ins->next->opcode == OP_ADC_IMM)) {
@@ -3465,6 +3461,7 @@ guint8 cond;
                        s390_slbr (code, ins->dreg, ins->sreg2);
                }
                        break;
+               case OP_SUBCC_IMM:
                case OP_SUB_IMM: {
                        if (s390_is_imm16 (-ins->inst_imm)) {
                                if (ins->dreg != ins->sreg1) {
@@ -3870,9 +3867,18 @@ guint8 cond;
                }
                        break;
                case CEE_JMP: {
+                       int fParm;
                        if (cfg->method->save_lmf)
                                code = restoreLMF(cfg, code);
 
+                       if (cfg->flags & MONO_CFG_HAS_TAIL) {
+                               s390_lm (code, s390_r2, s390_r5, STK_BASE, 
+                                        S390_PARM_SAVE_OFFSET);
+                               for (fParm = 0; fParm < 4; fParm++)
+                                       s390_ld (code, fParm, 0, STK_BASE,
+                                          S390_FLOAT_SAVE_OFFSET+fParm*sizeof(double));
+                       }
+
                        code = backUpStackPtr(cfg, code);
                        s390_l   (code, s390_r14, 0, STK_BASE, S390_RET_ADDR_OFFSET);
                        mono_add_patch_info (cfg, code - cfg->native_code,
@@ -3886,6 +3892,14 @@ guint8 cond;
                        s390_icm (code, s390_r0, 15, ins->sreg1, 0);
                }
                        break;
+               case OP_ARGLIST: {
+                       NOT_IMPLEMENTED("OP_ARGLIST");
+                       s390_basr (code, s390_r13, 0);
+                       s390_j    (code, 4);
+                       s390_word (code, cfg->sig_cookie);
+                       s390_mvc  (code, 4, ins->sreg1, 0, s390_r13, 4);
+               }
+                       break;
                case OP_FCALL: {
                        call = (MonoCallInst*)ins;
                        if (ins->flags & MONO_INST_HAS_METHOD)
@@ -4426,16 +4440,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);
@@ -4722,7 +4736,14 @@ mono_arch_emit_prolog (MonoCompile *cfg)
        cfg->code_size   = 256;
        cfg->native_code = code = g_malloc (cfg->code_size);
 
-       s390_stm  (code, s390_r6, s390_r14, STK_BASE, S390_REG_SAVE_OFFSET);
+       if (cfg->flags & MONO_CFG_HAS_TAIL) {
+               s390_stm (code, s390_r2, s390_r14, STK_BASE, S390_PARM_SAVE_OFFSET);
+               for (pos = 0; pos < 4; pos++)
+                       s390_std (code, pos, 0, STK_BASE, 
+                                 S390_FLOAT_SAVE_OFFSET+pos*sizeof(double));
+       } else { 
+               s390_stm  (code, s390_r6, s390_r14, STK_BASE, S390_REG_SAVE_OFFSET);
+        }
 
        if (cfg->flags & MONO_CFG_HAS_ALLOCA) {
                cfg->used_int_regs |= 1 << 11;
@@ -5210,3 +5231,13 @@ mono_arch_regalloc_cost (MonoCompile *cfg, MonoMethodVar *vmv)
 }
 
 /*========================= End of Function ========================*/
+
+MonoInst* mono_arch_get_domain_intrinsic (MonoCompile* cfg)
+{
+       return NULL;
+}
+
+MonoInst* mono_arch_get_thread_intrinsic (MonoCompile* cfg)
+{
+       return NULL;
+}