diff options
| author | Michael Hudson-Doyle <michael.hudson@canonical.com> | 2015-08-03 15:45:37 +1200 |
|---|---|---|
| committer | Michael Hudson-Doyle <michael.hudson@canonical.com> | 2015-11-09 22:03:11 +0000 |
| commit | 3a9bc571b0b8c4ab4cf026d68ea3b71dec608da3 (patch) | |
| tree | af962e9b4e8ef0af74fa2db0a80a918d3f652da3 /src/cmd/internal/obj/arm64 | |
| parent | a7d331b368cb4f16db7bc1919a82af878e382ba4 (diff) | |
| download | go-3a9bc571b0b8c4ab4cf026d68ea3b71dec608da3.tar.xz | |
cmd/internal/obj/arm64, cmd/link: use two instructions rather than three for loads from memory
Reduces size of godoc .text section by about 75k (or 1.4%).
Change-Id: I65850aa569aefbddd6cb07c6ae1addcc39cab6a5
Reviewed-on: https://go-review.googlesource.com/13993
Reviewed-by: Russ Cox <rsc@golang.org>
Diffstat (limited to 'src/cmd/internal/obj/arm64')
| -rw-r--r-- | src/cmd/internal/obj/arm64/asm7.go | 60 |
1 files changed, 37 insertions, 23 deletions
diff --git a/src/cmd/internal/obj/arm64/asm7.go b/src/cmd/internal/obj/arm64/asm7.go index 1fd8982a98..ae596cfaa4 100644 --- a/src/cmd/internal/obj/arm64/asm7.go +++ b/src/cmd/internal/obj/arm64/asm7.go @@ -260,16 +260,16 @@ var optab = []Optab{ {AMOVW, C_VCONADDR, C_NONE, C_REG, 68, 8, 0, 0, 0}, {AMOVD, C_VCON, C_NONE, C_REG, 12, 4, 0, LFROM, 0}, {AMOVD, C_VCONADDR, C_NONE, C_REG, 68, 8, 0, 0, 0}, - {AMOVB, C_REG, C_NONE, C_ADDR, 64, 12, 0, 0, 0}, - {AMOVBU, C_REG, C_NONE, C_ADDR, 64, 12, 0, 0, 0}, - {AMOVH, C_REG, C_NONE, C_ADDR, 64, 12, 0, 0, 0}, - {AMOVW, C_REG, C_NONE, C_ADDR, 64, 12, 0, 0, 0}, - {AMOVD, C_REG, C_NONE, C_ADDR, 64, 12, 0, 0, 0}, - {AMOVB, C_ADDR, C_NONE, C_REG, 65, 12, 0, 0, 0}, - {AMOVBU, C_ADDR, C_NONE, C_REG, 65, 12, 0, 0, 0}, - {AMOVH, C_ADDR, C_NONE, C_REG, 65, 12, 0, 0, 0}, - {AMOVW, C_ADDR, C_NONE, C_REG, 65, 12, 0, 0, 0}, - {AMOVD, C_ADDR, C_NONE, C_REG, 65, 12, 0, 0, 0}, + {AMOVB, C_REG, C_NONE, C_ADDR, 64, 8, 0, 0, 0}, + {AMOVBU, C_REG, C_NONE, C_ADDR, 64, 8, 0, 0, 0}, + {AMOVH, C_REG, C_NONE, C_ADDR, 64, 8, 0, 0, 0}, + {AMOVW, C_REG, C_NONE, C_ADDR, 64, 8, 0, 0, 0}, + {AMOVD, C_REG, C_NONE, C_ADDR, 64, 8, 0, 0, 0}, + {AMOVB, C_ADDR, C_NONE, C_REG, 65, 8, 0, 0, 0}, + {AMOVBU, C_ADDR, C_NONE, C_REG, 65, 8, 0, 0, 0}, + {AMOVH, C_ADDR, C_NONE, C_REG, 65, 8, 0, 0, 0}, + {AMOVW, C_ADDR, C_NONE, C_REG, 65, 8, 0, 0, 0}, + {AMOVD, C_ADDR, C_NONE, C_REG, 65, 8, 0, 0, 0}, {AMOVD, C_TLS_LE, C_NONE, C_REG, 69, 4, 0, 0, 0}, {AMOVD, C_TLS_IE, C_NONE, C_REG, 70, 8, 0, 0, 0}, {AMUL, C_REG, C_REG, C_REG, 15, 4, 0, 0, 0}, @@ -450,10 +450,10 @@ var optab = []Optab{ {AFMOVS, C_LOREG, C_NONE, C_FREG, 31, 8, 0, LFROM, 0}, {AFMOVD, C_LAUTO, C_NONE, C_FREG, 31, 8, REGSP, LFROM, 0}, {AFMOVD, C_LOREG, C_NONE, C_FREG, 31, 8, 0, LFROM, 0}, - {AFMOVS, C_FREG, C_NONE, C_ADDR, 64, 12, 0, 0, 0}, - {AFMOVS, C_ADDR, C_NONE, C_FREG, 65, 12, 0, 0, 0}, - {AFMOVD, C_FREG, C_NONE, C_ADDR, 64, 12, 0, 0, 0}, - {AFMOVD, C_ADDR, C_NONE, C_FREG, 65, 12, 0, 0, 0}, + {AFMOVS, C_FREG, C_NONE, C_ADDR, 64, 8, 0, 0, 0}, + {AFMOVS, C_ADDR, C_NONE, C_FREG, 65, 8, 0, 0, 0}, + {AFMOVD, C_FREG, C_NONE, C_ADDR, 64, 8, 0, 0, 0}, + {AFMOVD, C_ADDR, C_NONE, C_FREG, 65, 8, 0, 0, 0}, {AFADDS, C_FREG, C_NONE, C_FREG, 54, 4, 0, 0, 0}, {AFADDS, C_FREG, C_FREG, C_FREG, 54, 4, 0, 0, 0}, {AFADDS, C_FCON, C_NONE, C_FREG, 54, 4, 0, 0, 0}, @@ -2701,28 +2701,26 @@ func asmout(ctxt *obj.Link, p *obj.Prog, o *Optab, out []uint32) { o1 = ADR(0, uint32(d), uint32(p.To.Reg)) - /* reloc ops */ + /* reloc ops */ case 64: /* movT R,addr -> adrp + add + movT R, (REGTMP) */ o1 = ADR(1, 0, REGTMP) - o2 = opirr(ctxt, AADD) | REGTMP&31<<5 | REGTMP&31 + o2 = olsr12u(ctxt, int32(opstr12(ctxt, int(p.As))), 0, REGTMP, int(p.From.Reg)) rel := obj.Addrel(ctxt.Cursym) rel.Off = int32(ctxt.Pc) rel.Siz = 8 rel.Sym = p.To.Sym rel.Add = p.To.Offset - rel.Type = obj.R_ADDRARM64 - o3 = olsr12u(ctxt, int32(opstr12(ctxt, int(p.As))), 0, REGTMP, int(p.From.Reg)) + rel.Type = movereloc(p.As) - case 65: /* movT addr,R -> adrp + add + movT (REGTMP), R */ + case 65: /* movT addr,R -> adrp REGTMP, 0; ldr R, [REGTMP, #0] + relocs */ o1 = ADR(1, 0, REGTMP) - o2 = opirr(ctxt, AADD) | REGTMP&31<<5 | REGTMP&31 + o2 = olsr12u(ctxt, int32(opldr12(ctxt, int(p.As))), 0, REGTMP, int(p.To.Reg)) rel := obj.Addrel(ctxt.Cursym) rel.Off = int32(ctxt.Pc) - rel.Siz = 8 rel.Sym = p.From.Sym rel.Add = p.From.Offset - rel.Type = obj.R_ADDRARM64 - o3 = olsr12u(ctxt, int32(opldr12(ctxt, int(p.As))), 0, REGTMP, int(p.To.Reg)) + rel.Siz = 8 + rel.Type = movereloc(p.As) case 66: /* ldp O(R)!, (r1, r2); ldp (R)O!, (r1, r2) */ v := int32(p.From.Offset) @@ -4161,3 +4159,19 @@ func movesize(a int) int { return -1 } } + +func movereloc(a int16) int32 { + switch movesize(int(a)) { + case 0: + return obj.R_ARM64_LOAD8 + case 1: + return obj.R_ARM64_LOAD16 + case 2: + return obj.R_ARM64_LOAD32 + case 3: + return obj.R_ARM64_LOAD64 + case -1: + panic("xxx") + } + return -1 +} |
