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>
diff --git a/src/cmd/internal/gc/gen.go b/src/cmd/internal/gc/gen.go
index fde0a19..e95ddeb 100644
--- a/src/cmd/internal/gc/gen.go
+++ b/src/cmd/internal/gc/gen.go
@@ -1183,12 +1183,18 @@
}
} 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.