]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: use ADDQ instead of LEAQ when we can
authorKeith Randall <khr@golang.org>
Sat, 30 Nov 2019 22:04:35 +0000 (14:04 -0800)
committerKeith Randall <khr@golang.org>
Mon, 24 Feb 2020 21:33:53 +0000 (21:33 +0000)
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>
src/cmd/compile/internal/ssa/gen/AMD64.rules
src/cmd/compile/internal/ssa/rewriteAMD64.go
test/codegen/addrcalc.go [new file with mode: 0644]

index 47194c08534a58f7a239f71b56733e5b092c25ea..491d6795b44f09d7a0725011500f7614d1a2b36c 100644 (file)
 (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.
index df9f0d0f345ee0febce7e342578f0358039ab2fe..40e7091fe188117deb884551e173fa446c22f04c 100644 (file)
@@ -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 {
diff --git a/test/codegen/addrcalc.go b/test/codegen/addrcalc.go
new file mode 100644 (file)
index 0000000..45552d2
--- /dev/null
@@ -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]
+}