mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: avoid zero extension after properly typed atomic operation on riscv64
LoweredAtomicLoad8 is implemented using MOVBU, hence it is already zero extended. LoweredAtomicCas32 and LoweredAtomicCas64 return a properly typed boolean. Change-Id: Ie0acbaa19403d59c7e5f76d060cc13ee51eb7834 Reviewed-on: https://go-review.googlesource.com/c/go/+/428214 Reviewed-by: Cherry Mui <cherryyz@google.com> Reviewed-by: Michael Knyszek <mknyszek@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Joel Sing <joel@sing.id.au>
This commit is contained in:
parent
c011270fa5
commit
b6a6847b2f
2 changed files with 50 additions and 0 deletions
|
|
@ -686,6 +686,11 @@
|
||||||
(MOVWUreg x:(MOVHUload _ _)) => (MOVDreg x)
|
(MOVWUreg x:(MOVHUload _ _)) => (MOVDreg x)
|
||||||
(MOVWUreg x:(MOVWUload _ _)) => (MOVDreg x)
|
(MOVWUreg x:(MOVWUload _ _)) => (MOVDreg x)
|
||||||
|
|
||||||
|
// Avoid zero extension after properly typed atomic operation.
|
||||||
|
(MOVBUreg x:(Select0 (LoweredAtomicLoad8 _ _))) => (MOVDreg x)
|
||||||
|
(MOVBUreg x:(Select0 (LoweredAtomicCas32 _ _ _ _))) => (MOVDreg x)
|
||||||
|
(MOVBUreg x:(Select0 (LoweredAtomicCas64 _ _ _ _))) => (MOVDreg x)
|
||||||
|
|
||||||
// Fold double extensions.
|
// Fold double extensions.
|
||||||
(MOVBreg x:(MOVBreg _)) => (MOVDreg x)
|
(MOVBreg x:(MOVBreg _)) => (MOVDreg x)
|
||||||
(MOVHreg x:(MOVBreg _)) => (MOVDreg x)
|
(MOVHreg x:(MOVBreg _)) => (MOVDreg x)
|
||||||
|
|
|
||||||
|
|
@ -3609,6 +3609,51 @@ func rewriteValueRISCV64_OpRISCV64MOVBUreg(v *Value) bool {
|
||||||
v.AddArg(x)
|
v.AddArg(x)
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
// match: (MOVBUreg x:(Select0 (LoweredAtomicLoad8 _ _)))
|
||||||
|
// result: (MOVDreg x)
|
||||||
|
for {
|
||||||
|
x := v_0
|
||||||
|
if x.Op != OpSelect0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
x_0 := x.Args[0]
|
||||||
|
if x_0.Op != OpRISCV64LoweredAtomicLoad8 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
v.reset(OpRISCV64MOVDreg)
|
||||||
|
v.AddArg(x)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
// match: (MOVBUreg x:(Select0 (LoweredAtomicCas32 _ _ _ _)))
|
||||||
|
// result: (MOVDreg x)
|
||||||
|
for {
|
||||||
|
x := v_0
|
||||||
|
if x.Op != OpSelect0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
x_0 := x.Args[0]
|
||||||
|
if x_0.Op != OpRISCV64LoweredAtomicCas32 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
v.reset(OpRISCV64MOVDreg)
|
||||||
|
v.AddArg(x)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
// match: (MOVBUreg x:(Select0 (LoweredAtomicCas64 _ _ _ _)))
|
||||||
|
// result: (MOVDreg x)
|
||||||
|
for {
|
||||||
|
x := v_0
|
||||||
|
if x.Op != OpSelect0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
x_0 := x.Args[0]
|
||||||
|
if x_0.Op != OpRISCV64LoweredAtomicCas64 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
v.reset(OpRISCV64MOVDreg)
|
||||||
|
v.AddArg(x)
|
||||||
|
return true
|
||||||
|
}
|
||||||
// match: (MOVBUreg x:(MOVBUreg _))
|
// match: (MOVBUreg x:(MOVBUreg _))
|
||||||
// result: (MOVDreg x)
|
// result: (MOVDreg x)
|
||||||
for {
|
for {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue