]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.power64] cmd/9l, math/big, runtime, syscall: fixes for power64
authorRuss Cox <rsc@golang.org>
Wed, 13 Aug 2014 18:36:29 +0000 (14:36 -0400)
committerRuss Cox <rsc@golang.org>
Wed, 13 Aug 2014 18:36:29 +0000 (14:36 -0400)
On the machine I'm using, the hardware page size seems to be 64 kB.
Make ELF rounding and mmap quantum 64 kB to match.

Error numbers returned from kernel are positive; do not negate.

Implement stubs for math/big.

LGTM=minux
R=minux
CC=golang-codereviews
https://golang.org/cl/124300043

src/cmd/9l/obj.c
src/pkg/math/big/arith_power64x.s [new file with mode: 0644]
src/pkg/runtime/arch_power64.h
src/pkg/runtime/asm_power64x.s
src/pkg/runtime/mem_linux.c
src/pkg/runtime/sys_linux_power64x.s
src/pkg/syscall/asm_linux_power64x.s

index 1ab18f491ae037a16e8d9e392b907959487b6dbe..badb72a1ac72c0feea36670c443ced7398260f1f 100644 (file)
@@ -88,7 +88,7 @@ archinit(void)
                if(INITDAT == -1)
                        INITDAT = 0;
                if(INITRND == -1)
-                       INITRND = 4096;
+                       INITRND = 0x10000;
                break;
        case Hnacl:
                elfinit();
diff --git a/src/pkg/math/big/arith_power64x.s b/src/pkg/math/big/arith_power64x.s
new file mode 100644 (file)
index 0000000..502d40c
--- /dev/null
@@ -0,0 +1,46 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// +build power64 power64le
+
+#include "../../../cmd/ld/textflag.h"
+
+// This file provides fast assembly versions for the elementary
+// arithmetic operations on vectors implemented in arith.go.
+
+TEXT ·mulWW(SB),NOSPLIT,$0
+       BR ·mulWW_g(SB)
+
+TEXT ·divWW(SB),NOSPLIT,$0
+       BR ·divWW_g(SB)
+
+TEXT ·addVV(SB),NOSPLIT,$0
+       BR ·addVV_g(SB)
+
+TEXT ·subVV(SB),NOSPLIT,$0
+       BR ·subVV_g(SB)
+
+TEXT ·addVW(SB),NOSPLIT,$0
+       BR ·addVW_g(SB)
+
+TEXT ·subVW(SB),NOSPLIT,$0
+       BR ·subVW_g(SB)
+
+TEXT ·shlVU(SB),NOSPLIT,$0
+       BR ·shlVU_g(SB)
+
+TEXT ·shrVU(SB),NOSPLIT,$0
+       BR ·shrVU_g(SB)
+
+TEXT ·mulAddVWW(SB),NOSPLIT,$0
+       BR ·mulAddVWW_g(SB)
+
+TEXT ·addMulVVW(SB),NOSPLIT,$0
+       BR ·addMulVVW_g(SB)
+
+TEXT ·divWVW(SB),NOSPLIT,$0
+       BR ·divWVW_g(SB)
+
+TEXT ·bitLen(SB),NOSPLIT,$0
+       BR ·bitLen_g(SB)
index 3d5b4943c73fc7fde5df07664b137f1c79980886..1dcbbc226c79dc87d4a52e323c24af81942c9cd5 100644 (file)
@@ -7,7 +7,7 @@ enum {
        BigEndian = 1,
        CacheLineSize = 64,
        RuntimeGogoBytes = 84,
-       PhysPageSize = 4096,
+       PhysPageSize = 65536,
        PCQuantum = 4,
        Int64Align = 8
 };
index 2fbaf5a53ecb985ca51fa89bcdd261923102a22d..59c7a9eb5a09c82870c6e77a40738d5364a1b2c3 100644 (file)
@@ -782,8 +782,8 @@ TEXT bytes·IndexByte(SB),NOSPLIT,$0-40
        MOVD    s+0(FP), R3
        MOVD    s_len+8(FP), R4
        MOVBZ   c+24(FP), R5    // byte to find
+       MOVD    R3, R6          // store base for later
        SUB     $1, R3
-       MOVD    R3, R6          // store base-1 for later
        ADD     R3, R4          // end-1
 
 _index_loop:
@@ -798,16 +798,16 @@ _index_loop:
        RETURN
 
 _index_notfound:
