Skip to content

Commit 344abb8

Browse files
committed
[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.
1 parent 3cabc21 commit 344abb8

File tree

2 files changed

+15
-8
lines changed

2 files changed

+15
-8
lines changed

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

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -144,10 +144,13 @@ mono_regstate_assign (MonoRegState *rs)
144144
/* The regalloc may fail if fp and simd logical regbanks share the same physical reg bank and
145145
* if the values here are not the same.
146146
*/
147+
/* s390x has unequal regbank masks for vector and floats*/
148+
#ifndef TARGET_S390X
147149
g_assert(regbank_callee_regs [MONO_REG_SIMD] == regbank_callee_regs [MONO_REG_DOUBLE]);
148-
g_assert(regbank_callee_saved_regs [MONO_REG_SIMD] == regbank_callee_saved_regs [MONO_REG_DOUBLE]);
149150
g_assert(regbank_size [MONO_REG_SIMD] == regbank_size [MONO_REG_DOUBLE]);
150151
#endif
152+
g_assert(regbank_callee_saved_regs [MONO_REG_SIMD] == regbank_callee_saved_regs [MONO_REG_DOUBLE]);
153+
#endif
151154

152155
if (rs->next_vreg > rs->vassign_size) {
153156
g_free (rs->vassign);
@@ -221,8 +224,9 @@ mono_regstate_alloc_general (MonoRegState *rs, regmask_t allow, int bank)
221224
if (mirrored_bank == -1)
222225
return i;
223226

224-
rs->free_mask [mirrored_bank] = rs->free_mask [bank];
225-
return i;
227+
rs->free_mask [mirrored_bank] = (((MONO_ARCH_CALLEE_FREGS & MONO_ARCH_CALLEE_XREGS) & rs->free_mask [bank])
228+
|((MONO_ARCH_CALLEE_FREGS ^ MONO_ARCH_CALLEE_XREGS) & rs->free_mask [mirrored_bank]));
229+
return i;
226230
}
227231
}
228232
return -1;
@@ -240,7 +244,8 @@ mono_regstate_free_general (MonoRegState *rs, int reg, int bank)
240244
mirrored_bank = get_mirrored_bank (bank);
241245
if (mirrored_bank == -1)
242246
return;
243-
rs->free_mask [mirrored_bank] = rs->free_mask [bank];
247+
rs->free_mask [mirrored_bank] = (((MONO_ARCH_CALLEE_FREGS & MONO_ARCH_CALLEE_XREGS) & rs->free_mask [bank])
248+
|((MONO_ARCH_CALLEE_FREGS ^ MONO_ARCH_CALLEE_XREGS) & rs->free_mask [mirrored_bank]));
244249
rs->symbolic [mirrored_bank][reg] = 0;
245250
}
246251
}
@@ -1081,8 +1086,8 @@ assign_reg (MonoCompile *cfg, MonoRegState *rs, int reg, int hreg, int bank)
10811086
/* Make sure the other logical reg bank that this bank shares
10821087
* a single hard reg bank knows that this hard reg is not free.
10831088
*/
1084-
rs->free_mask [mirrored_bank] = rs->free_mask [bank];
1085-
1089+
rs->free_mask [mirrored_bank] = (((MONO_ARCH_CALLEE_FREGS & MONO_ARCH_CALLEE_XREGS) & rs->free_mask [bank])
1090+
|((MONO_ARCH_CALLEE_FREGS ^ MONO_ARCH_CALLEE_XREGS) & rs->free_mask [mirrored_bank]));
10861091
/* Mark the other logical bank that the this bank shares
10871092
* a single hard reg bank with as mirrored.
10881093
*/

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

Lines changed: 4 additions & 2 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,8 +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
153+
#define MONO_ARCH_CALLEE_XREGS 0xFFFEFFFE
152154
#define MONO_ARCH_CALLEE_XREGS 0x0
153155
#define MONO_ARCH_CALLEE_SAVED_XREGS 0x0
154156

0 commit comments

Comments
 (0)