diff options
author | Michael Munday <mike.munday@ibm.com> | 2019-06-04 19:17:41 +0100 |
---|---|---|
committer | Michael Munday <mike.munday@ibm.com> | 2019-06-06 16:15:43 +0000 |
commit | ac8dbe7747971007d58eb39e2e7e615cf9f04493 (patch) | |
tree | 626720b251dd583ead7900a31c3ab221ec84b858 /src/cmd/compile/internal/s390x | |
parent | 53deb812196d857ce8a7c46c1f7c1559bb167630 (diff) | |
download | go-ac8dbe7747971007d58eb39e2e7e615cf9f04493.tar.gz go-ac8dbe7747971007d58eb39e2e7e615cf9f04493.zip |
cmd/compile, runtime: make atomic loads/stores sequentially consistent on s390x
The z/Architecture does not guarantee that a load following a store
will not be reordered with that store, unless they access the same
address. Therefore if we want to ensure the sequential consistency
of atomic loads and stores we need to perform serialization
operations after atomic stores.
We do not need to serialize in the runtime when using StoreRel[ease]
and LoadAcq[uire]. The z/Architecture already provides sufficient
ordering guarantees for these operations.
name old time/op new time/op delta
AtomicLoad64-16 0.51ns ± 0% 0.51ns ± 0% ~ (all equal)
AtomicStore64-16 0.51ns ± 0% 0.60ns ± 9% +16.47% (p=0.000 n=17+20)
AtomicLoad-16 0.51ns ± 0% 0.51ns ± 0% ~ (all equal)
AtomicStore-16 0.51ns ± 0% 0.60ns ± 9% +16.50% (p=0.000 n=18+20)
Fixes #32428.
Change-Id: I88d19a4010c46070e4fff4b41587efe4c628d4d9
Reviewed-on: https://go-review.googlesource.com/c/go/+/180439
Run-TryBot: Michael Munday <mike.munday@ibm.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Austin Clements <austin@google.com>
Diffstat (limited to 'src/cmd/compile/internal/s390x')
-rw-r--r-- | src/cmd/compile/internal/s390x/ssa.go | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/s390x/ssa.go b/src/cmd/compile/internal/s390x/ssa.go index 7a897ae754..7ddebe7b64 100644 --- a/src/cmd/compile/internal/s390x/ssa.go +++ b/src/cmd/compile/internal/s390x/ssa.go @@ -800,6 +800,8 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) { bne := s.Prog(s390x.ABNE) bne.To.Type = obj.TYPE_BRANCH gc.Patch(bne, cs) + case ssa.OpS390XSYNC: + s.Prog(s390x.ASYNC) case ssa.OpClobber: // TODO: implement for clobberdead experiment. Nop is ok for now. default: |