From 0c81248bf46f611b56e3ab38b4d83e449b3c8636 Mon Sep 17 00:00:00 2001 From: Dave Cheney Date: Wed, 6 Apr 2016 18:43:23 +1000 Subject: runtime: remove unused return value from lfstackUnpack None of the two places that call lfstackUnpack use the second argument. This simplifies a followup CL that merges the lfstack{Pack,Unpack} implementations. Change-Id: I3c93f6259da99e113d94f8c8027584da79c1ac2c Reviewed-on: https://go-review.googlesource.com/21595 Run-TryBot: Dave Cheney Reviewed-by: Brad Fitzpatrick --- src/runtime/lfstack_32bit.go | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) (limited to 'src/runtime/lfstack_32bit.go') diff --git a/src/runtime/lfstack_32bit.go b/src/runtime/lfstack_32bit.go index 36811c1e47..2f59e0212e 100644 --- a/src/runtime/lfstack_32bit.go +++ b/src/runtime/lfstack_32bit.go @@ -14,8 +14,6 @@ func lfstackPack(node *lfnode, cnt uintptr) uint64 { return uint64(uintptr(unsafe.Pointer(node)))<<32 | uint64(cnt) } -func lfstackUnpack(val uint64) (node *lfnode, cnt uintptr) { - node = (*lfnode)(unsafe.Pointer(uintptr(val >> 32))) - cnt = uintptr(val) - return +func lfstackUnpack(val uint64) *lfnode { + return (*lfnode)(unsafe.Pointer(uintptr(val >> 32))) } -- cgit v1.3 From 3b02c5b1b66df9cdb23d5a3243bb37b2c312ea1b Mon Sep 17 00:00:00 2001 From: Dave Cheney Date: Thu, 7 Apr 2016 07:29:22 +1000 Subject: runtime: merge lfstack{Pack,Unpack} into one file Merge the remaining lfstack{Pack,Unpack} implemetations into one file. unsafe.Sizeof(uintptr(0)) == 4 is a constant comparison so this branch folds away at compile time. Dmitry confirmed that the upper 17 bits of an address will be zero for a user mode pointer, so there is no need to sign extend on amd64 during unpack, so we can reuse the same implementation as all othe 64 bit archs. Change-Id: I99f589416d8b181ccde5364c9c2e78e4a5efc7f1 Reviewed-on: https://go-review.googlesource.com/21597 Run-TryBot: Dave Cheney TryBot-Result: Gobot Gobot Reviewed-by: Minux Ma --- src/runtime/lfstack.go | 35 +++++++++++++++++++++++++++++++++++ src/runtime/lfstack_32bit.go | 19 ------------------- src/runtime/lfstack_64bit.go | 33 --------------------------------- src/runtime/lfstack_amd64.go | 22 ---------------------- 4 files changed, 35 insertions(+), 74 deletions(-) delete mode 100644 src/runtime/lfstack_32bit.go delete mode 100644 src/runtime/lfstack_64bit.go delete mode 100644 src/runtime/lfstack_amd64.go (limited to 'src/runtime/lfstack_32bit.go') diff --git a/src/runtime/lfstack.go b/src/runtime/lfstack.go index 1261f54d97..8a2d519402 100644 --- a/src/runtime/lfstack.go +++ b/src/runtime/lfstack.go @@ -41,3 +41,38 @@ func lfstackpop(head *uint64) unsafe.Pointer { } } } + +const ( + addrBits = 48 + cntBits = 64 - addrBits + 3 +) + +func lfstackPack(node *lfnode, cnt uintptr) uint64 { + if unsafe.Sizeof(uintptr(0)) == 4 { + // On 32-bit systems, the stored uint64 has a 32-bit pointer and 32-bit count. + return uint64(uintptr(unsafe.Pointer(node)))<<32 | uint64(cnt) + } + // On ppc64, Linux limits the user address space to 46 bits (see + // TASK_SIZE_USER64 in the Linux kernel). This has grown over time, + // so here we allow 48 bit addresses. + // + // On mips64, Linux limits the user address space to 40 bits (see + // TASK_SIZE64 in the Linux kernel). This has grown over time, + // so here we allow 48 bit addresses. + // + // On AMD64, virtual addresses are 48-bit numbers sign extended to 64. + // We shift the address left 16 to eliminate the sign extended part and make + // room in the bottom for the count. + // + // In addition to the 16 bits taken from the top, we can take 3 from the + // bottom, because node must be pointer-aligned, giving a total of 19 bits + // of count. + return uint64(uintptr(unsafe.Pointer(node)))<<(64-addrBits) | uint64(cnt&(1<> 32))) + } + return (*lfnode)(unsafe.Pointer(uintptr(val >> cntBits << 3))) +} diff --git a/src/runtime/lfstack_32bit.go b/src/runtime/lfstack_32bit.go deleted file mode 100644 index 2f59e0212e..0000000000 --- a/src/runtime/lfstack_32bit.go +++ /dev/null @@ -1,19 +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. - -// +build 386 arm nacl - -package runtime - -import "unsafe" - -// On 32-bit systems, the stored uint64 has a 32-bit pointer and 32-bit count. - -func lfstackPack(node *lfnode, cnt uintptr) uint64 { - return uint64(uintptr(unsafe.Pointer(node)))<<32 | uint64(cnt) -} - -func lfstackUnpack(val uint64) *lfnode { - return (*lfnode)(unsafe.Pointer(uintptr(val >> 32))) -} diff --git a/src/runtime/lfstack_64bit.go b/src/runtime/lfstack_64bit.go deleted file mode 100644 index 07c2a141f0..0000000000 --- a/src/runtime/lfstack_64bit.go +++ /dev/null @@ -1,33 +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. - -// +build arm64 mips64 mips64le ppc64 ppc64le - -package runtime - -import "unsafe" - -// On ppc64, Linux limits the user address space to 46 bits (see -// TASK_SIZE_USER64 in the Linux kernel). This has grown over time, -// so here we allow 48 bit addresses. -// -// On mips64, Linux limits the user address space to 40 bits (see -// TASK_SIZE64 in the Linux kernel). This has grown over time, -// so here we allow 48 bit addresses. -// -// In addition to the 16 bits taken from the top, we can take 3 from the -// bottom, because node must be pointer-aligned, giving a total of 19 bits -// of count. -const ( - addrBits = 48 - cntBits = 64 - addrBits + 3 -) - -func lfstackPack(node *lfnode, cnt uintptr) uint64 { - return uint64(uintptr(unsafe.Pointer(node)))<<(64-addrBits) | uint64(cnt&(1<> cntBits << 3))) -} diff --git a/src/runtime/lfstack_amd64.go b/src/runtime/lfstack_amd64.go deleted file mode 100644 index 6397e1d47f..0000000000 --- a/src/runtime/lfstack_amd64.go +++ /dev/null @@ -1,22 +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 runtime - -import "unsafe" - -// On AMD64, virtual addresses are 48-bit numbers sign extended to 64. -// We shift the address left 16 to eliminate the sign extended part and make -// room in the bottom for the count. -// In addition to the 16 bits taken from the top, we can take 3 from the -// bottom, because node must be pointer-aligned, giving a total of 19 bits -// of count. - -func lfstackPack(node *lfnode, cnt uintptr) uint64 { - return uint64(uintptr(unsafe.Pointer(node)))<<16 | uint64(cnt&(1<<19-1)) -} - -func lfstackUnpack(val uint64) *lfnode { - return (*lfnode)(unsafe.Pointer(uintptr(int64(val) >> 19 << 3))) -} -- cgit v1.3 From 9cc9e95b288648d796d92f0b92cb713b35f20062 Mon Sep 17 00:00:00 2001 From: Dave Cheney Date: Thu, 7 Apr 2016 14:05:06 +0000 Subject: Revert "runtime: merge lfstack{Pack,Unpack} into one file" This broke solaris, which apparently does use the upper 17 bits of the address space. This reverts commit 3b02c5b1b66df9cdb23d5a3243bb37b2c312ea1b. Change-Id: Iedfe54abd0384960845468205f20191a97751c0b Reviewed-on: https://go-review.googlesource.com/21652 Reviewed-by: Dave Cheney --- src/runtime/lfstack.go | 35 ----------------------------------- src/runtime/lfstack_32bit.go | 19 +++++++++++++++++++ src/runtime/lfstack_64bit.go | 33 +++++++++++++++++++++++++++++++++ src/runtime/lfstack_amd64.go | 22 ++++++++++++++++++++++ 4 files changed, 74 insertions(+), 35 deletions(-) create mode 100644 src/runtime/lfstack_32bit.go create mode 100644 src/runtime/lfstack_64bit.go create mode 100644 src/runtime/lfstack_amd64.go (limited to 'src/runtime/lfstack_32bit.go') diff --git a/src/runtime/lfstack.go b/src/runtime/lfstack.go index 8a2d519402..1261f54d97 100644 --- a/src/runtime/lfstack.go +++ b/src/runtime/lfstack.go @@ -41,38 +41,3 @@ func lfstackpop(head *uint64) unsafe.Pointer { } } } - -const ( - addrBits = 48 - cntBits = 64 - addrBits + 3 -) - -func lfstackPack(node *lfnode, cnt uintptr) uint64 { - if unsafe.Sizeof(uintptr(0)) == 4 { - // On 32-bit systems, the stored uint64 has a 32-bit pointer and 32-bit count. - return uint64(uintptr(unsafe.Pointer(node)))<<32 | uint64(cnt) - } - // On ppc64, Linux limits the user address space to 46 bits (see - // TASK_SIZE_USER64 in the Linux kernel). This has grown over time, - // so here we allow 48 bit addresses. - // - // On mips64, Linux limits the user address space to 40 bits (see - // TASK_SIZE64 in the Linux kernel). This has grown over time, - // so here we allow 48 bit addresses. - // - // On AMD64, virtual addresses are 48-bit numbers sign extended to 64. - // We shift the address left 16 to eliminate the sign extended part and make - // room in the bottom for the count. - // - // In addition to the 16 bits taken from the top, we can take 3 from the - // bottom, because node must be pointer-aligned, giving a total of 19 bits - // of count. - return uint64(uintptr(unsafe.Pointer(node)))<<(64-addrBits) | uint64(cnt&(1<> 32))) - } - return (*lfnode)(unsafe.Pointer(uintptr(val >> cntBits << 3))) -} diff --git a/src/runtime/lfstack_32bit.go b/src/runtime/lfstack_32bit.go new file mode 100644 index 0000000000..2f59e0212e --- /dev/null +++ b/src/runtime/lfstack_32bit.go @@ -0,0 +1,19 @@ +// 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. + +// +build 386 arm nacl + +package runtime + +import "unsafe" + +// On 32-bit systems, the stored uint64 has a 32-bit pointer and 32-bit count. + +func lfstackPack(node *lfnode, cnt uintptr) uint64 { + return uint64(uintptr(unsafe.Pointer(node)))<<32 | uint64(cnt) +} + +func lfstackUnpack(val uint64) *lfnode { + return (*lfnode)(unsafe.Pointer(uintptr(val >> 32))) +} diff --git a/src/runtime/lfstack_64bit.go b/src/runtime/lfstack_64bit.go new file mode 100644 index 0000000000..07c2a141f0 --- /dev/null +++ b/src/runtime/lfstack_64bit.go @@ -0,0 +1,33 @@ +// 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. + +// +build arm64 mips64 mips64le ppc64 ppc64le + +package runtime + +import "unsafe" + +// On ppc64, Linux limits the user address space to 46 bits (see +// TASK_SIZE_USER64 in the Linux kernel). This has grown over time, +// so here we allow 48 bit addresses. +// +// On mips64, Linux limits the user address space to 40 bits (see +// TASK_SIZE64 in the Linux kernel). This has grown over time, +// so here we allow 48 bit addresses. +// +// In addition to the 16 bits taken from the top, we can take 3 from the +// bottom, because node must be pointer-aligned, giving a total of 19 bits +// of count. +const ( + addrBits = 48 + cntBits = 64 - addrBits + 3 +) + +func lfstackPack(node *lfnode, cnt uintptr) uint64 { + return uint64(uintptr(unsafe.Pointer(node)))<<(64-addrBits) | uint64(cnt&(1<> cntBits << 3))) +} diff --git a/src/runtime/lfstack_amd64.go b/src/runtime/lfstack_amd64.go new file mode 100644 index 0000000000..6397e1d47f --- /dev/null +++ b/src/runtime/lfstack_amd64.go @@ -0,0 +1,22 @@ +// 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 runtime + +import "unsafe" + +// On AMD64, virtual addresses are 48-bit numbers sign extended to 64. +// We shift the address left 16 to eliminate the sign extended part and make +// room in the bottom for the count. +// In addition to the 16 bits taken from the top, we can take 3 from the +// bottom, because node must be pointer-aligned, giving a total of 19 bits +// of count. + +func lfstackPack(node *lfnode, cnt uintptr) uint64 { + return uint64(uintptr(unsafe.Pointer(node)))<<16 | uint64(cnt&(1<<19-1)) +} + +func lfstackUnpack(val uint64) *lfnode { + return (*lfnode)(unsafe.Pointer(uintptr(int64(val) >> 19 << 3))) +} -- cgit v1.3