aboutsummaryrefslogtreecommitdiff
path: root/libphobos/libdruntime
diff options
context:
space:
mode:
authorIain Buclaw <ibuclaw@gdcproject.org>2021-04-21 01:15:33 +0200
committerIain Buclaw <ibuclaw@gdcproject.org>2021-04-21 02:27:49 +0200
commitea7b1cf534a7a653e1221bcd9004c2d0f5418e88 (patch)
tree825ff7ba151cace25c260779968411505fa62a0e /libphobos/libdruntime
parentbe8aad8d73f47e2581c873ba1069489e071c2a86 (diff)
downloadgcc-ea7b1cf534a7a653e1221bcd9004c2d0f5418e88.zip
gcc-ea7b1cf534a7a653e1221bcd9004c2d0f5418e88.tar.gz
gcc-ea7b1cf534a7a653e1221bcd9004c2d0f5418e88.tar.bz2
libphobos: Fix build fails for powerpc-linux
As register names are required for darwin, but not accepted by gas unless you use `-mregnames', they have been conditionally removed on non-darwin targets. To avoid duplicating large blocks of almost identical code, the inline assembly is now statically generated. libphobos/ChangeLog: * libdruntime/core/thread/osthread.d (callWithStackShell): Statically generate PPC and PPC64 asm implementations, and conditionally remove PPC register names on non-Darwin targets.
Diffstat (limited to 'libphobos/libdruntime')
-rw-r--r--libphobos/libdruntime/core/thread/osthread.d68
1 files changed, 24 insertions, 44 deletions
diff --git a/libphobos/libdruntime/core/thread/osthread.d b/libphobos/libdruntime/core/thread/osthread.d
index 31764e6..9fcd30e 100644
--- a/libphobos/libdruntime/core/thread/osthread.d
+++ b/libphobos/libdruntime/core/thread/osthread.d
@@ -1444,55 +1444,35 @@ in (fn)
else version (PPC)
{
void*[19] regs = void;
- asm pure nothrow @nogc
- {
- "stw r13, %0" : "=m" (regs[ 0]);
- "stw r14, %0" : "=m" (regs[ 1]);
- "stw r15, %0" : "=m" (regs[ 2]);
- "stw r16, %0" : "=m" (regs[ 3]);
- "stw r17, %0" : "=m" (regs[ 4]);
- "stw r18, %0" : "=m" (regs[ 5]);
- "stw r19, %0" : "=m" (regs[ 6]);
- "stw r20, %0" : "=m" (regs[ 7]);
- "stw r21, %0" : "=m" (regs[ 9]);
- "stw r22, %0" : "=m" (regs[ 9]);
- "stw r23, %0" : "=m" (regs[10]);
- "stw r24, %0" : "=m" (regs[11]);
- "stw r25, %0" : "=m" (regs[12]);
- "stw r26, %0" : "=m" (regs[13]);
- "stw r27, %0" : "=m" (regs[14]);
- "stw r28, %0" : "=m" (regs[15]);
- "stw r29, %0" : "=m" (regs[16]);
- "stw r30, %0" : "=m" (regs[17]);
- "stw r31, %0" : "=m" (regs[18]);
- }
+ version (Darwin)
+ enum regname = "r";
+ else
+ enum regname = "";
+ static foreach (i; 0 .. regs.length)
+ {{
+ enum int j = 13 + i; // source register
+ asm pure nothrow @nogc
+ {
+ "stw "~regname~j.stringof~", %0" : "=m" (regs[i]);
+ }
+ }}
sp = cast(void*)&regs[0];
}
else version (PPC64)
{
void*[19] regs = void;
- asm pure nothrow @nogc
- {
- "std r13, %0" : "=m" (regs[ 0]);
- "std r14, %0" : "=m" (regs[ 1]);
- "std r15, %0" : "=m" (regs[ 2]);
- "std r16, %0" : "=m" (regs[ 3]);
- "std r17, %0" : "=m" (regs[ 4]);
- "std r18, %0" : "=m" (regs[ 5]);
- "std r19, %0" : "=m" (regs[ 6]);
- "std r20, %0" : "=m" (regs[ 7]);
- "std r21, %0" : "=m" (regs[ 8]);
- "std r22, %0" : "=m" (regs[ 9]);
- "std r23, %0" : "=m" (regs[10]);
- "std r24, %0" : "=m" (regs[11]);
- "std r25, %0" : "=m" (regs[12]);
- "std r26, %0" : "=m" (regs[13]);
- "std r27, %0" : "=m" (regs[14]);
- "std r28, %0" : "=m" (regs[15]);
- "std r29, %0" : "=m" (regs[16]);
- "std r30, %0" : "=m" (regs[17]);
- "std r31, %0" : "=m" (regs[18]);
- }
+ version (Darwin)
+ enum regname = "r";
+ else
+ enum regname = "";
+ static foreach (i; 0 .. regs.length)
+ {{
+ enum int j = 13 + i; // source register
+ asm pure nothrow @nogc
+ {
+ "std "~regname~j.stringof~", %0" : "=m" (regs[i]);
+ }
+ }}
sp = cast(void*)&regs[0];
}
else