]> Cypherpunks repositories - gostls13.git/commit
cmd/internal/obj: ARM, use immediates instead of constant pool entries
authorKeith Randall <khr@golang.org>
Mon, 24 Apr 2017 20:48:35 +0000 (13:48 -0700)
committerKeith Randall <khr@golang.org>
Thu, 27 Apr 2017 16:45:01 +0000 (16:45 +0000)
commit14f3ca56eda1120cb9f25f05f7fbf705d2bb0dc3
treed7740115a87500cb3c748e55353c4122ea8ff11d
parentc120e449fbc618f9510387d718de0cef5f73af3a
cmd/internal/obj: ARM, use immediates instead of constant pool entries

When a constant doesn't fit in a single instruction, use two
paired instructions instead of the constant pool.  For example

  ADD $0xaa00bb, R0, R1

Used to rewrite to:

  MOV ?(IP), R11
  ADD R11, R0, R1

Instead, do:

  ADD $0xaa0000, R0, R1
  ADD $0xbb, R1, R1

Same number of instructions.
Good:
  4 less bytes (no constant pool entry)
  One less load.
Bad:
  Critical path is one instruction longer.

It's probably worth it to avoid the loads, they are expensive.

Dave Cheney got us some performance numbers: https://perf.golang.org/search?q=upload:20170426.1
TL;DR mean 1.37% improvement.

Change-Id: Ib206836161fdc94a3962db6f9caa635c87d57cf1
Reviewed-on: https://go-review.googlesource.com/41612
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
src/cmd/internal/obj/arm/a.out.go
src/cmd/internal/obj/arm/anames5.go
src/cmd/internal/obj/arm/asm5.go
test/armimm.go [new file with mode: 0644]