go/src
erifan01 159b2de442 cmd/compile: optimize math/bits.Div32 for arm64
Benchmark:
name     old time/op  new time/op  delta
Div-8    22.0ns ± 0%  22.0ns ± 0%     ~     (all equal)
Div32-8  6.51ns ± 0%  3.00ns ± 0%  -53.90%  (p=0.000 n=10+8)
Div64-8  22.5ns ± 0%  22.5ns ± 0%     ~     (all equal)

Code:
func div32(hi, lo, y uint32) (q, r uint32) {return bits.Div32(hi, lo, y)}

Before:
        0x0020 00032 (test.go:24)       MOVWU   "".y+8(FP), R0
        0x0024 00036 ($GOROOT/src/math/bits/bits.go:472)        CBZW    R0, 132
        0x0028 00040 ($GOROOT/src/math/bits/bits.go:472)        MOVWU   "".hi(FP), R1
        0x002c 00044 ($GOROOT/src/math/bits/bits.go:472)        CMPW    R1, R0
        0x0030 00048 ($GOROOT/src/math/bits/bits.go:472)        BLS     96
        0x0034 00052 ($GOROOT/src/math/bits/bits.go:475)        MOVWU   "".lo+4(FP), R2
        0x0038 00056 ($GOROOT/src/math/bits/bits.go:475)        ORR     R1<<32, R2, R1
        0x003c 00060 ($GOROOT/src/math/bits/bits.go:476)        CBZ     R0, 140
        0x0040 00064 ($GOROOT/src/math/bits/bits.go:476)        UDIV    R0, R1, R2
        0x0044 00068 (test.go:24)       MOVW    R2, "".q+16(FP)
        0x0048 00072 ($GOROOT/src/math/bits/bits.go:476)        UREM    R0, R1, R0
        0x0050 00080 (test.go:24)       MOVW    R0, "".r+20(FP)
        0x0054 00084 (test.go:24)       MOVD    -8(RSP), R29
        0x0058 00088 (test.go:24)       MOVD.P  32(RSP), R30
        0x005c 00092 (test.go:24)       RET     (R30)

After:
        0x001c 00028 (test.go:24)       MOVWU   "".y+8(FP), R0
        0x0020 00032 (test.go:24)       CBZW    R0, 92
        0x0024 00036 (test.go:24)       MOVWU   "".hi(FP), R1
        0x0028 00040 (test.go:24)       CMPW    R0, R1
        0x002c 00044 (test.go:24)       BHS     84
        0x0030 00048 (test.go:24)       MOVWU   "".lo+4(FP), R2
        0x0034 00052 (test.go:24)       ORR     R1<<32, R2, R4
        0x0038 00056 (test.go:24)       UDIV    R0, R4, R3
        0x003c 00060 (test.go:24)       MSUB    R3, R4, R0, R4
        0x0040 00064 (test.go:24)       MOVW    R3, "".q+16(FP)
        0x0044 00068 (test.go:24)       MOVW    R4, "".r+20(FP)
        0x0048 00072 (test.go:24)       MOVD    -8(RSP), R29
        0x004c 00076 (test.go:24)       MOVD.P  16(RSP), R30
        0x0050 00080 (test.go:24)       RET     (R30)

UREM instruction in the previous assembly code will be converted to UDIV and MSUB instructions
on arm64. However the UDIV instruction in UREM is unnecessary, because it's a duplicate of the
previous UDIV. This CL adds a rule to have this extra UDIV instruction removed by CSE.

