aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/internal/obj/arm64
diff options
context:
space:
mode:
authorMichael Hudson-Doyle <michael.hudson@canonical.com>2015-08-03 15:45:37 +1200
committerMichael Hudson-Doyle <michael.hudson@canonical.com>2015-11-09 22:03:11 +0000
commit3a9bc571b0b8c4ab4cf026d68ea3b71dec608da3 (patch)
treeaf962e9b4e8ef0af74fa2db0a80a918d3f652da3 /src/cmd/internal/obj/arm64
parenta7d331b368cb4f16db7bc1919a82af878e382ba4 (diff)
downloadgo-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.go60
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
+}