Skip to content

[mono][1/2] Add SIMD Support for s390x #116669

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
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
17 changes: 11 additions & 6 deletions src/mono/mono/mini/mini-codegen.c
Original file line number Diff line number Diff line change
Expand Up @@ -144,10 +144,13 @@ mono_regstate_assign (MonoRegState *rs)
/* 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.
*/
/* s390x has unequal regbank masks for vector and floats*/
#ifndef TARGET_S390X
g_assert(regbank_callee_regs [MONO_REG_SIMD] == regbank_callee_regs [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
g_assert(regbank_callee_saved_regs [MONO_REG_SIMD] == regbank_callee_saved_regs [MONO_REG_DOUBLE]);
#endif

if (rs->next_vreg > rs->vassign_size) {
g_free (rs->vassign);
Expand Down Expand Up @@ -221,8 +224,9 @@ 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];
return i;
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;
}
}
return -1;
Expand All @@ -240,7 +244,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 @@ -1081,8 +1086,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
6 changes: 4 additions & 2 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,8 +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 0xFFFEFFFE
#define MONO_ARCH_CALLEE_XREGS 0x0
#define MONO_ARCH_CALLEE_SAVED_XREGS 0x0

Expand Down
Loading