mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/internal/obj/x86: move MOV->XOR rewriting into compiler
Fixes #20986. Change-Id: Ic3cf5c0ab260f259ecff7b92cfdf5f4ae432aef3 Reviewed-on: https://go-review.googlesource.com/73072 Run-TryBot: Matthew Dempsky <mdempsky@google.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Austin Clements <austin@google.com>
This commit is contained in:
parent
73f1a1a1a7
commit
a5868a47c6
5 changed files with 28 additions and 30 deletions
|
|
@ -426,16 +426,23 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
|||
p.To.Reg = v.Args[0].Reg()
|
||||
case ssa.Op386MOVLconst:
|
||||
x := v.Reg()
|
||||
|
||||
// If flags aren't live (indicated by v.Aux == nil),
|
||||
// then we can rewrite MOV $0, AX into XOR AX, AX.
|
||||
if v.AuxInt == 0 && v.Aux == nil {
|
||||
p := s.Prog(x86.AXORL)
|
||||
p.From.Type = obj.TYPE_REG
|
||||
p.From.Reg = x
|
||||
p.To.Type = obj.TYPE_REG
|
||||
p.To.Reg = x
|
||||
break
|
||||
}
|
||||
|
||||
p := s.Prog(v.Op.Asm())
|
||||
p.From.Type = obj.TYPE_CONST
|
||||
p.From.Offset = v.AuxInt
|
||||
p.To.Type = obj.TYPE_REG
|
||||
p.To.Reg = x
|
||||
// If flags are live at this instruction, suppress the
|
||||
// MOV $0,AX -> XOR AX,AX optimization.
|
||||
if v.Aux != nil {
|
||||
p.Mark |= x86.PRESERVEFLAGS
|
||||
}
|
||||
case ssa.Op386MOVSSconst, ssa.Op386MOVSDconst:
|
||||
x := v.Reg()
|
||||
p := s.Prog(v.Op.Asm())
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue