1
0
mirror of https://github.com/golang/go synced 2024-11-23 04:40:09 -07:00
go/test
Josh Bleecher Snyder 43d5f213e2 cmd/compile: optimize multi-register shifts on amd64
amd64 can shift in bits from another register instead of filling with 0/1.
This pattern is helpful when implementing 128 bit shifts or arbitrary length shifts.
In the standard library, it shows up in pure Go math/big.

Benchmarks results on amd64 with -tags=math_big_pure_go.

name                          old time/op  new time/op  delta
NonZeroShifts/1/shrVU-8       4.45ns ± 3%  4.39ns ± 1%   -1.28%  (p=0.000 n=30+27)
NonZeroShifts/1/shlVU-8       4.13ns ± 4%  4.10ns ± 2%     ~     (p=0.254 n=29+28)
NonZeroShifts/2/shrVU-8       5.55ns ± 1%  5.63ns ± 2%   +1.42%  (p=0.000 n=28+29)
NonZeroShifts/2/shlVU-8       5.70ns ± 2%  5.14ns ± 1%   -9.82%  (p=0.000 n=29+28)
NonZeroShifts/3/shrVU-8       6.79ns ± 2%  6.35ns ± 2%   -6.46%  (p=0.000 n=28+29)
NonZeroShifts/3/shlVU-8       6.69ns ± 1%  6.25ns ± 1%   -6.60%  (p=0.000 n=28+27)
NonZeroShifts/4/shrVU-8       7.79ns ± 2%  7.06ns ± 2%   -9.48%  (p=0.000 n=30+30)
NonZeroShifts/4/shlVU-8       7.82ns ± 1%  7.24ns ± 1%   -7.37%  (p=0.000 n=28+29)
NonZeroShifts/5/shrVU-8       8.90ns ± 3%  7.93ns ± 1%  -10.84%  (p=0.000 n=29+26)
NonZeroShifts/5/shlVU-8       8.68ns ± 1%  7.92ns ± 1%   -8.76%  (p=0.000 n=29+29)
NonZeroShifts/10/shrVU-8      14.4ns ± 1%  12.3ns ± 2%  -14.79%  (p=0.000 n=28+29)
NonZeroShifts/10/shlVU-8      14.1ns ± 1%  11.9ns ± 2%  -15.55%  (p=0.000 n=28+27)
NonZeroShifts/100/shrVU-8      118ns ± 1%    96ns ± 3%  -18.82%  (p=0.000 n=30+29)
NonZeroShifts/100/shlVU-8      120ns ± 2%    98ns ± 2%  -18.46%  (p=0.000 n=29+28)
NonZeroShifts/1000/shrVU-8    1.10µs ± 1%  0.88µs ± 2%  -19.63%  (p=0.000 n=29+30)
NonZeroShifts/1000/shlVU-8    1.10µs ± 2%  0.88µs ± 2%  -20.28%  (p=0.000 n=29+28)
NonZeroShifts/10000/shrVU-8   10.9µs ± 1%   8.7µs ± 1%  -19.78%  (p=0.000 n=28+27)
NonZeroShifts/10000/shlVU-8   10.9µs ± 2%   8.7µs ± 1%  -19.64%  (p=0.000 n=29+27)
NonZeroShifts/100000/shrVU-8   111µs ± 2%    90µs ± 2%  -19.39%  (p=0.000 n=28+29)
NonZeroShifts/100000/shlVU-8   113µs ± 2%    90µs ± 2%  -20.43%  (p=0.000 n=30+27)

The assembly version is still faster, unfortunately, but the gap is narrowing.
Speedup from pure Go to assembly:

