aboutsummaryrefslogtreecommitdiff
path: root/lib/std/special
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2020-09-10 15:56:27 -0400
committerGitHub <noreply@github.com>2020-09-10 15:56:27 -0400
commit2315331d23d1cfe38f431ec5b81e52101e01dfd7 (patch)
tree7ce52b1c1034cb4ad145721218f69bc699410a59 /lib/std/special
parentea9b38c93c38e402c807b20802eb003bcc4ddc5b (diff)
parent51fcf949f97d068e917c0c3301ba63a4a305ab6e (diff)
downloadzig-2315331d23d1cfe38f431ec5b81e52101e01dfd7.tar.gz
zig-2315331d23d1cfe38f431ec5b81e52101e01dfd7.zip
Merge pull request #5527 from shawnanastasio/ppc64le
Implement support for powerpc64{,le}
Diffstat (limited to 'lib/std/special')
-rw-r--r--lib/std/special/c.zig55
1 files changed, 55 insertions, 0 deletions
diff --git a/lib/std/special/c.zig b/lib/std/special/c.zig
index ce8d1c29cc..53f7e1738d 100644
--- a/lib/std/special/c.zig
+++ b/lib/std/special/c.zig
@@ -394,6 +394,61 @@ fn clone() callconv(.Naked) void {
\\ syscall
);
},
+
+ .powerpc64, .powerpc64le => {
+ asm volatile (
+ \\ # store non-volatile regs r30, r31 on stack in order to put our
+ \\ # start func and its arg there
+ \\ stwu 30, -16(1)
+ \\ stw 31, 4(1)
+ \\ # save r3 (func) into r30, and r6(arg) into r31
+ \\ mr 30, 3
+ \\ mr 31, 6
+ \\ # create initial stack frame for new thread
+ \\ clrrwi 4, 4, 4
+ \\ li 0, 0
+ \\ stwu 0, -16(4)
+ \\ #move c into first arg
+ \\ mr 3, 5
+ \\ mr 5, 7
+ \\ mr 6, 8
+ \\ mr 7, 9
+ \\ # move syscall number into r0
+ \\ li 0, 120
+ \\ sc
+
+ \\ # check for syscall error
+ \\ bns+ 1f # jump to label 1 if no summary overflow.
+ \\ #else
+ \\ neg 3, 3 #negate the result (errno)
+ \\1:
+ \\ # compare sc result with 0
+ \\ cmpwi cr7, 3, 0
+
+ \\ # if not 0, jump to end
+ \\ bne cr7, 2f
+
+ \\ #else: we're the child
+ \\ #call funcptr: move arg (d) into r3
+ \\ mr 3, 31
+ \\ #move r30 (funcptr) into CTR reg
+ \\ mtctr 30
+ \\ # call CTR reg
+ \\ bctrl
+ \\ # mov SYS_exit into r0 (the exit param is already in r3)
+ \\ li 0, 1
+ \\ sc
+
+ \\2:
+ \\ # restore stack
+ \\ lwz 30, 0(1)
+ \\ lwz 31, 4(1)
+ \\ addi 1, 1, 16
+
+ \\ blr
+ );
+ },
+
else => @compileError("Implement clone() for this arch."),
}
}