diff options
| author | David Chase <drchase@google.com> | 2024-07-23 11:43:23 -0400 |
|---|---|---|
| committer | David Chase <drchase@google.com> | 2024-07-23 19:05:35 +0000 |
| commit | fc5073bc155545dde4856cccdfcbb31880d1eb66 (patch) | |
| tree | 90aba60eda016a9392cd8ee0d55a154d0aa570e3 /src/runtime/internal | |
| parent | f9eb3e3cd59c1cf38a98f2367c6c8dc180db9a95 (diff) | |
| download | go-fc5073bc155545dde4856cccdfcbb31880d1eb66.tar.xz | |
runtime,internal: move runtime/internal/sys to internal/runtime/sys
Cleanup and friction reduction
For #65355.
Change-Id: Ia14c9dc584a529a35b97801dd3e95b9acc99a511
Reviewed-on: https://go-review.googlesource.com/c/go/+/600436
Reviewed-by: Keith Randall <khr@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Keith Randall <khr@golang.org>
Diffstat (limited to 'src/runtime/internal')
| -rw-r--r-- | src/runtime/internal/sys/consts.go | 36 | ||||
| -rw-r--r-- | src/runtime/internal/sys/consts_norace.go | 9 | ||||
| -rw-r--r-- | src/runtime/internal/sys/consts_race.go | 9 | ||||
| -rw-r--r-- | src/runtime/internal/sys/intrinsics.go | 208 | ||||
| -rw-r--r-- | src/runtime/internal/sys/intrinsics_test.go | 42 | ||||
| -rw-r--r-- | src/runtime/internal/sys/nih.go | 41 | ||||
| -rw-r--r-- | src/runtime/internal/sys/sys.go | 7 |
7 files changed, 0 insertions, 352 deletions
diff --git a/src/runtime/internal/sys/consts.go b/src/runtime/internal/sys/consts.go deleted file mode 100644 index 98c0f09ef1..0000000000 --- a/src/runtime/internal/sys/consts.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2014 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. - -package sys - -import ( - "internal/goarch" - "internal/goos" -) - -// AIX requires a larger stack for syscalls. -// The race build also needs more stack. See issue 54291. -// This arithmetic must match that in cmd/internal/objabi/stack.go:stackGuardMultiplier. -const StackGuardMultiplier = 1 + goos.IsAix + isRace - -// DefaultPhysPageSize is the default physical page size. -const DefaultPhysPageSize = goarch.DefaultPhysPageSize - -// PCQuantum is the minimal unit for a program counter (1 on x86, 4 on most other systems). -// The various PC tables record PC deltas pre-divided by PCQuantum. -const PCQuantum = goarch.PCQuantum - -// Int64Align is the required alignment for a 64-bit integer (4 on 32-bit systems, 8 on 64-bit). -const Int64Align = goarch.PtrSize - -// MinFrameSize is the size of the system-reserved words at the bottom -// of a frame (just above the architectural stack pointer). -// It is zero on x86 and PtrSize on most non-x86 (LR-based) systems. -// On PowerPC it is larger, to cover three more reserved words: -// the compiler word, the link editor word, and the TOC save word. -const MinFrameSize = goarch.MinFrameSize - -// StackAlign is the required alignment of the SP register. -// The stack must be at least word aligned, but some architectures require more. -const StackAlign = goarch.StackAlign diff --git a/src/runtime/internal/sys/consts_norace.go b/src/runtime/internal/sys/consts_norace.go deleted file mode 100644 index a9613b8843..0000000000 --- a/src/runtime/internal/sys/consts_norace.go +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright 2022 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. - -//go:build !race - -package sys - -const isRace = 0 diff --git a/src/runtime/internal/sys/consts_race.go b/src/runtime/internal/sys/consts_race.go deleted file mode 100644 index f824fb39d3..0000000000 --- a/src/runtime/internal/sys/consts_race.go +++ /dev/null @@ -1,9 +0,0 @@ -// Copyright 2022 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. - -//go:build race - -package sys - -const isRace = 1 diff --git a/src/runtime/internal/sys/intrinsics.go b/src/runtime/internal/sys/intrinsics.go deleted file mode 100644 index e6a3758447..0000000000 --- a/src/runtime/internal/sys/intrinsics.go +++ /dev/null @@ -1,208 +0,0 @@ -// Copyright 2016 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. - -package sys - -// Copied from math/bits to avoid dependence. - -var deBruijn32tab = [32]byte{ - 0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, - 31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9, -} - -const deBruijn32 = 0x077CB531 - -var deBruijn64tab = [64]byte{ - 0, 1, 56, 2, 57, 49, 28, 3, 61, 58, 42, 50, 38, 29, 17, 4, - 62, 47, 59, 36, 45, 43, 51, 22, 53, 39, 33, 30, 24, 18, 12, 5, - 63, 55, 48, 27, 60, 41, 37, 16, 46, 35, 44, 21, 52, 32, 23, 11, - 54, 26, 40, 15, 34, 20, 31, 10, 25, 14, 19, 9, 13, 8, 7, 6, -} - -const deBruijn64 = 0x03f79d71b4ca8b09 - -const ntz8tab = "" + - "\x08\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + - "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + - "\x05\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + - "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + - "\x06\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + - "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + - "\x05\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + - "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + - "\x07\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + - "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + - "\x05\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + - "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + - "\x06\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + - "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + - "\x05\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" + - "\x04\x00\x01\x00\x02\x00\x01\x00\x03\x00\x01\x00\x02\x00\x01\x00" - -// TrailingZeros32 returns the number of trailing zero bits in x; the result is 32 for x == 0. -func TrailingZeros32(x uint32) int { - if x == 0 { - return 32 - } - // see comment in TrailingZeros64 - return int(deBruijn32tab[(x&-x)*deBruijn32>>(32-5)]) -} - -// TrailingZeros64 returns the number of trailing zero bits in x; the result is 64 for x == 0. -func TrailingZeros64(x uint64) int { - if x == 0 { - return 64 - } - // If popcount is fast, replace code below with return popcount(^x & (x - 1)). - // - // x & -x leaves only the right-most bit set in the word. Let k be the - // index of that bit. Since only a single bit is set, the value is two - // to the power of k. Multiplying by a power of two is equivalent to - // left shifting, in this case by k bits. The de Bruijn (64 bit) constant - // is such that all six bit, consecutive substrings are distinct. - // Therefore, if we have a left shifted version of this constant we can - // find by how many bits it was shifted by looking at which six bit - // substring ended up at the top of the word. - // (Knuth, volume 4, section 7.3.1) - return int(deBruijn64tab[(x&-x)*deBruijn64>>(64-6)]) -} - -// TrailingZeros8 returns the number of trailing zero bits in x; the result is 8 for x == 0. -func TrailingZeros8(x uint8) int { - return int(ntz8tab[x]) -} - -const len8tab = "" + - "\x00\x01\x02\x02\x03\x03\x03\x03\x04\x04\x04\x04\x04\x04\x04\x04" + - "\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05\x05" + - "\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06" + - "\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06\x06" + - "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" + - "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" + - "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" + - "\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07\x07" + - "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" + - "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" + - "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" + - "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" + - "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" + - "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" + - "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" + - "\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08\x08" - -// Len64 returns the minimum number of bits required to represent x; the result is 0 for x == 0. -// -// nosplit because this is used in src/runtime/histogram.go, which make run in sensitive contexts. -// -//go:nosplit -func Len64(x uint64) (n int) { - if x >= 1<<32 { - x >>= 32 - n = 32 - } - if x >= 1<<16 { - x >>= 16 - n += 16 - } - if x >= 1<<8 { - x >>= 8 - n += 8 - } - return n + int(len8tab[x]) -} - -// --- OnesCount --- - -const m0 = 0x5555555555555555 // 01010101 ... -const m1 = 0x3333333333333333 // 00110011 ... -const m2 = 0x0f0f0f0f0f0f0f0f // 00001111 ... - -// OnesCount64 returns the number of one bits ("population count") in x. -func OnesCount64(x uint64) int { - // Implementation: Parallel summing of adjacent bits. - // See "Hacker's Delight", Chap. 5: Counting Bits. - // The following pattern shows the general approach: - // - // x = x>>1&(m0&m) + x&(m0&m) - // x = x>>2&(m1&m) + x&(m1&m) - // x = x>>4&(m2&m) + x&(m2&m) - // x = x>>8&(m3&m) + x&(m3&m) - // x = x>>16&(m4&m) + x&(m4&m) - // x = x>>32&(m5&m) + x&(m5&m) - // return int(x) - // - // Masking (& operations) can be left away when there's no - // danger that a field's sum will carry over into the next - // field: Since the result cannot be > 64, 8 bits is enough - // and we can ignore the masks for the shifts by 8 and up. - // Per "Hacker's Delight", the first line can be simplified - // more, but it saves at best one instruction, so we leave - // it alone for clarity. - const m = 1<<64 - 1 - x = x>>1&(m0&m) + x&(m0&m) - x = x>>2&(m1&m) + x&(m1&m) - x = (x>>4 + x) & (m2 & m) - x += x >> 8 - x += x >> 16 - x += x >> 32 - return int(x) & (1<<7 - 1) -} - -// LeadingZeros64 returns the number of leading zero bits in x; the result is 64 for x == 0. -func LeadingZeros64(x uint64) int { return 64 - Len64(x) } - -// LeadingZeros8 returns the number of leading zero bits in x; the result is 8 for x == 0. -func LeadingZeros8(x uint8) int { return 8 - Len8(x) } - -// Len8 returns the minimum number of bits required to represent x; the result is 0 for x == 0. -func Len8(x uint8) int { - return int(len8tab[x]) -} - -// Bswap64 returns its input with byte order reversed -// 0x0102030405060708 -> 0x0807060504030201 -func Bswap64(x uint64) uint64 { - c8 := uint64(0x00ff00ff00ff00ff) - a := x >> 8 & c8 - b := (x & c8) << 8 - x = a | b - c16 := uint64(0x0000ffff0000ffff) - a = x >> 16 & c16 - b = (x & c16) << 16 - x = a | b - c32 := uint64(0x00000000ffffffff) - a = x >> 32 & c32 - b = (x & c32) << 32 - x = a | b - return x -} - -// Bswap32 returns its input with byte order reversed -// 0x01020304 -> 0x04030201 -func Bswap32(x uint32) uint32 { - c8 := uint32(0x00ff00ff) - a := x >> 8 & c8 - b := (x & c8) << 8 - x = a | b - c16 := uint32(0x0000ffff) - a = x >> 16 & c16 - b = (x & c16) << 16 - x = a | b - return x -} - -// Prefetch prefetches data from memory addr to cache -// -// AMD64: Produce PREFETCHT0 instruction -// -// ARM64: Produce PRFM instruction with PLDL1KEEP option -func Prefetch(addr uintptr) {} - -// PrefetchStreamed prefetches data from memory addr, with a hint that this data is being streamed. -// That is, it is likely to be accessed very soon, but only once. If possible, this will avoid polluting the cache. -// -// AMD64: Produce PREFETCHNTA instruction -// -// ARM64: Produce PRFM instruction with PLDL1STRM option -func PrefetchStreamed(addr uintptr) {} diff --git a/src/runtime/internal/sys/intrinsics_test.go b/src/runtime/internal/sys/intrinsics_test.go deleted file mode 100644 index 6799885001..0000000000 --- a/src/runtime/internal/sys/intrinsics_test.go +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright 2016 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. - -package sys_test - -import ( - "runtime/internal/sys" - "testing" -) - -func TestTrailingZeros64(t *testing.T) { - for i := 0; i <= 64; i++ { - x := uint64(5) << uint(i) - if got := sys.TrailingZeros64(x); got != i { - t.Errorf("TrailingZeros64(%d)=%d, want %d", x, got, i) - } - } -} -func TestTrailingZeros32(t *testing.T) { - for i := 0; i <= 32; i++ { - x := uint32(5) << uint(i) - if got := sys.TrailingZeros32(x); got != i { - t.Errorf("TrailingZeros32(%d)=%d, want %d", x, got, i) - } - } -} - -func TestBswap64(t *testing.T) { - x := uint64(0x1122334455667788) - y := sys.Bswap64(x) - if y != 0x8877665544332211 { - t.Errorf("Bswap(%x)=%x, want 0x8877665544332211", x, y) - } -} -func TestBswap32(t *testing.T) { - x := uint32(0x11223344) - y := sys.Bswap32(x) - if y != 0x44332211 { - t.Errorf("Bswap(%x)=%x, want 0x44332211", x, y) - } -} diff --git a/src/runtime/internal/sys/nih.go b/src/runtime/internal/sys/nih.go deleted file mode 100644 index 17eab67345..0000000000 --- a/src/runtime/internal/sys/nih.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2014 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. - -package sys - -// NOTE: keep in sync with cmd/compile/internal/types.CalcSize -// to make the compiler recognize this as an intrinsic type. -type nih struct{} - -// NotInHeap is a type must never be allocated from the GC'd heap or on the stack, -// and is called not-in-heap. -// -// Other types can embed NotInHeap to make it not-in-heap. Specifically, pointers -// to these types must always fail the `runtime.inheap` check. The type may be used -// for global variables, or for objects in unmanaged memory (e.g., allocated with -// `sysAlloc`, `persistentalloc`, r`fixalloc`, or from a manually-managed span). -// -// Specifically: -// -// 1. `new(T)`, `make([]T)`, `append([]T, ...)` and implicit heap -// allocation of T are disallowed. (Though implicit allocations are -// disallowed in the runtime anyway.) -// -// 2. A pointer to a regular type (other than `unsafe.Pointer`) cannot be -// converted to a pointer to a not-in-heap type, even if they have the -// same underlying type. -// -// 3. Any type that containing a not-in-heap type is itself considered as not-in-heap. -// -// - Structs and arrays are not-in-heap if their elements are not-in-heap. -// - Maps and channels contains no-in-heap types are disallowed. -// -// 4. Write barriers on pointers to not-in-heap types can be omitted. -// -// The last point is the real benefit of NotInHeap. The runtime uses -// it for low-level internal structures to avoid memory barriers in the -// scheduler and the memory allocator where they are illegal or simply -// inefficient. This mechanism is reasonably safe and does not compromise -// the readability of the runtime. -type NotInHeap struct{ _ nih } diff --git a/src/runtime/internal/sys/sys.go b/src/runtime/internal/sys/sys.go deleted file mode 100644 index 694101d36f..0000000000 --- a/src/runtime/internal/sys/sys.go +++ /dev/null @@ -1,7 +0,0 @@ -// Copyright 2015 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. - -// package sys contains system- and configuration- and architecture-specific -// constants used by the runtime. -package sys |