name                          old time/op  new time/op  delta
NonZeroShifts/1/shrVU-8       4.39ns ± 1%  3.45ns ± 2%  -21.36%  (p=0.000 n=27+29)
NonZeroShifts/1/shlVU-8       4.10ns ± 2%  3.47ns ± 3%  -15.42%  (p=0.000 n=28+30)
NonZeroShifts/2/shrVU-8       5.63ns ± 2%  3.97ns ± 0%  -29.40%  (p=0.000 n=29+25)
NonZeroShifts/2/shlVU-8       5.14ns ± 1%  3.77ns ± 2%  -26.65%  (p=0.000 n=28+26)
NonZeroShifts/3/shrVU-8       6.35ns ± 2%  4.79ns ± 2%  -24.52%  (p=0.000 n=29+29)
NonZeroShifts/3/shlVU-8       6.25ns ± 1%  4.42ns ± 1%  -29.29%  (p=0.000 n=27+26)
NonZeroShifts/4/shrVU-8       7.06ns ± 2%  5.64ns ± 1%  -20.05%  (p=0.000 n=30+29)
NonZeroShifts/4/shlVU-8       7.24ns ± 1%  5.34ns ± 2%  -26.23%  (p=0.000 n=29+29)
NonZeroShifts/5/shrVU-8       7.93ns ± 1%  6.56ns ± 2%  -17.26%  (p=0.000 n=26+30)
NonZeroShifts/5/shlVU-8       7.92ns ± 1%  6.27ns ± 1%  -20.79%  (p=0.000 n=29+25)
NonZeroShifts/10/shrVU-8      12.3ns ± 2%  10.2ns ± 2%  -17.21%  (p=0.000 n=29+29)
NonZeroShifts/10/shlVU-8      11.9ns ± 2%  10.5ns ± 2%  -12.45%  (p=0.000 n=27+29)
NonZeroShifts/100/shrVU-8     95.9ns ± 3%  77.7ns ± 1%  -19.00%  (p=0.000 n=29+30)
NonZeroShifts/100/shlVU-8     97.5ns ± 2%  66.8ns ± 2%  -31.47%  (p=0.000 n=28+30)
NonZeroShifts/1000/shrVU-8     884ns ± 2%   705ns ± 1%  -20.17%  (p=0.000 n=30+28)
NonZeroShifts/1000/shlVU-8     880ns ± 2%   590ns ± 1%  -32.96%  (p=0.000 n=28+25)
NonZeroShifts/10000/shrVU-8   8.74µs ± 1%  7.34µs ± 3%  -15.94%  (p=0.000 n=27+30)
NonZeroShifts/10000/shlVU-8   8.73µs ± 1%  6.00µs ± 1%  -31.25%  (p=0.000 n=27+28)
NonZeroShifts/100000/shrVU-8  89.6µs ± 2%  75.5µs ± 2%  -15.80%  (p=0.000 n=29+29)
NonZeroShifts/100000/shlVU-8  89.6µs ± 2%  68.0µs ± 3%  -24.09%  (p=0.000 n=27+30)

