mirror of
https://github.com/golang/go
synced 2024-11-20 01:54:41 -07:00
[dev.ssa] cmd/compile/internal/gc, runtime: use 32-bit load for writeBarrier check
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>
This commit is contained in:
parent
e1a2ea88d0
commit
fdc4a964d2
@ -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}
|
aux := &ssa.ExternSymbol{Typ: Types[TBOOL], Sym: syslook("writeBarrier").Sym}
|
||||||
flagaddr := s.newValue1A(ssa.OpAddr, Ptrto(Types[TUINT32]), aux, s.sb)
|
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 word, avoiding partial register write from load byte.
|
||||||
// Load word, test byte, avoiding partial register write from load byte.
|
|
||||||
flag := s.newValue2(ssa.OpLoad, Types[TUINT32], flagaddr, s.mem())
|
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 := s.endBlock()
|
||||||
b.Kind = ssa.BlockIf
|
b.Kind = ssa.BlockIf
|
||||||
b.Likely = ssa.BranchUnlikely
|
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}
|
aux := &ssa.ExternSymbol{Typ: Types[TBOOL], Sym: syslook("writeBarrier").Sym}
|
||||||
flagaddr := s.newValue1A(ssa.OpAddr, Ptrto(Types[TUINT32]), aux, s.sb)
|
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 word, avoiding partial register write from load byte.
|
||||||
// Load word, test byte, avoiding partial register write from load byte.
|
|
||||||
flag := s.newValue2(ssa.OpLoad, Types[TUINT32], flagaddr, s.mem())
|
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 := s.endBlock()
|
||||||
b.Kind = ssa.BlockIf
|
b.Kind = ssa.BlockIf
|
||||||
b.Likely = ssa.BranchUnlikely
|
b.Likely = ssa.BranchUnlikely
|
||||||
|
@ -221,6 +221,7 @@ var gcphase uint32
|
|||||||
// If you change it, you must change the compiler too.
|
// If you change it, you must change the compiler too.
|
||||||
var writeBarrier struct {
|
var writeBarrier struct {
|
||||||
enabled bool // compiler emits a check of this before calling write barrier
|
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
|
needed bool // whether we need a write barrier for current GC phase
|
||||||
cgo bool // whether we need a write barrier for a cgo check
|
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
|
alignme uint64 // guarantee alignment so that compiler can use a 32 or 64-bit load
|
||||||
|
Loading…
Reference in New Issue
Block a user