mirror of https://github.com/golang/go.git
[release-branch.go1.8] cmd/compile,runtime: fix atomic And8 for mipsle
Removing stray xori that came from big endian copy/paste. Adding atomicand8 check to runtime.check() that would have revealed this error. Might fix #19396. Change-Id: If8d6f25d3e205496163541eb112548aa66df9c2a Reviewed-on: https://go-review.googlesource.com/39597 Run-TryBot: Austin Clements <austin@google.com> Reviewed-by: Cherry Zhang <cherryyz@google.com>
This commit is contained in:
parent
bf71119d54
commit
77476e81d9
|
|
@ -404,8 +404,7 @@
|
||||||
(ANDconst <config.fe.TypeUInt32()> [3] ptr)))
|
(ANDconst <config.fe.TypeUInt32()> [3] ptr)))
|
||||||
(NORconst [0] <config.fe.TypeUInt32()> (SLL <config.fe.TypeUInt32()>
|
(NORconst [0] <config.fe.TypeUInt32()> (SLL <config.fe.TypeUInt32()>
|
||||||
(MOVWconst [0xff]) (SLLconst <config.fe.TypeUInt32()> [3]
|
(MOVWconst [0xff]) (SLLconst <config.fe.TypeUInt32()> [3]
|
||||||
(ANDconst <config.fe.TypeUInt32()> [3]
|
(ANDconst <config.fe.TypeUInt32()> [3] ptr))))) mem)
|
||||||
(XORconst <config.fe.TypeUInt32()> [3] ptr)))))) mem)
|
|
||||||
|
|
||||||
// AtomicOr8(ptr,val) -> LoweredAtomicOr(ptr&^3,uint32(val) << (((ptr^3) & 3) * 8))
|
// AtomicOr8(ptr,val) -> LoweredAtomicOr(ptr&^3,uint32(val) << (((ptr^3) & 3) * 8))
|
||||||
(AtomicOr8 ptr val mem) && config.BigEndian ->
|
(AtomicOr8 ptr val mem) && config.BigEndian ->
|
||||||
|
|
|
||||||
|
|
@ -712,7 +712,7 @@ func rewriteValueMIPS_OpAtomicAnd8(v *Value, config *Config) bool {
|
||||||
_ = b
|
_ = b
|
||||||
// match: (AtomicAnd8 ptr val mem)
|
// match: (AtomicAnd8 ptr val mem)
|
||||||
// cond: !config.BigEndian
|
// cond: !config.BigEndian
|
||||||
// result: (LoweredAtomicAnd (AND <config.fe.TypeUInt32().PtrTo()> (MOVWconst [^3]) ptr) (OR <config.fe.TypeUInt32()> (SLL <config.fe.TypeUInt32()> (ZeroExt8to32 val) (SLLconst <config.fe.TypeUInt32()> [3] (ANDconst <config.fe.TypeUInt32()> [3] ptr))) (NORconst [0] <config.fe.TypeUInt32()> (SLL <config.fe.TypeUInt32()> (MOVWconst [0xff]) (SLLconst <config.fe.TypeUInt32()> [3] (ANDconst <config.fe.TypeUInt32()> [3] (XORconst <config.fe.TypeUInt32()> [3] ptr)))))) mem)
|
// result: (LoweredAtomicAnd (AND <config.fe.TypeUInt32().PtrTo()> (MOVWconst [^3]) ptr) (OR <config.fe.TypeUInt32()> (SLL <config.fe.TypeUInt32()> (ZeroExt8to32 val) (SLLconst <config.fe.TypeUInt32()> [3] (ANDconst <config.fe.TypeUInt32()> [3] ptr))) (NORconst [0] <config.fe.TypeUInt32()> (SLL <config.fe.TypeUInt32()> (MOVWconst [0xff]) (SLLconst <config.fe.TypeUInt32()> [3] (ANDconst <config.fe.TypeUInt32()> [3] ptr))))) mem)
|
||||||
for {
|
for {
|
||||||
ptr := v.Args[0]
|
ptr := v.Args[0]
|
||||||
val := v.Args[1]
|
val := v.Args[1]
|
||||||
|
|
@ -750,10 +750,7 @@ func rewriteValueMIPS_OpAtomicAnd8(v *Value, config *Config) bool {
|
||||||
v10.AuxInt = 3
|
v10.AuxInt = 3
|
||||||
v11 := b.NewValue0(v.Line, OpMIPSANDconst, config.fe.TypeUInt32())
|
v11 := b.NewValue0(v.Line, OpMIPSANDconst, config.fe.TypeUInt32())
|
||||||
v11.AuxInt = 3
|
v11.AuxInt = 3
|
||||||
v12 := b.NewValue0(v.Line, OpMIPSXORconst, config.fe.TypeUInt32())
|
v11.AddArg(ptr)
|
||||||
v12.AuxInt = 3
|
|
||||||
v12.AddArg(ptr)
|
|
||||||
v11.AddArg(v12)
|
|
||||||
v10.AddArg(v11)
|
v10.AddArg(v11)
|
||||||
v8.AddArg(v10)
|
v8.AddArg(v10)
|
||||||
v7.AddArg(v8)
|
v7.AddArg(v8)
|
||||||
|
|
|
||||||
|
|
@ -260,6 +260,12 @@ func check() {
|
||||||
throw("atomicor8")
|
throw("atomicor8")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
m = [4]byte{0xff, 0xff, 0xff, 0xff}
|
||||||
|
atomic.And8(&m[1], 0x1)
|
||||||
|
if m[0] != 0xff || m[1] != 0x1 || m[2] != 0xff || m[3] != 0xff {
|
||||||
|
throw("atomicand8")
|
||||||
|
}
|
||||||
|
|
||||||
*(*uint64)(unsafe.Pointer(&j)) = ^uint64(0)
|
*(*uint64)(unsafe.Pointer(&j)) = ^uint64(0)
|
||||||
if j == j {
|
if j == j {
|
||||||
throw("float64nan")
|
throw("float64nan")
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue