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:(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.
|
||||
(MOVBreg x:(MOVBreg _)) => (MOVDreg x)
|
||||
(MOVHreg x:(MOVBreg _)) => (MOVDreg x)
|
||||
|
|
|
|||
|
|
@ -3609,6 +3609,51 @@ func rewriteValueRISCV64_OpRISCV64MOVBUreg(v *Value) bool {
|
|||
v.AddArg(x)
|
||||
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 _))
|
||||
// result: (MOVDreg x)
|
||||
for {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue