]> Cypherpunks repositories - gostls13.git/commit
runtime: amd64, use 4-byte ops for memmove of 4 bytes
authorKeith Randall <khr@golang.org>
Mon, 23 Jan 2017 16:22:10 +0000 (08:22 -0800)
committerKeith Randall <khr@golang.org>
Mon, 23 Jan 2017 19:39:22 +0000 (19:39 +0000)
commita96e117a58dce1d55fd83a7b3391fa667dd66652
tree0d600d2367a82eb542b4f53a18cd25b347eb06ec
parent4cce27a3fa0cc1f13afa6ffa358efa07144e00ec
runtime: amd64, use 4-byte ops for memmove of 4 bytes

memmove used to use 2 2-byte load/store pairs to move 4 bytes.
When the result is loaded with a single 4-byte load, it caused
a store to load fowarding stall.  To avoid the stall,
special case memmove to use 4 byte ops for the 4 byte copy case.

We already have a special case for 8-byte copies.
386 already specializes 4-byte copies.
I'll do 2-byte copies also, but not for 1.8.

benchmark                 old ns/op     new ns/op     delta
BenchmarkIssue18740-8     7567          4799          -36.58%

3-byte copies get a bit slower.  Other copies are unchanged.
name         old time/op   new time/op   delta
Memmove/3-8   4.76ns ± 5%   5.26ns ± 3%  +10.50%  (p=0.000 n=10+10)

Fixes #18740

Change-Id: Iec82cbac0ecfee80fa3c8fc83828f9a1819c3c74
Reviewed-on: https://go-review.googlesource.com/35567
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: David Chase <drchase@google.com>
src/runtime/memmove_amd64.s
src/runtime/memmove_test.go