runtime: use multiplication with overflow check for growslice
runtime: use multiplication with overflow check for growslice

This improves performance for slices with an element size larger
than 32 bytes and removes loading a value from the maxElems
array for smaller element sizes.

name                 old time/op  new time/op  delta
GrowSlice/Byte       41.4ns ± 2%  41.5ns ± 1%    ~     (p=0.366 n=10+9)
GrowSlice/Int16      51.1ns ± 2%  51.0ns ± 2%    ~     (p=0.985 n=10+10)
GrowSlice/Int        64.0ns ± 1%  64.2ns ± 1%    ~     (p=0.180 n=10+10)
GrowSlice/Ptr        90.8ns ± 1%  90.7ns ± 1%    ~     (p=0.858 n=9+10)
GrowSlice/Struct/24   108ns ± 0%   108ns ± 2%    ~     (p=0.488 n=8+9)
GrowSlice/Struct/32   118ns ± 2%   117ns ± 2%    ~     (p=0.327 n=10+10)
GrowSlice/Struct/40   159ns ± 1%   148ns ± 1%  -6.87%  (p=0.000 n=10+9)

Updates #21588

Change-Id: I443b82972d379b1befa791f9ee468b3adc6bb760
Reviewed-on: https://go-review.googlesource.com/c/143798
Run-TryBot: Martin Möhrmann <351cee93cee855ec83663f800954e6cac9e83b41@uos.de>
TryBot-Result: Gobot Gobot <66cb808b70d30c07676d5e946fee83fd561249e5@golang.org>
Reviewed-by: Ian Lance Taylor <87e9c6d529889242b7e184afb632328636553ab4@golang.org>

josharian/go,nawawi/go,golang/go,josharian/go,cloudflare/go,akutz/go,cloudflare/go,nawawi/go,golang/go,golang/go,golang/go,akutz/go,cloudflare/go,akutz/go,CAFxX/go,akutz/go,nawawi/go,CAFxX/go,nawawi/go,cloudflare/go,nawawi/go,nawawi/go,josharian/go,CAFxX/go,josharian/go,akutz/go,akutz/go,cloudflare/go,cloudflare/go,josharian/go,josharian/go,CAFxX/go,akutz/go,cloudflare/go,CAFxX/go,nawawi/go,josharian/go,golang/go,golang/go,josharian/go,CAFxX/go,CAFxX/go,golang/go,CAFxX/go,cloudflare/go,nawawi/go,akutz/go,golang/go