diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2020-09-10 15:56:27 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-09-10 15:56:27 -0400 |
| commit | 2315331d23d1cfe38f431ec5b81e52101e01dfd7 (patch) | |
| tree | 7ce52b1c1034cb4ad145721218f69bc699410a59 /lib/std/special | |
| parent | ea9b38c93c38e402c807b20802eb003bcc4ddc5b (diff) | |
| parent | 51fcf949f97d068e917c0c3301ba63a4a305ab6e (diff) | |
| download | zig-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.zig | 55 |
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."), } } |
