diff options
| author | isharipo <iskander.sharipov@intel.com> | 2017-09-13 14:32:08 +0300 |
|---|---|---|
| committer | Matthew Dempsky <mdempsky@google.com> | 2017-09-15 21:05:03 +0000 |
| commit | 8c67f210a181f4d3e003e46e544ae03ce231ca42 (patch) | |
| tree | 537c869a16a02ed96ed005b345aeeec040080686 /src/cmd/internal/obj/arm | |
| parent | e1cf2be7a82a2421c69c48cbdf596841f29bff77 (diff) | |
| download | go-8c67f210a181f4d3e003e46e544ae03ce231ca42.tar.xz | |
cmd/internal/obj: change Prog.From3 to RestArgs ([]Addr)
This change makes it easier to express instructions
with arbitrary number of operands.
Rationale: previous approach with operand "hiding" does
not scale well, AVX and especially AVX512 have many
instructions with 3+ operands.
x86 asm backend is updated to handle up to 6 explicit operands.
It also fixes issue with 4-th immediate operand type checks.
All `ytab` tables are updated accordingly.
Changes to non-x86 backends only include these patterns:
`p.From3 = X` => `p.SetFrom3(X)`
`p.From3.X = Y` => `p.GetFrom3().X = Y`
Over time, other backends can adapt Prog.RestArgs
and reduce the amount of workarounds.
-- Performance --
x/benchmark/build:
$ benchstat upstream.bench patched.bench
name old time/op new time/op delta
Build-48 21.7s ± 2% 21.8s ± 2% ~ (p=0.218 n=10+10)
name old binary-size new binary-size delta
Build-48 10.3M ± 0% 10.3M ± 0% ~ (all equal)
name old build-time/op new build-time/op delta
Build-48 21.7s ± 2% 21.8s ± 2% ~ (p=0.218 n=10+10)
name old build-peak-RSS-bytes new build-peak-RSS-bytes delta
Build-48 145MB ± 5% 148MB ± 5% ~ (p=0.218 n=10+10)
name old build-user+sys-time/op new build-user+sys-time/op delta
Build-48 21.0s ± 2% 21.2s ± 2% ~ (p=0.075 n=10+10)
Microbenchmark shows a slight slowdown.
name old time/op new time/op delta
AMD64asm-4 49.5ms ± 1% 49.9ms ± 1% +0.67% (p=0.001 n=23+15)
func BenchmarkAMD64asm(b *testing.B) {
for i := 0; i < b.N; i++ {
TestAMD64EndToEnd(nil)
TestAMD64Encoder(nil)
}
}
Change-Id: I4f1d37b5c2c966da3f2127705ccac9bff0038183
Reviewed-on: https://go-review.googlesource.com/63490
Run-TryBot: Iskander Sharipov <iskander.sharipov@intel.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Matthew Dempsky <mdempsky@google.com>
Diffstat (limited to 'src/cmd/internal/obj/arm')
| -rw-r--r-- | src/cmd/internal/obj/arm/asm5.go | 8 | ||||
| -rw-r--r-- | src/cmd/internal/obj/arm/obj5.go | 2 |
2 files changed, 5 insertions, 5 deletions
diff --git a/src/cmd/internal/obj/arm/asm5.go b/src/cmd/internal/obj/arm/asm5.go index 98b45feb60..479005f294 100644 --- a/src/cmd/internal/obj/arm/asm5.go +++ b/src/cmd/internal/obj/arm/asm5.go @@ -2068,11 +2068,11 @@ func (c *ctxt5) asmout(p *obj.Prog, o *Optab, out []uint32) { if r == 0 { r = rt } - if p.From3 == nil || p.From3.Type != obj.TYPE_CONST { + if p.GetFrom3() == nil || p.GetFrom3().Type != obj.TYPE_CONST { c.ctxt.Diag("%v: missing or wrong LSB", p) break } - lsb := p.From3.Offset + lsb := p.GetFrom3().Offset width := p.From.Offset if lsb < 0 || lsb > 31 || width <= 0 || (lsb+width) > 31 { c.ctxt.Diag("%v: wrong width or LSB", p) @@ -3310,8 +3310,8 @@ func (c *ctxt5) chipfloat5(e float64) int { func nocache(p *obj.Prog) { p.Optab = 0 p.From.Class = 0 - if p.From3 != nil { - p.From3.Class = 0 + if p.GetFrom3() != nil { + p.GetFrom3().Class = 0 } p.To.Class = 0 } diff --git a/src/cmd/internal/obj/arm/obj5.go b/src/cmd/internal/obj/arm/obj5.go index 32c4643166..59f044ec9d 100644 --- a/src/cmd/internal/obj/arm/obj5.go +++ b/src/cmd/internal/obj/arm/obj5.go @@ -186,7 +186,7 @@ func (c *ctxt5) rewriteToUseGot(p *obj.Prog) { p.From.Offset = 0 } } - if p.From3 != nil && p.From3.Name == obj.NAME_EXTERN { + if p.GetFrom3() != nil && p.GetFrom3().Name == obj.NAME_EXTERN { c.ctxt.Diag("don't know how to handle %v with -dynlink", p) } var source *obj.Addr |
