* sgen-alloc: Use CEE_STIND_I4 for non-MONO_BIG_ARRAYS references to max_length
authorNeale Ferguson <neale@sinenomine.net>
Mon, 26 Mar 2012 16:11:10 +0000 (12:11 -0400)
committerNeale Ferguson <neale@sinenomine.net>
Mon, 26 Mar 2012 16:11:10 +0000 (12:11 -0400)
* cpu-s390x.md, mini-gc.c, mini-s390x.c mini-s390x.h, mono-context.h: Add gc mapping for s390x
* Makefile.am: Don't run bridge tests for s390x

mono/metadata/sgen-alloc.c
mono/mini/cpu-s390x.md
mono/mini/mini-gc.c
mono/mini/mini-s390x.c
mono/mini/mini-s390x.h
mono/tests/Makefile.am
mono/utils/mono-context.h

index ff483eb7d6459980bfb11c9eac6a099b07e13791..200c6eaec90303188622694455cbb4a0bb661c28 100644 (file)
@@ -840,7 +840,11 @@ create_allocator (int atype)
                mono_mb_emit_ldloc (mb, p_var);
                mono_mb_emit_ldflda (mb, G_STRUCT_OFFSET (MonoArray, max_length));
                mono_mb_emit_ldarg (mb, 1);
+#ifdef MONO_BIG_ARRAYS
                mono_mb_emit_byte (mb, CEE_STIND_I);
+#else
+               mono_mb_emit_byte (mb, CEE_STIND_I4);
+#endif
        }
 
        /*
index 4bd0175c6bb6b38db999bedc8f3920c334d3a031..b24a426545a0edd24e4cab2a67a8d6bc449bd291 100644 (file)
@@ -381,3 +381,8 @@ s390_long_add_ovf: dest:i src1:i src2:i len:32
 s390_long_add_ovf_un: dest:i src1:i src2:i len:32
 s390_long_sub_ovf: dest:i src1:i src2:i len:32
 s390_long_sub_ovf_un: dest:i src1:i src2:i len:32
+
+gc_liveness_def: len:0
+gc_liveness_use: len:0
+gc_spill_slot_liveness_def: len:0
+gc_param_slot_liveness_def: len:0
index 43c7cfcd05a447afe9b7245bc5d618283f9dae90..fbb737c23ef09ef497f7ca434ccefb986a8340d9 100644 (file)
@@ -376,6 +376,11 @@ encode_frame_reg (int frame_reg)
                return 0;
        else if (frame_reg == ARMREG_FP)
                return 1;
+#elif defined(TARGET_S390X)
+       if (frame_reg == S390_SP)
+               return 0;
+       else if (frame_reg == S390_FP)
+               return 1;
 #else
        NOT_IMPLEMENTED;
 #endif
@@ -401,6 +406,11 @@ decode_frame_reg (int encoded)
                return ARMREG_SP;
        else if (encoded == 1)
                return ARMREG_FP;
+#elif defined(TARGET_S390X)
+       if (encoded == 0)
+               return S390_SP;
+       else if (encoded == 1)
+               return S390_FP;
 #else
        NOT_IMPLEMENTED;
 #endif
@@ -418,6 +428,8 @@ static int callee_saved_regs [] = { AMD64_RBP, AMD64_RBX, AMD64_R12, AMD64_R13,
 static int callee_saved_regs [] = { X86_EBX, X86_ESI, X86_EDI };
 #elif defined(TARGET_ARM)
 static int callee_saved_regs [] = { ARMREG_V1, ARMREG_V2, ARMREG_V3, ARMREG_V4, ARMREG_V5, ARMREG_V7, ARMREG_FP };
+#elif defined(TARGET_S390X)
+static int callee_saved_regs [] = { s390_r6, s390_r7, s390_r8, s390_r9, s390_r10, s390_r11, s390_r12, s390_r13, s390_r14 };
 #endif
 
 static guint32
@@ -653,6 +665,11 @@ get_frame_pointer (MonoContext *ctx, int frame_reg)
                        return (mgreg_t)MONO_CONTEXT_GET_SP (ctx);
                else if (frame_reg == ARMREG_FP)
                        return (mgreg_t)MONO_CONTEXT_GET_BP (ctx);
+#elif defined(TARGET_S390X)
+               if (frame_reg == S390_SP)
+                       return (mgreg_t)MONO_CONTEXT_GET_SP (ctx);
+               else if (frame_reg == S390_FP)
+                       return (mgreg_t)MONO_CONTEXT_GET_BP (ctx);
 #endif
                g_assert_not_reached ();
                return 0;
@@ -1981,7 +1998,7 @@ compute_frame_size (MonoCompile *cfg)
        /* Compute min/max offsets from the fp */
 
        /* Locals */
-#if defined(TARGET_AMD64) || defined(TARGET_X86) || defined(TARGET_ARM)
+#if defined(TARGET_AMD64) || defined(TARGET_X86) || defined(TARGET_ARM) || defined(TARGET_S390X)
        locals_min_offset = ALIGN_TO (cfg->locals_min_stack_offset, SIZEOF_SLOT);
        locals_max_offset = cfg->locals_max_stack_offset;
 #else
