Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 11 additions & 11 deletions src/mono/mono/mini/mini-codegen.c
Original file line number Diff line number Diff line change
Expand Up @@ -141,12 +141,10 @@ static void
mono_regstate_assign (MonoRegState *rs)
{
#ifdef MONO_ARCH_USE_SHARED_FP_SIMD_BANK
/* The regalloc may fail if fp and simd logical regbanks share the same physical reg bank and
* if the values here are not the same.
*/
g_assert(regbank_callee_regs [MONO_REG_SIMD] == regbank_callee_regs [MONO_REG_DOUBLE]);
/* fp and simd logical banks may share the same physical reg bank with unequal overlapping registers */
g_assert((regbank_callee_regs [MONO_REG_SIMD] & regbank_callee_regs[MONO_REG_DOUBLE]) == regbank_callee_regs [MONO_REG_DOUBLE]);
g_assert(regbank_size [MONO_REG_SIMD] >= regbank_size [MONO_REG_DOUBLE]);
g_assert(regbank_callee_saved_regs [MONO_REG_SIMD] == regbank_callee_saved_regs [MONO_REG_DOUBLE]);
g_assert(regbank_size [MONO_REG_SIMD] == regbank_size [MONO_REG_DOUBLE]);
#endif

if (rs->next_vreg > rs->vassign_size) {
Expand Down Expand Up @@ -221,7 +219,8 @@ mono_regstate_alloc_general (MonoRegState *rs, regmask_t allow, int bank)
if (mirrored_bank == -1)
return i;

rs->free_mask [mirrored_bank] = rs->free_mask [bank];
rs->free_mask [mirrored_bank] = (((MONO_ARCH_CALLEE_FREGS & MONO_ARCH_CALLEE_XREGS) & rs->free_mask [bank])
|((MONO_ARCH_CALLEE_FREGS ^ MONO_ARCH_CALLEE_XREGS) & rs->free_mask [mirrored_bank]));
return i;
}
}
Expand All @@ -240,7 +239,8 @@ mono_regstate_free_general (MonoRegState *rs, int reg, int bank)
mirrored_bank = get_mirrored_bank (bank);
if (mirrored_bank == -1)
return;
rs->free_mask [mirrored_bank] = rs->free_mask [bank];
rs->free_mask [mirrored_bank] = (((MONO_ARCH_CALLEE_FREGS & MONO_ARCH_CALLEE_XREGS) & rs->free_mask [bank])
|((MONO_ARCH_CALLEE_FREGS ^ MONO_ARCH_CALLEE_XREGS) & rs->free_mask [mirrored_bank]));
rs->symbolic [mirrored_bank][reg] = 0;
}
}
Expand Down Expand Up @@ -649,7 +649,7 @@ mono_print_ins_index_strbuf (int i, MonoInst *ins)
g_string_append_printf (sbuf, " [B%d]", ins->inst_true_bb->block_num);
else
g_string_append_printf (sbuf, " [T:B%d F:B%d]", ins->inst_true_bb->block_num,
ins->inst_false_bb->block_num);
ins->inst_false_bb->block_num);
break;
case OP_LIVERANGE_START:
case OP_LIVERANGE_END:
Expand Down Expand Up @@ -1081,8 +1081,8 @@ assign_reg (MonoCompile *cfg, MonoRegState *rs, int reg, int hreg, int bank)
/* Make sure the other logical reg bank that this bank shares
* a single hard reg bank knows that this hard reg is not free.
*/
rs->free_mask [mirrored_bank] = rs->free_mask [bank];

rs->free_mask [mirrored_bank] = (((MONO_ARCH_CALLEE_FREGS & MONO_ARCH_CALLEE_XREGS) & rs->free_mask [bank])
|((MONO_ARCH_CALLEE_FREGS ^ MONO_ARCH_CALLEE_XREGS) & rs->free_mask [mirrored_bank]));
/* Mark the other logical bank that the this bank shares
* a single hard reg bank with as mirrored.
*/
Expand Down Expand Up @@ -1566,7 +1566,7 @@ mono_local_regalloc (MonoCompile *cfg, MonoBasicBlock *bb)
val = rs->vassign [ins->dreg];
if (is_soft_reg (ins->dreg, bank) && (val >= 0) && (!(regmask (val) & dreg_mask))) {
/* DREG is already allocated to a register needed for sreg1 */
spill_vreg (cfg, bb, tmp, ins, ins->dreg, 0);
spill_vreg (cfg, bb, tmp, ins, ins->dreg, 0);
}
}

Expand Down
7 changes: 4 additions & 3 deletions src/mono/mono/mini/mini-s390x.h
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,8 @@ struct SeqPointInfo {
#define MONO_ARCH_HAVE_SETUP_RESUME_FROM_SIGNAL_HANDLER_CTX 1
#define MONO_ARCH_HAVE_UNWIND_BACKTRACE 1
#define MONO_ARCH_FLOAT32_SUPPORTED 1

#define MONO_ARCH_NEED_SIMD_BANK 1
#define MONO_ARCH_USE_SHARED_FP_SIMD_BANK 1
#define S390_STACK_ALIGNMENT 8
#define S390_FIRST_ARG_REG s390_r2
#define S390_LAST_ARG_REG s390_r6
Expand Down Expand Up @@ -147,9 +148,9 @@ struct SeqPointInfo {
/*-----------------------------------------------*/
/* SIMD Related Definitions */
/*-----------------------------------------------*/

/* f0 overlaps with v0 and vr16 is used internally */
#define MONO_MAX_XREGS 31
#define MONO_ARCH_CALLEE_XREGS 0x0
#define MONO_ARCH_CALLEE_XREGS 0xFFFEFFFE
#define MONO_ARCH_CALLEE_SAVED_XREGS 0x0

// Does the ABI have a volatile non-parameter register, so tailcall
Expand Down
Loading