aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/asm/internal
diff options
context:
space:
mode:
authorLynn Boger <laboger@linux.vnet.ibm.com>2018-10-23 12:33:56 -0400
committerLynn Boger <laboger@linux.vnet.ibm.com>2018-10-23 20:37:29 +0000
commitbdba55653fa56eb119099a3efbff187a97e8cf44 (patch)
tree5113a6f1bee611bc8b25d7083942a1799e31eff2 /src/cmd/asm/internal
parente41fbc79ccfedc5bf4d07356c20de0731bd9cfd9 (diff)
downloadgo-bdba55653fa56eb119099a3efbff187a97e8cf44.tar.xz
cmd/asm/internal,cmd/internal/obj/ppc64: add alignment directive to asm for ppc64x
This adds support for an alignment directive that can be used within Go asm to indicate preferred code alignment for ppc64x. This is intended to be used with loops to improve performance. This change only adds the directive and aligns the code based on it. Follow up changes will modify asm functions for ppc64x that benefit from preferred alignment. Fixes #14935 Here is one example of the improvement in memmove when the directive is used on the loops in the code: Memmove/64 8.74ns ± 0% 8.64ns ± 0% -1.19% (p=0.000 n=8+8) Memmove/128 11.5ns ± 0% 11.0ns ± 0% -4.35% (p=0.000 n=8+8) Memmove/256 23.0ns ± 0% 15.3ns ± 0% -33.48% (p=0.000 n=8+8) Memmove/512 31.7ns ± 0% 31.8ns ± 0% +0.32% (p=0.000 n=8+8) Memmove/1024 52.3ns ± 0% 43.9ns ± 0% -16.10% (p=0.000 n=8+8) Memmove/2048 93.2ns ± 0% 76.2ns ± 0% -18.24% (p=0.000 n=8+8) Memmove/4096 174ns ± 0% 141ns ± 0% -18.97% (p=0.000 n=8+8) Change-Id: I200d77e923dd5d78c22fe3f8eb142a8fbaff57bf Reviewed-on: https://go-review.googlesource.com/c/144218 Run-TryBot: Lynn Boger <laboger@linux.vnet.ibm.com> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: David Chase <drchase@google.com>
Diffstat (limited to 'src/cmd/asm/internal')
-rw-r--r--src/cmd/asm/internal/asm/asm.go22
-rw-r--r--src/cmd/asm/internal/asm/parse.go2
2 files changed, 24 insertions, 0 deletions
diff --git a/src/cmd/asm/internal/asm/asm.go b/src/cmd/asm/internal/asm/asm.go
index 627be09d08..5da64f135a 100644
--- a/src/cmd/asm/internal/asm/asm.go
+++ b/src/cmd/asm/internal/asm/asm.go
@@ -308,6 +308,28 @@ func (p *Parser) asmPCData(operands [][]lex.Token) {
p.append(prog, "", true)
}
+// asmPCAlign assembles a PCALIGN pseudo-op.
+// PCALIGN $16
+func (p *Parser) asmPCAlign(operands [][]lex.Token) {
+ if len(operands) != 1 {
+ p.errorf("expect one operand for PCALIGN")
+ return
+ }
+
+ // Operand 0 must be an immediate constant.
+ key := p.address(operands[0])
+ if !p.validImmediate("PCALIGN", &key) {
+ return
+ }
+
+ prog := &obj.Prog{
+ Ctxt: p.ctxt,
+ As: obj.APCALIGN,
+ From: key,
+ }
+ p.append(prog, "", true)
+}
+
// asmFuncData assembles a FUNCDATA pseudo-op.
// FUNCDATA $1, funcdata<>+4(SB)
func (p *Parser) asmFuncData(operands [][]lex.Token) {
diff --git a/src/cmd/asm/internal/asm/parse.go b/src/cmd/asm/internal/asm/parse.go
index 48749b7874..e77db9fba1 100644
--- a/src/cmd/asm/internal/asm/parse.go
+++ b/src/cmd/asm/internal/asm/parse.go
@@ -227,6 +227,8 @@ func (p *Parser) pseudo(word string, operands [][]lex.Token) bool {
p.asmGlobl(operands)
case "PCDATA":
p.asmPCData(operands)
+ case "PCALIGN":
+ p.asmPCAlign(operands)
case "TEXT":
p.asmText(operands)
default: