]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/internal/gc, cmd/7g: use zero register in Componentgen
authorDave Cheney <dave@cheney.net>
Thu, 9 Apr 2015 11:25:48 +0000 (21:25 +1000)
committerDave Cheney <dave@cheney.net>
Wed, 15 Apr 2015 12:26:24 +0000 (12:26 +0000)
Fixes #9855

Use an architectural zero register as the source for zeroing, if available.

Change-Id: Ie5b4ba4e3d356c6f892bfd1cebd14d5152bdeeb0
Reviewed-on: https://go-review.googlesource.com/8722
Reviewed-by: Keith Randall <khr@golang.org>
src/cmd/7g/galign.go
src/cmd/internal/gc/gen.go
src/cmd/internal/gc/go.go

index c21cb67fab892fb543fc9cb501e908451e615ab3..3ad786a8fd4bf28c2f8b9c12fb1ee7baebaa77a9 100644 (file)
@@ -49,6 +49,7 @@ func main() {
        gc.Thearch.REGRETURN = arm64.REG_R0
        gc.Thearch.REGMIN = arm64.REG_R0
        gc.Thearch.REGMAX = arm64.REG_R31
+       gc.Thearch.REGZERO = arm64.REGZERO
        gc.Thearch.FREGMIN = arm64.REG_F0
        gc.Thearch.FREGMAX = arm64.REG_F31
        gc.Thearch.MAXWIDTH = MAXWIDTH
index fde0a196b713fd2d2439057915c89604a19038d0..e95ddeb29f8c1a1b0cbec20aa45e4a12f30d0035 100644 (file)
@@ -1183,12 +1183,18 @@ func Componentgen(nr *Node, nl *Node) bool {
                }
        } else {
                // When zeroing, prepare a register containing zero.
-               var tmp Node
-               Nodconst(&tmp, nl.Type, 0)
+               if Thearch.REGZERO != 0 {
+                       // cpu has a dedicated zero register
+                       Nodreg(&nodr, Types[TUINT], Thearch.REGZERO)
+               } else {
+                       // no dedicated zero register
+                       var tmp Node
+                       Nodconst(&tmp, nl.Type, 0)
 
-               Regalloc(&nodr, Types[TUINT], nil)
-               Thearch.Gmove(&tmp, &nodr)
-               defer Regfree(&nodr)
+                       Regalloc(&nodr, Types[TUINT], nil)
+                       Thearch.Gmove(&tmp, &nodr)
+                       defer Regfree(&nodr)
+               }
        }
 
        // nl and nr are 'cadable' which basically means they are names (variables) now.
index 5803f39ec262bccefe9a10246c844e8b5cd787c4..25ada5524d6b4f5bb33ce4457f30249d6c57866b 100644 (file)
@@ -769,6 +769,7 @@ type Arch struct {
        REGRETURN    int // AX
        REGMIN       int
        REGMAX       int
+       REGZERO      int // architectural zero register, if available
        FREGMIN      int
        FREGMAX      int
        MAXWIDTH     int64