@@ -2033,6 +2050,8 @@ compute_frame_size (MonoCompile *cfg)
        min_offset = MIN (min_offset, - (cfg->arch.sp_fp_offset + cfg->arch.param_area_size));
 #elif defined(TARGET_ARM)
        // FIXME:
+#elif defined(TARGET_s390X)
+       // FIXME:
 #else
        NOT_IMPLEMENTED;
 #endif
index ba7633ea86ef817bd00c370162bb57487b8c8fb1..67fbe4b44a81d677838d440aefe18a5aabf3f47f 100644 (file)
@@ -2180,6 +2180,8 @@ printf("%s %4d cookine %x\n",__FUNCTION__,__LINE__,cfg->sig_cookie);
                curinst++;
        }
 
+       cfg->locals_min_stack_offset = offset;
+
        curinst = cfg->locals_start;
        for (iVar = curinst; iVar < cfg->num_varinfo; ++iVar) {
                inst = cfg->varinfo [iVar];
@@ -2207,6 +2209,8 @@ printf("%s %4d cookine %x\n",__FUNCTION__,__LINE__,cfg->sig_cookie);
                                iVar, inst->inst_offset, size));
        }
 
+       cfg->locals_max_stack_offset = offset;
+
        /*------------------------------------------------------*/
        /* Allow space for the trace method stack area if needed*/
        /*------------------------------------------------------*/
@@ -2478,6 +2482,12 @@ mono_arch_emit_call (MonoCompile *cfg, MonoCallInst *call)
                                                         frmReg, ainfo->offparm);
                                MONO_EMIT_NEW_STORE_MEMBASE (cfg, OP_STORE_MEMBASE_REG,
                                                             ainfo->reg, ainfo->offset, treg);
+
+                               if (cfg->compute_gc_maps) {
+                                       MonoInst *def;
+
+                                       EMIT_NEW_GC_PARAM_SLOT_LIVENESS_DEF (cfg, def, ainfo->offset, t);
+                               }
                        }
                        break;
                }
@@ -2589,6 +2599,12 @@ mono_arch_emit_outarg_vt (MonoCompile *cfg, MonoInst *ins, MonoInst *src)
 
                MONO_EMIT_NEW_MOVE (cfg, srcReg, ainfo->offparm,
                                                         src->dreg, 0, size);
+
+               if (cfg->compute_gc_maps) {
+                       MonoInst *def;
+
+                       EMIT_NEW_GC_PARAM_SLOT_LIVENESS_DEF (cfg, def, ainfo->offset, &ins->klass->byval_arg);
+               }
        }
 }
 
@@ -4871,6 +4887,15 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                case OP_MEMORY_BARRIER: {
                }
                        break;
+               case OP_GC_LIVENESS_DEF:
+               case OP_GC_LIVENESS_USE:
+               case OP_GC_PARAM_SLOT_LIVENESS_DEF:
+                       ins->backend.pc_offset = code - cfg->native_code;
+                       break;
+               case OP_GC_SPILL_SLOT_LIVENESS_DEF:
+                       ins->backend.pc_offset = code - cfg->native_code;
+                       bb->spill_slot_defs = g_slist_prepend_mempool (cfg->mempool, bb->spill_slot_defs, ins);
+                       break;
                default:
                        g_warning ("unknown opcode %s in %s()\n", mono_inst_name (ins->opcode), __FUNCTION__);
                        g_assert_not_reached ();
index b0c1d46ab2afd3b7153f74f57ae25fedbe1cfad8..930ef14de7e8d2ac617a8ea736e248c374f02bf2 100644 (file)
@@ -123,6 +123,7 @@ typedef struct
 #define MONO_ARCH_SOFT_DEBUG_SUPPORTED                 1
 #define MONO_ARCH_HAVE_CONTEXT_SET_INT_REG             1
 #define MONO_ARCH_USE_SIGACTION                        1
+#define MONO_ARCH_GC_MAPS_SUPPORTED                    1
 
 #define S390_STACK_ALIGNMENT            8
 #define S390_FIRST_ARG_REG             s390_r2
index a72f337e8bd5c6f5c47e75a34ea604cd44c040a4..97ef3f5ff8a7c0817947fba206315a88328af372 100644 (file)
@@ -607,7 +607,7 @@ if ARM
 test-sgen : sgen-tests
 else
 if S390x
-test-sgen : sgen-tests
+test-sgen : sgen-regular-tests
 endif
 endif
 endif
index d449564910191746063b7e011d99a36f67755f68..2c9e0941bb930e77d7a9c49ede3f449af8d4def9 100644 (file)
@@ -436,8 +436,8 @@ typedef struct ucontext MonoContext;
        } while (0) 
 
 #define MONO_CONTEXT_GET_IP(ctx) (gpointer) (ctx)->uc_mcontext.psw.addr
-#define MONO_CONTEXT_GET_BP(ctx) MONO_CONTEXT_GET_SP((ctx))
 #define MONO_CONTEXT_GET_SP(ctx) ((gpointer)((ctx)->uc_mcontext.gregs[15]))
+#define MONO_CONTEXT_GET_BP(ctx) ((gpointer)((ctx)->uc_mcontext.gregs[11]))
 
 #define MONO_CONTEXT_GET_CURRENT(ctx)  \
        __asm__ __volatile__(   \