Merge pull request #1659 from alexanderkyte/stringbuilder-referencesource
[mono.git] / mono / mini / mini-s390x.c
index d84c87860d1f95b652405201c0823ed719a62097..004540fb7e2bc7bbf8790e10411aee7e0a852a2d 100644 (file)
@@ -2926,24 +2926,20 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
        guint offset;
        guint8 *code = cfg->native_code + cfg->code_len;
        guint last_offset = 0;
-       int max_len, cpos, src2;
+       int max_len, src2;
 
        /* we don't align basic blocks of loops on s390 */
 
        if (cfg->verbose_level > 2)
                g_print ("Basic block %d starting at offset 0x%x\n", bb->block_num, bb->native_offset);
 
-       cpos = bb->max_offset;
-
-       if (cfg->prof_options & MONO_PROFILE_COVERAGE) {
-               //MonoCoverageInfo *cov = mono_get_coverage_info (cfg->method);
-               //g_assert (!mono_compile_aot);
-               //cpos += 6;
-               //if (bb->cil_code)
-               //      cov->data [bb->dfn].iloffset = bb->cil_code - cfg->cil_code;
-               /* this is not thread save, but good enough */
-               /* fixme: howto handle overflows? */
-               //x86_inc_mem (code, &cov->data [bb->dfn].count); 
+       if ((cfg->prof_options & MONO_PROFILE_COVERAGE) && cfg->coverage_info) {
+               MonoProfileCoverageInfo *cov = cfg->coverage_info;
+               g_assert (!mono_compile_aot);
+               cov->data [bb->dfn].cil_code = bb->cil_code;
+               /* This is not thread save, but good enough */
+               S390_SET (code, s390_r1, &cov->data [bb->dfn].count);
+               s390_alsi (code, 0, s390_r1, 1);
        }
 
        MONO_BB_FOR_EACH_INS (bb, ins) {
@@ -3827,20 +3823,30 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        EMIT_COND_SYSTEM_EXCEPTION (S390_CC_LT, "OverflowException");
                        s390_lgfr (code, ins->dreg, ins->sreg1);
                        break;
-               case OP_FMOVE: {
+               case OP_FMOVE:
                        if (ins->dreg != ins->sreg1) {
                                s390_ldr   (code, ins->dreg, ins->sreg1);
                        }
-               }
                        break;
-               case OP_FCONV_TO_R4: {
+               case OP_MOVE_F_TO_I8: 
+                       s390_lgdr (code, ins->dreg, ins->sreg1);
+                       break;
+               case OP_MOVE_I8_TO_F: 
+                       s390_ldgr (code, ins->dreg, ins->sreg1);
+                       break;
+               case OP_MOVE_F_TO_I4:
+                       s390_lgdr (code, ins->dreg, ins->sreg1);
+                       break;
+               case OP_MOVE_I4_TO_F: 
+                       s390_lgfr (code, s390_r0, ins->sreg1);
+                       s390_ldgr (code, ins->dreg, s390_r0);
+                       break;
+               case OP_FCONV_TO_R4:
                        s390_ledbr (code, ins->dreg, ins->sreg1);
                        s390_ldebr (code, ins->dreg, ins->dreg);
-               }
                        break;
-               case OP_S390_SETF4RET: {
+               case OP_S390_SETF4RET:
                        s390_ledbr (code, ins->dreg, ins->sreg1);
-               }
                        break;
                case OP_TLS_GET: {
                        if (s390_is_imm16 (ins->inst_offset)) {
@@ -4072,6 +4078,9 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                case OP_NOT_NULL: {
                }
                        break;
+               case OP_IL_SEQ_POINT:
+                       mono_add_seq_point (cfg, bb, ins, code - cfg->native_code);
+                       break;
                case OP_SEQ_POINT: {
                        int i;
 
@@ -4577,8 +4586,8 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        }
                }
                        break;  
-               case OP_MEMORY_BARRIER: {
-               }
+               case OP_MEMORY_BARRIER:
+                       s390_mem (code);
                        break;
                case OP_GC_LIVENESS_DEF:
                case OP_GC_LIVENESS_USE:
@@ -4600,8 +4609,6 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        g_assert_not_reached ();
                }
               
-               cpos += max_len;
-
                last_offset = offset;
        }
 
@@ -5635,6 +5642,8 @@ get_delegate_invoke_impl (gboolean has_target, guint32 param_count, guint32 *cod
                mono_arch_flush_icache (start, size);
        }
 
+       mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_DELEGATE_INVOKE, NULL);
+
        if (code_len)
                *code_len = code - start;
 
@@ -5909,8 +5918,9 @@ mono_arch_build_imt_thunk (MonoVTable *vtable, MonoDomain *domain,
        }
 
        mono_arch_flush_icache ((guint8*)start, (code - start));
+       mono_profiler_code_buffer_new (start, code - start, MONO_PROFILER_CODE_BUFFER_IMT_TRAMPOLINE, NULL);
 
-       if (!fail_tramp)
+       if (!fail_tramp) 
                mono_stats.imt_thunks_size += (code - start);
 
        g_assert (code - start <= size);