> On 21/04/2021 00:02 Peter Bergner <berg...@linux.ibm.com> wrote: > > > On 4/20/21 4:20 PM, Jakub Jelinek via Gcc wrote: > > On Tue, Apr 20, 2021 at 03:27:08PM -0500, William Seurer via Gcc wrote: > >> /tmp/cc8zG8DV.s: Assembler messages: > >> /tmp/cc8zG8DV.s:2566: Error: unsupported relocation against r13 > >> /tmp/cc8zG8DV.s:2570: Error: unsupported relocation against r14 > [snip] > > So do we need to change > > + else version (PPC) > > > > > > + { > > > > > > + void*[19] regs = void; > > > > > > + asm pure nothrow @nogc > > > > > > + { > > > > > > + "stw r13, %0" : "=m" (regs[ 0]); > > > > > > + "stw r14, %0" : "=m" (regs[ 1]); > > > > > > ... > > + else version (PPC64) > > > > > > + { > > > > > > + void*[19] regs = void; > > > > > > + asm pure nothrow @nogc > > > > > > + { > > > > > > + "std r13, %0" : "=m" (regs[ 0]); > > > > > > + "std r14, %0" : "=m" (regs[ 1]); > > > > > > ... > > to "stw 13, %0" and "std 13, %0" etc. unconditionally, or > > to "stw %%r13, %0" etc. under some conditions? > > Yes, I think so. The "r13", etc. names are not accepted by gas unless you > use the -mregnames option. It's easier to just remove the 'r'. >
OK, unless told otherwise, I'll keep them in for darwin though. --- 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*)®s[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*)®s[0]; } else