Change-Id: I18f58d8f5513d737d9cdf09b8f9d14011ffe3958
Reviewed-on: https://go-review.googlesource.com/c/go/+/297050
Trust: Josh Bleecher Snyder <josharian@gmail.com>
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
2021-03-11 19:11:46 +00:00
..
abi cmd/compile: fix failure to communicate between ABIinfo producer&consumer 2021-03-09 18:45:05 +00:00
alias3.dir
bench
chan [dev.typeparams] merge: merge branch 'dev.regabi' into 'dev.typeparams' 2020-12-14 12:13:36 -08:00
closure3.dir [dev.regabi] cmd/compile: exporting, importing, and inlining functions with OCLOSURE 2021-01-20 22:53:32 +00:00
closure5.dir [dev.regabi] cmd/compile: exporting, importing, and inlining functions with OCLOSURE 2021-01-20 22:53:32 +00:00
codegen cmd/compile: optimize multi-register shifts on amd64 2021-03-11 19:11:46 +00:00
ddd2.dir
dwarf
fixedbugs test: add test that caused a gofrontend internal error 2021-03-11 17:20:58 +00:00
import2.dir
import4.dir
interface [dev.typeparams] merge: merge branch 'dev.regabi' into 'dev.typeparams' 2020-12-14 12:13:36 -08:00
intrinsic.dir
ken
linkname.dir
method4.dir
oldescape_linkname.dir
retjmp.dir
runtime
stress
syntax test: match gofrontend error messages 2020-12-02 02:56:41 +00:00
typeparam cmd/compile: fix handling of partially inferred type arguments 2021-03-11 00:31:14 +00:00
uintptrescapes.dir
64bit.go
235.go
alg.go
alias1.go
alias2.go [dev.typeparams] test: add scaffolding to run.go to check compiler with -G flag 2020-12-01 21:49:31 +00:00
alias3.go
alias.go
align.go
append1.go [dev.typeparams] test: add scaffolding to run.go to check compiler with -G flag 2020-12-01 21:49:31 +00:00
append.go
args.go
armimm.go
assign1.go
assign.go [dev.typeparams] merge: merge branch 'dev.regabi' into 'dev.typeparams' 2020-12-14 12:13:36 -08:00
atomicload.go
bigalg.go
bigmap.go
blank1.go [dev.typeparams] merge: merge branch 'dev.regabi' into 'dev.typeparams' 2020-12-14 12:13:36 -08:00
blank.go
bom.go
bombad.go
bounds.go cmd/compile: defer lowering OANDNOT until SSA 2020-10-27 03:11:45 +00:00
cannotassign.go [dev.typeparams] test: add scaffolding to run.go to check compiler with -G flag 2020-12-01 21:49:31 +00:00
chancap.go [dev.regabi] cmd/compile: remove toolstash scaffolding 2021-01-05 21:44:30 +00:00
chanlinear.go
char_lit1.go cmd/compile: do not report error for invalid constant 2021-03-05 18:46:43 +00:00
char_lit.go
checkbce.go
clearfat.go
closedchan.go
closure1.go
closure2.go [dev.regabi] test: add another closure test case 2021-01-01 13:44:37 +00:00
closure3.go cmd/compile: disable inlining functions with closures for now 2021-02-24 21:34:21 +00:00
closure4.go
closure5.go [dev.regabi] cmd/compile: exporting, importing, and inlining functions with OCLOSURE 2021-01-20 22:53:32 +00:00
closure6.go [dev.regabi] cmd/compile: fix escape analysis problem with closures 2021-01-23 02:15:24 +00:00
closure7.go [dev.regabi] test: add a test for inlining closures 2021-02-01 18:28:05 +00:00
closure.go
cmp6.go [dev.typeparams] test: add scaffolding to run.go to check compiler with -G flag 2020-12-01 21:49:31 +00:00
cmp.go
cmplx.go
cmplxdivide1.go
cmplxdivide.c
cmplxdivide.go
complit1.go test: match gofrontend error messages 2020-11-28 02:31:54 +00:00
complit.go
compos.go
const1.go [dev.typeparams] test: add scaffolding to run.go to check compiler with -G flag 2020-12-01 21:49:31 +00:00
const2.go [dev.typeparams] test: add scaffolding to run.go to check compiler with -G flag 2020-12-01 21:49:31 +00:00
const3.go
const4.go
const5.go
const6.go
const7.go [dev.typeparams] cmd/compile: refuse excessively long constants 2021-02-03 20:22:34 +00:00
const.go
convert1.go
convert2.go [dev.typeparams] test: add scaffolding to run.go to check compiler with -G flag 2020-12-01 21:49:31 +00:00
convert3.go
convert.go
convlit1.go
convlit.go [dev.typeparams] test: finish triaging all outstanding failing tests 2020-12-14 21:28:48 +00:00
convT2X.go
copy1.go [dev.typeparams] test: enable some more errorcheck tests 2020-12-04 21:22:23 +00:00
copy.go
crlf.go
ddd1.go test: match gofrontend error messages 2020-11-28 02:31:54 +00:00
ddd2.go
ddd.go
decl.go
declbad.go
defer.go
defererrcheck.go
deferfin.go [dev.regabi] test: enable finalizer tests on !amd64 2021-01-05 21:11:31 +00:00
defernil.go
deferprint.go
deferprint.out
devirt.go
directive.go cmd/compile: reject misplaced go:build comments 2020-10-13 01:16:45 +00:00
divide.go
divmod.go
embedfunc.go cmd/compile: require 'go 1.16' go.mod line for //go:embed 2021-01-19 20:07:52 +00:00
embedvers.go cmd/compile: require 'go 1.16' go.mod line for //go:embed 2021-01-19 20:07:52 +00:00
empty.go
env.go
eof1.go
eof.go
escape2.go [dev.regabi] cmd/compile: convert OPANIC argument to interface{} during typecheck 2021-01-18 05:55:08 +00:00
escape2n.go [dev.regabi] cmd/compile: convert OPANIC argument to interface{} during typecheck 2021-01-18 05:55:08 +00:00
escape3.go
escape4.go [dev.regabi] cmd/compile: convert OPANIC argument to interface{} during typecheck 2021-01-18 05:55:08 +00:00
escape5.go cmd/compile: fix escape analysis of heap-allocated results 2021-02-27 19:01:19 +00:00
escape_array.go
escape_calls.go
escape_closure.go cmd/compile: improve escape analysis of known calls 2020-10-15 18:26:06 +00:00
escape_field.go
escape_goto.go
escape_hash_maphash.go
escape_iface.go cmd/compile: fix devirtualization of promoted interface methods 2020-10-30 00:47:37 +00:00
escape_indir.go
escape_level.go
escape_map.go
escape_param.go [dev.regabi] cmd/compile: update ir/fmt for concrete types 2020-12-17 03:50:03 +00:00
escape_runtime_atomic.go
escape_selfassign.go
escape_slice.go
escape_struct_param1.go
escape_struct_param2.go
escape_struct_return.go
escape_sync_atomic.go
escape_unsafe.go
escape.go
fibo.go
finprofiled.go
float_lit2.go
float_lit3.go [dev.regabi] cmd/compile: enable rational constant arithmetic 2021-01-25 18:53:24 +00:00
float_lit.go
floatcmp.go
for.go
func1.go [dev.typeparams] test: enable some more errorcheck tests 2020-12-04 21:22:23 +00:00
func2.go
func3.go
func4.go
func5.go
func6.go
func7.go
func8.go
func.go
funcdup2.go [dev.typeparams] test: enable some more errorcheck tests 2020-12-04 21:22:23 +00:00
funcdup.go [dev.typeparams] test: enable some more errorcheck tests 2020-12-04 21:22:23 +00:00
gc1.go
gc2.go
gc.go
gcgort.go
gcstring.go
goprint.go
goprint.out
goto.go
heapsampling.go
helloworld.go
helloworld.out
if.go
import1.go
import2.go
import4.go
import5.go
import6.go
import.go
index0.go
index1.go
index2.go
index.go
indirect1.go
indirect.go
init1.go
init.go [dev.typeparams] merge: merge branch 'dev.regabi' into 'dev.typeparams' 2020-12-14 12:13:36 -08:00
initcomma.go
initempty.go
initexp.go cmd/compile: fix exponential-time init-cycle reporting 2021-01-08 17:14:20 +00:00
initialize.go
initializerr.go test: match gofrontend error messages 2020-11-28 02:31:54 +00:00
initloop.go [dev.typeparams] cmd/compile/internal/types2: adjusted qualified identifier error message for compiler 2020-12-09 23:56:19 +00:00
inline_big.go
inline_caller.go
inline_callers.go
inline_literal.go
inline_math_bits_rotate.go
inline_sync.go
inline_variadic.go
inline.go test: fix inline.go test for linux-amd64-noopt 2021-02-25 02:22:12 +00:00
int_lit.go
intcvt.go
intrinsic_atomic.go
intrinsic.go
iota.go
label1.go test: match gofrontend error messages 2020-11-28 02:31:54 +00:00
label.go test: match gofrontend error messages 2020-11-28 02:31:54 +00:00
linkmain_run.go
linkmain.go
linkname2.go [dev.regabi] cmd/compile: comment out //go:linkname warning 2020-12-02 06:49:37 +00:00
linkname.go
linkobj.go test: recognize and use gc build tag 2020-12-18 00:10:44 +00:00
linkx_run.go test: recognize and use gc build tag 2020-12-18 00:10:44 +00:00
linkx.go
literal2.go
literal.go
live1.go
live2.go
live_syscall.go
live.go [dev.regabi] cmd/compile: only save ONAMEs on Curfn.Dcl 2020-12-01 17:16:53 +00:00
locklinear.go
loopbce.go
mainsig.go [dev.regabi] cmd/compile: cleanup for concrete types - noder 2020-12-17 04:43:46 +00:00
makechan.go [dev.typeparams] test: finish triaging all outstanding failing tests 2020-12-14 21:28:48 +00:00
makemap.go [dev.typeparams] test: finish triaging all outstanding failing tests 2020-12-14 21:28:48 +00:00
makenew.go [dev.typeparams] test: enable some more errorcheck tests 2020-12-04 21:22:23 +00:00
makeslice.go
mallocfin.go
map1.go [dev.typeparams] merge: merge branch 'dev.regabi' into 'dev.typeparams' 2020-12-14 12:13:36 -08:00
map.go
mapclear.go
maplinear.go
mergemul.go
method1.go
method2.go [dev.typeparams] merge: merge branch 'dev.regabi' into 'dev.typeparams' 2020-12-14 12:13:36 -08:00
method3.go
method4.go
method5.go
method6.go [dev.typeparams] test: enable some more errorcheck tests 2020-12-04 21:22:23 +00:00
method7.go [dev.typeparams] cmd/compile: fix MethodExpr handling with embedded fields 2021-01-26 17:05:06 +00:00
method.go
named1.go [dev.typeparams] test: enable some more errorcheck tests 2020-12-04 21:22:23 +00:00
named.go
nil.go
nilcheck.go
nilptr2.go
nilptr3.go [dev.regabi] cmd/compile: deref PAUTOHEAPs during SSA construction 2021-01-10 08:01:49 +00:00
nilptr4.go
nilptr5_aix.go
nilptr5_wasm.go
nilptr5.go
nilptr_aix.go
nilptr.go test: disable nilptr on windows/arm64 2021-02-19 00:40:22 +00:00
nosplit.go [dev.regabi] cmd/compile,cmd/link: initial support for ABI wrappers 2020-12-22 18:13:48 +00:00
notinheap2.go
notinheap3.go
notinheap.go
nowritebarrier.go
nul1.go
opt_branchlikely.go
parentype.go
peano.go
phiopt.go
print.go
print.out
printbig.go
printbig.out
prove.go docs: fix spelling 2021-02-24 04:11:43 +00:00
range.go
README.md
recover1.go
recover2.go
recover3.go
recover4.go
recover5.go
recover.go
reflectmethod1.go
reflectmethod2.go
reflectmethod3.go
reflectmethod4.go
reflectmethod5.go
reflectmethod6.go
reflectmethod7.go cmd/compile: mark concrete call of reflect.(*rtype).Method as REFLECTMETHOD 2021-02-10 22:44:54 +00:00
rename1.go [dev.typeparams] test: enable some more errorcheck tests 2020-12-04 21:22:23 +00:00
rename.go
reorder2.go
reorder.go [dev.regabi] cmd/compile: cleanup OAS2FUNC ordering 2021-01-16 23:19:26 +00:00
retjmp.go
return.go
rotate0.go
rotate1.go
rotate2.go
rotate3.go
rotate.go
run.go test: enable "-d=panic" by default for errorcheck* 2021-03-05 18:47:16 +00:00
rune.go
runtime.go [dev.typeparams] cmd/compile/internal/types2: adjusted qualified identifier error message for compiler 2020-12-09 23:56:19 +00:00
shift1.go test: recognize gofrontend error messages 2020-11-30 20:08:34 +00:00
shift2.go
sieve.go
sigchld.go
sigchld.out
simassign.go
sinit_run.go test: recognize and use gc build tag 2020-12-18 00:10:44 +00:00
sinit.go
sizeof.go
slice3.go
slice3err.go [dev.typeparams] test: finish triaging all outstanding failing tests 2020-12-14 21:28:48 +00:00
slicecap.go
sliceopt.go
solitaire.go
stack.go
stackobj2.go
stackobj3.go
stackobj.go
strcopy.go
strength.go
string_lit.go
stringrange.go
struct0.go
switch2.go
switch3.go [dev.typeparams] cmd/compile/internal/types2: report error for invalid (but empty) expr switch 2020-12-15 19:43:32 +00:00
switch4.go
switch5.go [dev.typeparams] test: finish triaging all outstanding failing tests 2020-12-14 21:28:48 +00:00
switch6.go [dev.typeparams] test: finish triaging all outstanding failing tests 2020-12-14 21:28:48 +00:00
switch7.go [dev.typeparams] test: finish triaging all outstanding failing tests 2020-12-14 21:28:48 +00:00
switch.go
tinyfin.go
torture.go
turing.go
typecheck.go
typecheckloop.go [dev.typeparams] cmd/compile/internal/types2: adjust init cycle error message for compiler 2020-12-09 23:55:41 +00:00
typeswitch1.go
typeswitch2.go
typeswitch2b.go
typeswitch3.go [dev.typeparams] test: enable some more errorcheck tests 2020-12-04 21:22:23 +00:00
typeswitch.go
uintptrescapes2.go
uintptrescapes3.go
uintptrescapes.go
undef.go
used.go [dev.typeparams] all: merge dev.regabi (07569da) into dev.typeparams 2020-12-28 00:39:17 -08:00
utf.go
varerr.go [dev.typeparams] test: enable some more errorcheck tests 2020-12-04 21:22:23 +00:00
varinit.go
winbatch.go all: update to use filepath.WalkDir instead of filepath.Walk 2020-12-02 16:33:57 +00:00
writebarrier.go
zerodivide.go

The test directory contains tests of the Go tool chain and runtime. It includes black box tests, regression tests, and error output tests. They are run as part of all.bash.

To run just these tests, execute:

../bin/go run run.go

To run just tests from specified files in this directory, execute:

../bin/go run run.go -- file1.go file2.go ...

Standard library tests should be written as regular Go tests in the appropriate package.

The tool chain and runtime also have regular Go tests in their packages. The main reasons to add a new test to this directory are:

  • it is most naturally expressed using the test runner; or
  • it is also applicable to gccgo and other Go tool chains.