Commit 24dc8c6c authored by Vladimir Stefanovic's avatar Vladimir Stefanovic Committed by Cherry Zhang

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/38257
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: default avatarCherry Zhang <cherryyz@google.com>
parent 23bd9191
...@@ -406,8 +406,7 @@ ...@@ -406,8 +406,7 @@
(ANDconst <types.UInt32> [3] ptr))) (ANDconst <types.UInt32> [3] ptr)))
(NORconst [0] <types.UInt32> (SLL <types.UInt32> (NORconst [0] <types.UInt32> (SLL <types.UInt32>
(MOVWconst [0xff]) (SLLconst <types.UInt32> [3] (MOVWconst [0xff]) (SLLconst <types.UInt32> [3]
(ANDconst <types.UInt32> [3] (ANDconst <types.UInt32> [3] ptr))))) mem)
(XORconst <types.UInt32> [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 ->
......
...@@ -688,7 +688,7 @@ func rewriteValueMIPS_OpAtomicAnd8(v *Value) bool { ...@@ -688,7 +688,7 @@ func rewriteValueMIPS_OpAtomicAnd8(v *Value) bool {
_ = types _ = types
// match: (AtomicAnd8 ptr val mem) // match: (AtomicAnd8 ptr val mem)
// cond: !config.BigEndian // cond: !config.BigEndian
// result: (LoweredAtomicAnd (AND <types.UInt32Ptr> (MOVWconst [^3]) ptr) (OR <types.UInt32> (SLL <types.UInt32> (ZeroExt8to32 val) (SLLconst <types.UInt32> [3] (ANDconst <types.UInt32> [3] ptr))) (NORconst [0] <types.UInt32> (SLL <types.UInt32> (MOVWconst [0xff]) (SLLconst <types.UInt32> [3] (ANDconst <types.UInt32> [3] (XORconst <types.UInt32> [3] ptr)))))) mem) // result: (LoweredAtomicAnd (AND <types.UInt32Ptr> (MOVWconst [^3]) ptr) (OR <types.UInt32> (SLL <types.UInt32> (ZeroExt8to32 val) (SLLconst <types.UInt32> [3] (ANDconst <types.UInt32> [3] ptr))) (NORconst [0] <types.UInt32> (SLL <types.UInt32> (MOVWconst [0xff]) (SLLconst <types.UInt32> [3] (ANDconst <types.UInt32> [3] ptr))))) mem)
for { for {
ptr := v.Args[0] ptr := v.Args[0]
val := v.Args[1] val := v.Args[1]
...@@ -726,10 +726,7 @@ func rewriteValueMIPS_OpAtomicAnd8(v *Value) bool { ...@@ -726,10 +726,7 @@ func rewriteValueMIPS_OpAtomicAnd8(v *Value) bool {
v10.AuxInt = 3 v10.AuxInt = 3
v11 := b.NewValue0(v.Pos, OpMIPSANDconst, types.UInt32) v11 := b.NewValue0(v.Pos, OpMIPSANDconst, types.UInt32)
v11.AuxInt = 3 v11.AuxInt = 3
v12 := b.NewValue0(v.Pos, OpMIPSXORconst, types.UInt32) 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)
......
...@@ -259,6 +259,12 @@ func check() { ...@@ -259,6 +259,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")
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment