Skip to content

Commit 7a14c76

Browse files
[mono][1/2] Add SIMD Support for s390x (#116669)
* [1/2] Support SIMD on s390x This is the inital patch to support simd on s390x. on s390x we have 16 floating point registers and 32 vector registers out of which f0 - f15 overlap with v0 - v15. redefine the mirrored_mask logic for unequal masks in the register allocator. * Address Review comments * generalize assert statements for the unequal masks * remove duplicate line * Fix spaces in mini-codegen.c We're using tabs for indentation. --------- Co-authored-by: Alexander Köplinger <alex.koeplinger@outlook.com>
1 parent a3f500f commit 7a14c76

File tree

2 files changed

+15
-14
lines changed

2 files changed

+15
-14
lines changed

src/mono/mono/mini/mini-codegen.c

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -141,12 +141,10 @@ static void
141141
mono_regstate_assign (MonoRegState *rs)
142142
{
143143
#ifdef MONO_ARCH_USE_SHARED_FP_SIMD_BANK
144-
/* The regalloc may fail if fp and simd logical regbanks share the same physical reg bank and
145-
* if the values here are not the same.
146-
*/
147-
g_assert(regbank_callee_regs [MONO_REG_SIMD] == regbank_callee_regs [MONO_REG_DOUBLE]);
144+
/* fp and simd logical banks may share the same physical reg bank with unequal overlapping registers */
145+
g_assert((regbank_callee_regs [MONO_REG_SIMD] & regbank_callee_regs[MONO_REG_DOUBLE]) == regbank_callee_regs [MONO_REG_DOUBLE]);
146+
g_assert(regbank_size [MONO_REG_SIMD] >= regbank_size [MONO_REG_DOUBLE]);
148147
g_assert(regbank_callee_saved_regs [MONO_REG_SIMD] == regbank_callee_saved_regs [MONO_REG_DOUBLE]);
149-
g_assert(regbank_size [MONO_REG_SIMD] == regbank_size [MONO_REG_DOUBLE]);
150148
#endif
151149

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

224-
rs->free_mask [mirrored_bank] = rs->free_mask [bank];
222+
rs->free_mask [mirrored_bank] = (((MONO_ARCH_CALLEE_FREGS & MONO_ARCH_CALLEE_XREGS) & rs->free_mask [bank])
223+
|((MONO_ARCH_CALLEE_FREGS ^ MONO_ARCH_CALLEE_XREGS) & rs->free_mask [mirrored_bank]));
225224
return i;
226225
}
227226
}
@@ -240,7 +239,8 @@ mono_regstate_free_general (MonoRegState *rs, int reg, int bank)
240239
mirrored_bank = get_mirrored_bank (bank);
241240
if (mirrored_bank == -1)
242241
return;
243-
rs->free_mask [mirrored_bank] = rs->free_mask [bank];
242+
rs->free_mask [mirrored_bank] = (((MONO_ARCH_CALLEE_FREGS & MONO_ARCH_CALLEE_XREGS) & rs->free_mask [bank])
243+
|((MONO_ARCH_CALLEE_FREGS ^ MONO_ARCH_CALLEE_XREGS) & rs->free_mask [mirrored_bank]));
244244
rs->symbolic [mirrored_bank][reg] = 0;
245245
}
246246
}
@@ -649,7 +649,7 @@ mono_print_ins_index_strbuf (int i, MonoInst *ins)
649649
g_string_append_printf (sbuf, " [B%d]", ins->inst_true_bb->block_num);
650650
else
651651
g_string_append_printf (sbuf, " [T:B%d F:B%d]", ins->inst_true_bb->block_num,
652-
ins->inst_false_bb->block_num);
652+
ins->inst_false_bb->block_num);
653653
break;
654654
case OP_LIVERANGE_START:
655655
case OP_LIVERANGE_END:
@@ -1081,8 +1081,8 @@ assign_reg (MonoCompile *cfg, MonoRegState *rs, int reg, int hreg, int bank)
10811081
/* Make sure the other logical reg bank that this bank shares
10821082
* a single hard reg bank knows that this hard reg is not free.
10831083
*/
1084-
rs->free_mask [mirrored_bank] = rs->free_mask [bank];
1085-
1084+
rs->free_mask [mirrored_bank] = (((MONO_ARCH_CALLEE_FREGS & MONO_ARCH_CALLEE_XREGS) & rs->free_mask [bank])
1085+
|((MONO_ARCH_CALLEE_FREGS ^ MONO_ARCH_CALLEE_XREGS) & rs->free_mask [mirrored_bank]));
10861086
/* Mark the other logical bank that the this bank shares
10871087
* a single hard reg bank with as mirrored.
10881088
*/
@@ -1566,7 +1566,7 @@ mono_local_regalloc (MonoCompile *cfg, MonoBasicBlock *bb)
15661566
val = rs->vassign [ins->dreg];
15671567
if (is_soft_reg (ins->dreg, bank) && (val >= 0) && (!(regmask (val) & dreg_mask))) {
15681568
/* DREG is already allocated to a register needed for sreg1 */
1569-
spill_vreg (cfg, bb, tmp, ins, ins->dreg, 0);
1569+
spill_vreg (cfg, bb, tmp, ins, ins->dreg, 0);
15701570
}
15711571
}
15721572

src/mono/mono/mini/mini-s390x.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,8 @@ struct SeqPointInfo {
8383
#define MONO_ARCH_HAVE_SETUP_RESUME_FROM_SIGNAL_HANDLER_CTX 1
8484
#define MONO_ARCH_HAVE_UNWIND_BACKTRACE 1
8585
#define MONO_ARCH_FLOAT32_SUPPORTED 1
86-
86+
#define MONO_ARCH_NEED_SIMD_BANK 1
87+
#define MONO_ARCH_USE_SHARED_FP_SIMD_BANK 1
8788
#define S390_STACK_ALIGNMENT 8
8889
#define S390_FIRST_ARG_REG s390_r2
8990
#define S390_LAST_ARG_REG s390_r6
@@ -147,9 +148,9 @@ struct SeqPointInfo {
147148
/*-----------------------------------------------*/
148149
/* SIMD Related Definitions */
149150
/*-----------------------------------------------*/
150-
151+
/* f0 overlaps with v0 and vr16 is used internally */
151152
#define MONO_MAX_XREGS 31
152-
#define MONO_ARCH_CALLEE_XREGS 0x0
153+
#define MONO_ARCH_CALLEE_XREGS 0xFFFEFFFE
153154
#define MONO_ARCH_CALLEE_SAVED_XREGS 0x0
154155

155156
// Does the ABI have a volatile non-parameter register, so tailcall

0 commit comments

Comments
 (0)