mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: use proved bounds to remove signed division fix-ups
prove is able to find 94 occurrences in std cmd where a divisor can't have the value -1. The change removes the extraneous fix-up code for these cases. Fixes #25239 Change-Id: Ic184de971f47cc57c702eb72805b8e291c14035d Reviewed-on: https://go-review.googlesource.com/c/130215 Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Keith Randall <khr@golang.org>
This commit is contained in:
parent
47cc59f31f
commit
13d5cd7847
14 changed files with 299 additions and 98 deletions
|
|
@ -198,24 +198,31 @@ func ssaGenValue(s *gc.SSAGenState, v *ssa.Value) {
|
|||
if v.Op == ssa.Op386DIVL || v.Op == ssa.Op386DIVW ||
|
||||
v.Op == ssa.Op386MODL || v.Op == ssa.Op386MODW {
|
||||
|
||||
var c *obj.Prog
|
||||
if ssa.NeedsFixUp(v) {
|
||||
var c *obj.Prog
|
||||
switch v.Op {
|
||||
case ssa.Op386DIVL, ssa.Op386MODL:
|
||||
c = s.Prog(x86.ACMPL)
|
||||
j = s.Prog(x86.AJEQ)
|
||||
|
||||
case ssa.Op386DIVW, ssa.Op386MODW:
|
||||
c = s.Prog(x86.ACMPW)
|
||||
j = s.Prog(x86.AJEQ)
|
||||
}
|
||||
c.From.Type = obj.TYPE_REG
|
||||
c.From.Reg = x
|
||||
c.To.Type = obj.TYPE_CONST
|
||||
c.To.Offset = -1
|
||||
|
||||
j.To.Type = obj.TYPE_BRANCH
|
||||
}
|
||||
// sign extend the dividend
|
||||
switch v.Op {
|
||||
case ssa.Op386DIVL, ssa.Op386MODL:
|
||||
c = s.Prog(x86.ACMPL)
|
||||
j = s.Prog(x86.AJEQ)
|
||||
s.Prog(x86.ACDQ) //TODO: fix
|
||||
|
||||
s.Prog(x86.ACDQ)
|
||||
case ssa.Op386DIVW, ssa.Op386MODW:
|
||||
c = s.Prog(x86.ACMPW)
|
||||
j = s.Prog(x86.AJEQ)
|
||||
s.Prog(x86.ACWD)
|
||||
}
|
||||
c.From.Type = obj.TYPE_REG
|
||||
c.From.Reg = x
|
||||
c.To.Type = obj.TYPE_CONST
|
||||
c.To.Offset = -1
|
||||
|
||||
j.To.Type = obj.TYPE_BRANCH
|
||||
}
|
||||
|
||||
// for unsigned ints, we sign extend by setting DX = 0
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue