mirror of
https://github.com/golang/go
synced 2024-11-26 03:57:57 -07:00
cmd/compile: use ADDQ instead of LEAQ when we can
The address calculations in the example end up doing x << 4 + y + 0. Before this CL we use a SHLQ+LEAQ. Since the constant offset is 0, we can use SHLQ+ADDQ instead. Change-Id: Ia048c4fdbb3a42121c7e1ab707961062e8247fca Reviewed-on: https://go-review.googlesource.com/c/go/+/209959 Run-TryBot: Keith Randall <khr@golang.org> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Cherry Zhang <cherryyz@google.com>
This commit is contained in:
parent
4f074b58d2
commit
1cfe8e91b6
@ -1513,6 +1513,9 @@
|
||||
(TESTWconst [-1] x) && x.Op != OpAMD64MOVLconst -> (TESTW x x)
|
||||
(TESTBconst [-1] x) && x.Op != OpAMD64MOVLconst -> (TESTB x x)
|
||||
|
||||
// Convert LEAQ1 back to ADDQ if we can
|
||||
(LEAQ1 [0] x y) && v.Aux == nil -> (ADDQ x y)
|
||||
|
||||
// Combining byte loads into larger (unaligned) loads.
|
||||
// There are many ways these combinations could occur. This is
|
||||
// designed to match the way encoding/binary.LittleEndian does it.
|
||||
|
@ -9829,6 +9829,23 @@ func rewriteValueAMD64_OpAMD64LEAQ1(v *Value) bool {
|
||||
}
|
||||
break
|
||||
}
|
||||
// match: (LEAQ1 [0] x y)
|
||||
// cond: v.Aux == nil
|
||||
// result: (ADDQ x y)
|
||||
for {
|
||||
if v.AuxInt != 0 {
|
||||
break
|
||||
}
|
||||
x := v_0
|
||||
y := v_1
|
||||
if !(v.Aux == nil) {
|
||||
break
|
||||
}
|
||||
v.reset(OpAMD64ADDQ)
|
||||
v.AddArg(x)
|
||||
v.AddArg(y)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
func rewriteValueAMD64_OpAMD64LEAQ2(v *Value) bool {
|
||||
|
14
test/codegen/addrcalc.go
Normal file
14
test/codegen/addrcalc.go
Normal file
@ -0,0 +1,14 @@
|
||||
// asmcheck
|
||||
|
||||
// Copyright 2019 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package codegen
|
||||
|
||||
// Make sure we use ADDQ instead of LEAQ when we can.
|
||||
|
||||
func f(p *[4][2]int, x int) *int {
|
||||
// amd64:"ADDQ",-"LEAQ"
|
||||
return &p[x][0]
|
||||
}
|
Loading…
Reference in New Issue
Block a user