diff options
author | Iain Buclaw <ibuclaw@gdcproject.org> | 2025-01-21 19:41:05 +0100 |
---|---|---|
committer | Iain Buclaw <ibuclaw@gdcproject.org> | 2025-01-21 20:02:07 +0100 |
commit | 79186e392c77c1862197a49421f77644e3b8c05d (patch) | |
tree | dee9cefdf927079b7d2529e39f2c91cd4700a6a0 | |
parent | e324619281239bb513840600436b735dfbd32416 (diff) | |
download | gcc-79186e392c77c1862197a49421f77644e3b8c05d.zip gcc-79186e392c77c1862197a49421f77644e3b8c05d.tar.gz gcc-79186e392c77c1862197a49421f77644e3b8c05d.tar.bz2 |
libphobos: Add MIPS64 implementation of fiber_switchContext [PR118584]
Replaces the generic implementation. The `core.thread.fiber' module
already defines version=AsmExternal on mips64el-linux-gnuabi64.
PR d/118584
libphobos/ChangeLog:
* libdruntime/config/mips/switchcontext.S: Add MIPS64 N64 ABI
implementation of fiber_switchContext.
-rw-r--r-- | libphobos/libdruntime/config/mips/switchcontext.S | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/libphobos/libdruntime/config/mips/switchcontext.S b/libphobos/libdruntime/config/mips/switchcontext.S index d2fed64..078ad0b 100644 --- a/libphobos/libdruntime/config/mips/switchcontext.S +++ b/libphobos/libdruntime/config/mips/switchcontext.S @@ -99,4 +99,82 @@ fiber_switchContext: .end fiber_switchContext .size fiber_switchContext,.-fiber_switchContext +#endif /* _MIPS_SIM == _ABIO32 */ + +#if defined(__mips64) && _MIPS_SIM == _ABI64 +/************************************************************************************ + * MIPS 64 ASM BITS + * $a0 - void** - ptr to old stack pointer + * $a1 - void* - new stack pointer + * + */ + .text + .globl fiber_switchContext + .align 2 + .ent fiber_switchContext,0 +fiber_switchContext: + .cfi_startproc + daddiu $sp, $sp, -(10 * 8) + + // fp regs and return address are stored below the stack + // because we don't want the GC to scan them. + +#ifdef __mips_hard_float +#define BELOW (8 * 8 + 8) + s.d $f24, (0 * 8 - BELOW)($sp) + s.d $f25, (1 * 8 - BELOW)($sp) + s.d $f26, (2 * 8 - BELOW)($sp) + s.d $f27, (3 * 8 - BELOW)($sp) + s.d $f28, (4 * 8 - BELOW)($sp) + s.d $f29, (5 * 8 - BELOW)($sp) + s.d $f30, (6 * 8 - BELOW)($sp) + s.d $f31, (7 * 8 - BELOW)($sp) +#endif + sd $ra, -8($sp) + + sd $s0, (0 * 8)($sp) + sd $s1, (1 * 8)($sp) + sd $s2, (2 * 8)($sp) + sd $s3, (3 * 8)($sp) + sd $s4, (4 * 8)($sp) + sd $s5, (5 * 8)($sp) + sd $s6, (6 * 8)($sp) + sd $s7, (7 * 8)($sp) + sd $gp, (8 * 8)($sp) + sd $fp, (9 * 8)($sp) + + // swap stack pointer + sd $sp, 0($a0) + move $sp, $a1 + +#ifdef __mips_hard_float + l.d $f24, (0 * 8 - BELOW)($sp) + l.d $f25, (1 * 8 - BELOW)($sp) + l.d $f26, (2 * 8 - BELOW)($sp) + l.d $f27, (3 * 8 - BELOW)($sp) + l.d $f28, (4 * 8 - BELOW)($sp) + l.d $f29, (5 * 8 - BELOW)($sp) + l.d $f30, (6 * 8 - BELOW)($sp) + l.d $f31, (7 * 8 - BELOW)($sp) #endif + ld $ra, -8($sp) + + ld $s0, (0 * 8)($sp) + ld $s1, (1 * 8)($sp) + ld $s2, (2 * 8)($sp) + ld $s3, (3 * 8)($sp) + ld $s4, (4 * 8)($sp) + ld $s5, (5 * 8)($sp) + ld $s6, (6 * 8)($sp) + ld $s7, (7 * 8)($sp) + ld $gp, (8 * 8)($sp) + ld $fp, (9 * 8)($sp) + + daddiu $sp, $sp, (10 * 8) + + jr $ra // return + .cfi_endproc + .end fiber_switchContext + .size fiber_switchContext,.-fiber_switchContext + +#endif /* defined(__mips64) && _MIPS_SIM == _ABI64 */ |