Change-Id: Ie2508784320020b2de022806d09f75a7871bb3d7
Reviewed-on: https://go-review.googlesource.com/c/159577
Reviewed-by: Keith Randall <khr@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Run-TryBot: Bryan C. Mills <bcmills@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
2019-03-03 20:20:10 +00:00
..
archive archive/tar, syscall: add statUnix for aix/ppc64 2019-02-27 23:40:20 +00:00
bufio bufio: fix emptyFinalToken example to handle multiple Reads 2019-03-02 18:28:10 +00:00
builtin
bytes bytes: add examples for ToTitleSpecial, ToUpperSpecial and ToLowerSpecial 2019-03-01 14:56:41 +00:00
cmd cmd/compile: optimize math/bits.Div32 for arm64 2019-03-03 20:20:10 +00:00
compress compress/gzip: clarify that Multistream gzip requires a ByteReader 2019-02-26 23:02:40 +00:00
container container/heap: avoid memory leak in example 2019-02-26 23:42:26 +00:00
context
crypto internal/cpu: change s390x API to match x/sys/cpu 2019-02-28 13:46:45 +00:00
database/sql database/sql/driver: fix typo 2019-02-15 17:23:55 +00:00
debug debug/elf: perform stricter section header table checks in NewFile 2019-03-01 06:04:20 +00:00
encoding encoding/base64: lift nil check out of encode loop 2019-03-03 10:33:18 +00:00
errors errors: add Unwrap, Is, and As 2019-02-27 19:09:40 +00:00
expvar
flag flag: improve docs for PrintDefaults; clarify how to change output destination 2019-01-21 05:30:12 +00:00
fmt fmt: fix %d and other non-string verbs on errors 2019-02-28 17:31:37 +00:00
go go/printer: add missing error checks in tests 2019-03-02 04:55:18 +00:00
hash hash/fnv: use bits.Mul64 for 128-bit hash 2018-12-10 22:50:48 +00:00
html html/template: prevent test from failing with nil pointer dereference 2019-03-02 01:53:40 +00:00
image image/png: delete unused statement 2019-02-28 18:24:51 +00:00
index/suffixarray
internal os: make Readlink work with symlinks with target like \??\Volume{ABCD}\ 2019-03-01 07:44:37 +00:00
io io: align style of test comments in multi_test.go 2019-02-26 23:01:20 +00:00
log
math math/big: better initial guess for nat.sqrt 2019-02-27 18:48:56 +00:00
mime mime/multipart: quote boundary in Content-Type if necessary 2018-12-13 23:58:06 +00:00
net net/http: make TimeoutHandler's ResponseWriter implement Pusher 2019-03-02 05:42:50 +00:00
os os/exec: don't use the echo binary for a benchmark 2019-03-03 18:43:53 +00:00
path path/filepath: do not call GetFinalPathNameByHandle from EvalSymlinks 2019-03-01 07:45:00 +00:00
plugin plugin: fix build constraint to disable test on linux/arm64 2018-11-28 18:14:20 +00:00
reflect reflect: eliminate write barrier for copying result in callReflect 2019-02-01 19:23:02 +00:00
regexp regexp: add ReplaceAllStringFunc example 2019-02-27 21:48:41 +00:00
runtime runtime/pprof/internal/profile: use idiomatic swapping 2019-03-02 05:10:52 +00:00
sort sort: change let to let's 2019-01-27 01:34:56 +00:00
strconv strconv: remove use of DeepEqual for testing errors 2019-02-27 18:23:19 +00:00
strings strings: add ReplaceAll example 2018-12-13 00:35:06 +00:00
sync sync/atomic: add 32-bit MIPS to the 64-bit alignment requirement 2019-02-09 23:07:07 +00:00
syscall syscall: optimize SlicePtrFromStrings 2019-03-02 20:13:13 +00:00
testdata
testing all: fix typos as reported by 'misspell' 2019-02-26 23:02:05 +00:00
text text/template: error on method calls on nil interfaces 2019-02-26 18:05:09 +00:00
time time: move the explanation of u/micro to the ParseDuration example 2019-02-28 00:24:56 +00:00
unicode unicode: improve generated comments for categories 2018-11-28 03:12:48 +00:00
unsafe cmd/compile: assume unsafe pointer arithmetic generates non-nil results 2018-11-14 21:01:36 +00:00
Make.dist
all.bash
all.bat
all.rc
bootstrap.bash
buildall.bash
clean.bash
clean.bat
clean.rc
cmp.bash
iostest.bash cmd/dist: build exec wrappers during bootstrap 2019-02-26 17:59:23 +00:00
make.bash cmd/dist, cmd/link: allow passing default dynamic linker/loader 2019-03-01 06:06:13 +00:00
make.bat build: clear GO111MODULE during make.bash etc 2018-11-16 18:54:22 +00:00
make.rc build: clear GO111MODULE during make.bash etc 2018-11-16 18:54:22 +00:00
naclmake.bash
nacltest.bash
race.bash cmd,runtime: enable race detector on arm64 2018-11-13 16:57:22 +00:00
race.bat
run.bash build: clear GO111MODULE during make.bash etc 2018-11-16 18:54:22 +00:00
run.bat build: clear GO111MODULE during make.bash etc 2018-11-16 18:54:22 +00:00
run.rc build: clear GO111MODULE during make.bash etc 2018-11-16 18:54:22 +00:00