]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.ssa] cmd/compile/internal/gc, runtime: use 32-bit load for writeBarrier check
authorCherry Zhang <cherryyz@google.com>
Fri, 6 May 2016 17:12:57 +0000 (10:12 -0700)
committerCherry Zhang <cherryyz@google.com>
Tue, 10 May 2016 17:34:30 +0000 (17:34 +0000)
Use 32-bit load for writeBarrier check on all architectures.
Padding added to runtime structure.

Updates #15365, #15492.

Change-Id: I5d3dadf8609923fe0fe4fcb384a418b7b9624998
Reviewed-on: https://go-review.googlesource.com/22855
Reviewed-by: Keith Randall <khr@golang.org>
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>

src/cmd/compile/internal/gc/ssa.go
src/runtime/mgc.go

index 265873a3ab307500b45f6760939bde1779cb32c9..96cf2177a60312558084a973c7b3588f6e824ac9 100644 (file)
@@ -3029,10 +3029,9 @@ func (s *state) insertWBmove(t *Type, left, right *ssa.Value, line int32) {
 
        aux := &ssa.ExternSymbol{Typ: Types[TBOOL], Sym: syslook("writeBarrier").Sym}
        flagaddr := s.newValue1A(ssa.OpAddr, Ptrto(Types[TUINT32]), aux, s.sb)
-       // TODO: select the .enabled field. It is currently first, so not needed for now.
-       // Load word, test byte, avoiding partial register write from load byte.
+       // Load word, test word, avoiding partial register write from load byte.
        flag := s.newValue2(ssa.OpLoad, Types[TUINT32], flagaddr, s.mem())
-       flag = s.newValue1(ssa.OpTrunc64to8, Types[TBOOL], flag)
+       flag = s.newValue2(ssa.OpNeq32, Types[TBOOL], flag, s.constInt32(Types[TUINT32], 0))
        b := s.endBlock()
        b.Kind = ssa.BlockIf
        b.Likely = ssa.BranchUnlikely
@@ -3080,10 +3079,9 @@ func (s *state) insertWBstore(t *Type, left, right *ssa.Value, line int32, skip
 
        aux := &ssa.ExternSymbol{Typ: Types[TBOOL], Sym: syslook("writeBarrier").Sym}
        flagaddr := s.newValue1A(ssa.OpAddr, Ptrto(Types[TUINT32]), aux, s.sb)
-       // TODO: select the .enabled field. It is currently first, so not needed for now.
-       // Load word, test byte, avoiding partial register write from load byte.
+       // Load word, test word, avoiding partial register write from load byte.
        flag := s.newValue2(ssa.OpLoad, Types[TUINT32], flagaddr, s.mem())
-       flag = s.newValue1(ssa.OpTrunc64to8, Types[TBOOL], flag)
+       flag = s.newValue2(ssa.OpNeq32, Types[TBOOL], flag, s.constInt32(Types[TUINT32], 0))
        b := s.endBlock()
        b.Kind = ssa.BlockIf
        b.Likely = ssa.BranchUnlikely
index ae8338ac10bc030948ff6bff5761920d29a21b14..c497ccee67e724c240d6d2fc33adad80c5ad0b9f 100644 (file)
@@ -220,10 +220,11 @@ var gcphase uint32
 // The compiler knows about this variable.
 // If you change it, you must change the compiler too.
 var writeBarrier struct {
-       enabled bool   // compiler emits a check of this before calling write barrier
-       needed  bool   // whether we need a write barrier for current GC phase
-       cgo     bool   // whether we need a write barrier for a cgo check
-       alignme uint64 // guarantee alignment so that compiler can use a 32 or 64-bit load
+       enabled bool    // compiler emits a check of this before calling write barrier
+       pad     [3]byte // compiler uses 32-bit load for "enabled" field
+       needed  bool    // whether we need a write barrier for current GC phase
+       cgo     bool    // whether we need a write barrier for a cgo check
+       alignme uint64  // guarantee alignment so that compiler can use a 32 or 64-bit load
 }
 
 // gcBlackenEnabled is 1 if mutator assists and background mark