aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/mbarrier.go
diff options
context:
space:
mode:
authorIan Lance Taylor <iant@golang.org>2020-04-07 21:39:39 -0700
committerIan Lance Taylor <iant@golang.org>2020-04-08 21:52:45 +0000
commitb4bb47d88fa95a587b73c936eeb373348dab9f15 (patch)
tree7b2f4b4b0103f8dbaf12e7a0a0e074fec41500c8 /src/runtime/mbarrier.go
parentddfc55b076d945f215875d6b65c36fc53b332cc1 (diff)
downloadgo-b4bb47d88fa95a587b73c936eeb373348dab9f15.tar.gz
go-b4bb47d88fa95a587b73c936eeb373348dab9f15.zip
runtime: simplify typedmemmovepartial
The offset is always a multiple of the pointer size. Change-Id: I790e087e89a081044a3ec35d99880533a4c929bd Reviewed-on: https://go-review.googlesource.com/c/go/+/227540 Run-TryBot: Ian Lance Taylor <iant@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org> Reviewed-by: Austin Clements <austin@google.com>
Diffstat (limited to 'src/runtime/mbarrier.go')
-rw-r--r--src/runtime/mbarrier.go30
1 files changed, 8 insertions, 22 deletions
diff --git a/src/runtime/mbarrier.go b/src/runtime/mbarrier.go
index 264376da9b..0199053183 100644
--- a/src/runtime/mbarrier.go
+++ b/src/runtime/mbarrier.go
@@ -193,32 +193,18 @@ func reflectlite_typedmemmove(typ *_type, dst, src unsafe.Pointer) {
// typedmemmovepartial is like typedmemmove but assumes that
// dst and src point off bytes into the value and only copies size bytes.
+// off must be a multiple of sys.PtrSize.
//go:linkname reflect_typedmemmovepartial reflect.typedmemmovepartial
func reflect_typedmemmovepartial(typ *_type, dst, src unsafe.Pointer, off, size uintptr) {
- if writeBarrier.needed && typ.ptrdata != 0 && size >= sys.PtrSize {
- // Pointer-align start address for bulk barrier.
- adst, asrc, asize := dst, src, size
- ptrdata := typ.ptrdata
- if ptrdata > off {
- ptrdata -= off
- } else {
- ptrdata = 0
+ if writeBarrier.needed && typ.ptrdata > off && size >= sys.PtrSize {
+ if off&(sys.PtrSize-1) != 0 {
+ panic("reflect: internal error: misaligned offset")
}
- if frag := -off & (sys.PtrSize - 1); frag != 0 {
- adst = add(dst, frag)
- asrc = add(src, frag)
- asize -= frag
- if ptrdata > frag {
- ptrdata -= frag
- } else {
- ptrdata = 0
- }
+ pwsize := alignDown(size, sys.PtrSize)
+ if poff := typ.ptrdata - off; pwsize > poff {
+ pwsize = poff
}
- pwsize := asize &^ (sys.PtrSize - 1)
- if pwsize > ptrdata {
- pwsize = ptrdata
- }
- bulkBarrierPreWrite(uintptr(adst), uintptr(asrc), pwsize)
+ bulkBarrierPreWrite(uintptr(dst), uintptr(src), pwsize)
}
memmove(dst, src, size)