-       MOVW    $-1, R3
-       MOVW    R3, ret+32(FP)
+       MOVD    $-1, R3
+       MOVD    R3, ret+32(FP)
        RETURN
 
 TEXT strings·IndexByte(SB),NOSPLIT,$0
        MOVD    p+0(FP), R3
        MOVD    b_len+8(FP), R4
        MOVBZ   c+16(FP), R5    // byte to find
+       MOVD    R3, R6          // store base for later
        SUB     $1, R3
-       MOVD    R3, R6          // store base-1 for later
        ADD     R3, R4          // end-1
 
 _index2_loop:
@@ -822,8 +822,8 @@ _index2_loop:
        RETURN
 
 _index2_notfound:
-       MOVW    $-1, R3
-       MOVW    R3, ret+24(FP)
+       MOVD    $-1, R3
+       MOVD    R3, ret+24(FP)
        RETURN
 
 
index 635594c3651065afed06b3c5a67f8326ed79d93e..30594c5282e635443aa5769e6c6a4c38b0d4d695 100644 (file)
@@ -10,7 +10,7 @@
 
 enum
 {
-       _PAGE_SIZE = 4096,
+       _PAGE_SIZE = PhysPageSize,
        EACCES = 13,
 };
 
@@ -35,8 +35,9 @@ addrspace_free(void *v, uintptr n)
                errval = runtime·mincore((int8*)v + off, chunk, vec);
                // ENOMEM means unmapped, which is what we want.
                // Anything else we assume means the pages are mapped.
-               if (errval != -ENOMEM)
+               if (errval != -ENOMEM && errval != ENOMEM) {
                        return 0;
+               }
        }
        return 1;
 }
@@ -47,12 +48,15 @@ mmap_fixed(byte *v, uintptr n, int32 prot, int32 flags, int32 fd, uint32 offset)
        void *p;
 
        p = runtime·mmap(v, n, prot, flags, fd, offset);
-       if(p != v && addrspace_free(v, n)) {
+       if(p != v) {
+               if(p > (void*)4096) {
+                       runtime·munmap(p, n);
+                       p = nil;
+               }
                // On some systems, mmap ignores v without
                // MAP_FIXED, so retry if the address space is free.
-               if(p > (void*)4096)
-                       runtime·munmap(p, n);
-               p = runtime·mmap(v, n, prot, flags|MAP_FIXED, fd, offset);
+               if(addrspace_free(v, n))
+                       p = runtime·mmap(v, n, prot, flags|MAP_FIXED, fd, offset);
        }
        return p;
 }
index c0c41efa9560abbaccf81991697634ff781faae5..f5149eaeaf452343df6780759dcacb211c513704 100644 (file)
@@ -223,7 +223,6 @@ TEXT runtime·mmap(SB),NOSPLIT,$-8
 
        SYSCALL $SYS_mmap
        BVC     2(PC)
-       NEG     R3, R3
        RETURN
 
 TEXT runtime·munmap(SB),NOSPLIT,$-8
index 1dd23ef30574299b35454c07cef98c82d6015608..c9b0fe320c6ae8f6a85f36b68082bfdac12759ca 100644 (file)
@@ -24,7 +24,6 @@ TEXT  ·Syscall(SB),NOSPLIT,$0-56
        MOVD    trap+0(FP), R9  // syscall entry
        SYSCALL R9
        BVC     ok
-       NEG     R3, R3
        MOVD    $-1, R4
        MOVD    R4, r1+32(FP)   // r1
        MOVD    R0, r2+40(FP)   // r2
@@ -49,7 +48,6 @@ TEXT ·Syscall6(SB),NOSPLIT,$0-80
        MOVD    trap+0(FP), R9  // syscall entry
        SYSCALL R9
        BVC     ok6
-       NEG     R3, R3
        MOVD    $-1, R4
        MOVD    R4, r1+56(FP)   // r1
        MOVD    R0, r2+64(FP)   // r2
@@ -73,7 +71,6 @@ TEXT ·RawSyscall(SB),NOSPLIT,$0-56
        MOVD    trap+0(FP), R9  // syscall entry
        SYSCALL R9
        BVC     ok1
-       NEG     R3, R3
        MOVD    $-1, R4
        MOVD    R4, r1+32(FP)   // r1
        MOVD    R0, r2+40(FP)   // r2
@@ -95,7 +92,6 @@ TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
        MOVD    trap+0(FP), R9  // syscall entry
        SYSCALL R9
        BVC     ok2
-       NEG     R3, R3
        MOVD    $-1, R4
        MOVD    R4, r1+56(FP)   // r1
        MOVD    R0, r2+64(FP)   // r2