authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-11-20 17:40:17-08:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2020-11-20 17:40:17-08:00
logbf0cc32aa64002299361a30c5e4b701e99da5dea
tree3f91cea946e06c9be54d471beed9127064ecf80a
parent8cf319d2064c6ef4d2bd9757104561014224a731
parent2193bbfd938ef562abdf1c9f1aced9acb24009bd
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #7165 from LemonBoy/ppc64final

Make the PPC64 port usable

5 files changed, 81 insertions(+), 49 deletions(-)

lib/std/os/linux.zig+2
...@@ -1098,6 +1098,8 @@ pub fn lstat(pathname: [*:0]const u8, statbuf: *kernel_stat) usize {...@@ -1098,6 +1098,8 @@ pub fn lstat(pathname: [*:0]const u8, statbuf: *kernel_stat) usize {
1098pub fn fstatat(dirfd: i32, path: [*:0]const u8, stat_buf: *kernel_stat, flags: u32) usize {1098pub fn fstatat(dirfd: i32, path: [*:0]const u8, stat_buf: *kernel_stat, flags: u32) usize {
1099 if (@hasField(SYS, "fstatat64")) {1099 if (@hasField(SYS, "fstatat64")) {
1100 return syscall4(.fstatat64, @bitCast(usize, @as(isize, dirfd)), @ptrToInt(path), @ptrToInt(stat_buf), flags);1100 return syscall4(.fstatat64, @bitCast(usize, @as(isize, dirfd)), @ptrToInt(path), @ptrToInt(stat_buf), flags);
1101 } else if (@hasField(SYS, "newfstatat")) {
1102 return syscall4(.newfstatat, @bitCast(usize, @as(isize, dirfd)), @ptrToInt(path), @ptrToInt(stat_buf), flags);
1101 } else {1103 } else {
1102 return syscall4(.fstatat, @bitCast(usize, @as(isize, dirfd)), @ptrToInt(path), @ptrToInt(stat_buf), flags);1104 return syscall4(.fstatat, @bitCast(usize, @as(isize, dirfd)), @ptrToInt(path), @ptrToInt(stat_buf), flags);
1103 }1105 }
lib/std/special/c.zig+49-40
...@@ -386,6 +386,11 @@ fn clone() callconv(.Naked) void {...@@ -386,6 +386,11 @@ fn clone() callconv(.Naked) void {
386 );386 );
387 },387 },
388 .arm => {388 .arm => {
389 // __clone(func, stack, flags, arg, ptid, tls, ctid)
390 // r0, r1, r2, r3, +0, +4, +8
391
392 // syscall(SYS_clone, flags, stack, ptid, tls, ctid)
393 // r7 r0, r1, r2, r3, r4
389 asm volatile (394 asm volatile (
390 \\ stmfd sp!,{r4,r5,r6,r7}395 \\ stmfd sp!,{r4,r5,r6,r7}
391 \\ mov r7,#120396 \\ mov r7,#120
...@@ -445,6 +450,11 @@ fn clone() callconv(.Naked) void {...@@ -445,6 +450,11 @@ fn clone() callconv(.Naked) void {
445 );450 );
446 },451 },
447 .mips, .mipsel => {452 .mips, .mipsel => {
453 // __clone(func, stack, flags, arg, ptid, tls, ctid)
454 // 3, 4, 5, 6, 7, 8, 9
455
456 // syscall(SYS_clone, flags, stack, ptid, tls, ctid)
457 // 2 4, 5, 6, 7, 8
448 asm volatile (458 asm volatile (
449 \\ # Save function pointer and argument pointer on new thread stack459 \\ # Save function pointer and argument pointer on new thread stack
450 \\ and $5, $5, -8460 \\ and $5, $5, -8
...@@ -465,12 +475,14 @@ fn clone() callconv(.Naked) void {...@@ -465,12 +475,14 @@ fn clone() callconv(.Naked) void {
465 \\ addu $sp, $sp, 16475 \\ addu $sp, $sp, 16
466 \\ jr $ra476 \\ jr $ra
467 \\ subu $2, $0, $2477 \\ subu $2, $0, $2
468 \\1: beq $2, $0, 1f478 \\1:
479 \\ beq $2, $0, 1f
469 \\ nop480 \\ nop
470 \\ addu $sp, $sp, 16481 \\ addu $sp, $sp, 16
471 \\ jr $ra482 \\ jr $ra
472 \\ nop483 \\ nop
473 \\1: lw $25, 0($sp)484 \\1:
485 \\ lw $25, 0($sp)
474 \\ lw $4, 4($sp)486 \\ lw $4, 4($sp)
475 \\ jalr $25487 \\ jalr $25
476 \\ nop488 \\ nop
...@@ -480,51 +492,48 @@ fn clone() callconv(.Naked) void {...@@ -480,51 +492,48 @@ fn clone() callconv(.Naked) void {
480 );492 );
481 },493 },
482 .powerpc64, .powerpc64le => {494 .powerpc64, .powerpc64le => {
495 // __clone(func, stack, flags, arg, ptid, tls, ctid)
496 // 3, 4, 5, 6, 7, 8, 9
497
498 // syscall(SYS_clone, flags, stack, ptid, tls, ctid)
499 // 0 3, 4, 5, 6, 7
483 asm volatile (500 asm volatile (
484 \\ # store non-volatile regs r30, r31 on stack in order to put our
485 \\ # start func and its arg there
486 \\ stwu 30, -16(1)
487 \\ stw 31, 4(1)
488 \\ # save r3 (func) into r30, and r6(arg) into r31
489 \\ mr 30, 3
490 \\ mr 31, 6
491 \\ # create initial stack frame for new thread501 \\ # create initial stack frame for new thread
492 \\ clrrwi 4, 4, 4502 \\ clrrdi 4, 4, 4
493 \\ li 0, 0503 \\ li 0, 0
494 \\ stwu 0, -16(4)504 \\ stdu 0,-32(4)
495 \\ #move c into first arg505 \\
496 \\ mr 3, 5506 \\ # save fn and arg to child stack
497 \\ mr 5, 7507 \\ std 3, 8(4)
498 \\ mr 6, 8508 \\ std 6, 16(4)
499 \\ mr 7, 9509 \\
500 \\ # move syscall number into r0510 \\ # shuffle args into correct registers and call SYS_clone
501 \\ li 0, 120511 \\ mr 3, 5
512 \\ #mr 4, 4
513 \\ mr 5, 7
514 \\ mr 6, 8
515 \\ mr 7, 9
516 \\ li 0, 120 # SYS_clone = 120
502 \\ sc517 \\ sc
503 \\ # check for syscall error518 \\
504 \\ bns+ 1f # jump to label 1 if no summary overflow.519 \\ # if error, negate return (errno)
505 \\ #else520 \\ bns+ 1f
506 \\ neg 3, 3 #negate the result (errno)521 \\ neg 3, 3
522 \\
507 \\1:523 \\1:
508 \\ # compare sc result with 0524 \\ # if we're the parent, return
509 \\ cmpwi cr7, 3, 0525 \\ cmpwi cr7, 3, 0
510 \\ # if not 0, jump to end526 \\ bnelr cr7
511 \\ bne cr7, 2f527 \\
512 \\ #else: we're the child528 \\ # we're the child. call fn(arg)
513 \\ #call funcptr: move arg (d) into r3529 \\ ld 3, 16(1)
514 \\ mr 3, 31530 \\ ld 12, 8(1)
515 \\ #move r30 (funcptr) into CTR reg531 \\ mtctr 12
516 \\ mtctr 30
517 \\ # call CTR reg
518 \\ bctrl532 \\ bctrl
519 \\ # mov SYS_exit into r0 (the exit param is already in r3)533 \\
520 \\ li 0, 1534 \\ # call SYS_exit. exit code is already in r3 from fn return value
535 \\ li 0, 1 # SYS_exit = 1
521 \\ sc536 \\ sc
522 \\2:
523 \\ # restore stack
524 \\ lwz 30, 0(1)
525 \\ lwz 31, 4(1)
526 \\ addi 1, 1, 16
527 \\ blr
528 );537 );
529 },538 },
530 .sparcv9 => {539 .sparcv9 => {
lib/std/target.zig+3-1
...@@ -1123,7 +1123,9 @@ pub const Target = struct {...@@ -1123,7 +1123,9 @@ pub const Target = struct {
1123 .mips, .mipsel => &mips.cpu.mips32,1123 .mips, .mipsel => &mips.cpu.mips32,
1124 .mips64, .mips64el => &mips.cpu.mips64,1124 .mips64, .mips64el => &mips.cpu.mips64,
1125 .msp430 => &msp430.cpu.generic,1125 .msp430 => &msp430.cpu.generic,
1126 .powerpc, .powerpc64, .powerpc64le => &powerpc.cpu.generic,1126 .powerpc => &powerpc.cpu.ppc32,
1127 .powerpc64 => &powerpc.cpu.ppc64,
1128 .powerpc64le => &powerpc.cpu.ppc64le,
1127 .amdgcn => &amdgpu.cpu.generic,1129 .amdgcn => &amdgpu.cpu.generic,
1128 .riscv32 => &riscv.cpu.generic_rv32,1130 .riscv32 => &riscv.cpu.generic_rv32,
1129 .riscv64 => &riscv.cpu.generic_rv64,1131 .riscv64 => &riscv.cpu.generic_rv64,
test/stage1/behavior/vector.zig+26-8
...@@ -149,15 +149,33 @@ test "vector casts of sizes not divisable by 8" {...@@ -149,15 +149,33 @@ test "vector casts of sizes not divisable by 8" {
149149
150test "vector @splat" {150test "vector @splat" {
151 const S = struct {151 const S = struct {
152 fn testForT(comptime N: comptime_int, v: anytype) void {
153 const T = @TypeOf(v);
154 var vec = @splat(N, v);
155 expectEqual(Vector(N, T), @TypeOf(vec));
156 var as_array = @as([N]T, vec);
157 for (as_array) |elem| expectEqual(v, elem);
158 }
152 fn doTheTest() void {159 fn doTheTest() void {
153 var v: u32 = 5;160 // Splats with multiple-of-8 bit types that fill a 128bit vector.
154 var x = @splat(4, v);161 testForT(16, @as(u8, 0xEE));
155 expect(@TypeOf(x) == Vector(4, u32));162 testForT(8, @as(u16, 0xBEEF));
156 var array_x: [4]u32 = x;163 testForT(4, @as(u32, 0xDEADBEEF));
157 expect(array_x[0] == 5);164 testForT(2, @as(u64, 0xCAFEF00DDEADBEEF));
158 expect(array_x[1] == 5);165
159 expect(array_x[2] == 5);166 testForT(8, @as(f16, 3.1415));
160 expect(array_x[3] == 5);167 testForT(4, @as(f32, 3.1415));
168 testForT(2, @as(f64, 3.1415));
169
170 // Same but fill more than 128 bits.
171 testForT(16 * 2, @as(u8, 0xEE));
172 testForT(8 * 2, @as(u16, 0xBEEF));
173 testForT(4 * 2, @as(u32, 0xDEADBEEF));
174 testForT(2 * 2, @as(u64, 0xCAFEF00DDEADBEEF));
175
176 testForT(8 * 2, @as(f16, 3.1415));
177 testForT(4 * 2, @as(f32, 3.1415));
178 testForT(2 * 2, @as(f64, 3.1415));
161 }179 }
162 };180 };
163 S.doTheTest();181 S.doTheTest();
test/stage1/behavior/widening.zig+1
...@@ -31,6 +31,7 @@ test "float widening" {...@@ -31,6 +31,7 @@ test "float widening" {
31test "float widening f16 to f128" {31test "float widening f16 to f128" {
32 // TODO https://github.com/ziglang/zig/issues/328232 // TODO https://github.com/ziglang/zig/issues/3282
33 if (@import("builtin").arch == .aarch64) return error.SkipZigTest;33 if (@import("builtin").arch == .aarch64) return error.SkipZigTest;
34 if (@import("builtin").arch == .powerpc64le) return error.SkipZigTest;
3435
35 var x: f16 = 12.34;36 var x: f16 = 12.34;
36 var y: f128 = x;37 var y: f128 = x;