aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDave Cheney <dave@cheney.net>2015-04-09 21:25:48 +1000
committerDave Cheney <dave@cheney.net>2015-04-15 12:26:24 +0000
commit888d44d3c16147019bb5a667b40bc68ecf4e7ba3 (patch)
treebb1dd49cb61e6c87200239df3dd14cdde56839e1 /src
parent47515e01167268ca2b844e9b13cd47f7c2a613d8 (diff)
downloadgo-888d44d3c16147019bb5a667b40bc68ecf4e7ba3.tar.xz
cmd/internal/gc, cmd/7g: use zero register in Componentgen
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>
Diffstat (limited to 'src')
-rw-r--r--src/cmd/7g/galign.go1
-rw-r--r--src/cmd/internal/gc/gen.go16
-rw-r--r--src/cmd/internal/gc/go.go1
3 files changed, 13 insertions, 5 deletions
diff --git a/src/cmd/7g/galign.go b/src/cmd/7g/galign.go
index c21cb67fab..3ad786a8fd 100644
--- a/src/cmd/7g/galign.go
+++ b/src/cmd/7g/galign.go
@@ -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
diff --git a/src/cmd/internal/gc/gen.go b/src/cmd/internal/gc/gen.go
index fde0a196b7..e95ddeb29f 100644
--- a/src/cmd/internal/gc/gen.go
+++ b/src/cmd/internal/gc/gen.go
@@ -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.
diff --git a/src/cmd/internal/gc/go.go b/src/cmd/internal/gc/go.go
index 5803f39ec2..25ada5524d 100644
--- a/src/cmd/internal/gc/go.go
+++ b/src/cmd/internal/gc/go.go
@@ -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