diff options
author | Brian Kessler <brian.m.kessler@gmail.com> | 2019-05-17 15:16:38 -0600 |
---|---|---|
committer | Brad Fitzpatrick <bradfitz@golang.org> | 2019-08-31 17:03:04 +0000 |
commit | b003afe4fea9427ea8d8014dd4be1b02124af520 (patch) | |
tree | bea977ddbd776b179bd35f3b8c42837e74f683d9 /src/cmd/compile/internal/wasm | |
parent | 12dbd20a50f223aa3b7adc579e4db0fd9abfb8dd (diff) | |
download | go-b003afe4fea9427ea8d8014dd4be1b02124af520.tar.gz go-b003afe4fea9427ea8d8014dd4be1b02124af520.zip |
cmd/compile: intrinsify RotateLeft32 on wasm
wasm has 32-bit versions of all integer operations. This change
lowers RotateLeft32 to i32.rotl on wasm and intrinsifies the math/bits
call. Benchmarking on amd64 under node.js this is ~25% faster.
node v10.15.3/amd64
name old time/op new time/op delta
RotateLeft 8.37ns ± 1% 8.28ns ± 0% -1.05% (p=0.029 n=4+4)
RotateLeft8 11.9ns ± 1% 11.8ns ± 0% ~ (p=0.167 n=5+5)
RotateLeft16 11.8ns ± 0% 11.8ns ± 0% ~ (all equal)
RotateLeft32 11.9ns ± 1% 8.7ns ± 0% -26.32% (p=0.008 n=5+5)
RotateLeft64 8.31ns ± 1% 8.43ns ± 2% ~ (p=0.063 n=5+5)
Updates #31265
Change-Id: I5b8e155978faeea536c4f6427ac9564d2f096a46
Reviewed-on: https://go-review.googlesource.com/c/go/+/182359
Run-TryBot: Brian Kessler <brian.m.kessler@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Richard Musiol <neelance@gmail.com>
Diffstat (limited to 'src/cmd/compile/internal/wasm')
-rw-r--r-- | src/cmd/compile/internal/wasm/ssa.go | 6 |
1 files changed, 6 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/wasm/ssa.go b/src/cmd/compile/internal/wasm/ssa.go index b50f662a8b..761a40227d 100644 --- a/src/cmd/compile/internal/wasm/ssa.go +++ b/src/cmd/compile/internal/wasm/ssa.go @@ -299,6 +299,12 @@ func ssaGenValueOnStack(s *gc.SSAGenState, v *ssa.Value, extend bool) { getValue64(s, v.Args[1]) s.Prog(v.Op.Asm()) + case ssa.OpWasmI32Rotl: + getValue32(s, v.Args[0]) + getValue32(s, v.Args[1]) + s.Prog(wasm.AI32Rotl) + s.Prog(wasm.AI64ExtendI32U) + case ssa.OpWasmI64DivS: getValue64(s, v.Args[0]) getValue64(s, v.Args[1]) |