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) {
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)) {
}
}
break;
- case OP_MEMORY_BARRIER: {
- }
+ case OP_MEMORY_BARRIER:
+ s390_mem (code);
break;
case OP_GC_LIVENESS_DEF:
case OP_GC_LIVENESS_USE:
g_assert_not_reached ();
}
- cpos += max_len;
-
last_offset = offset;
}
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;
}
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);