Interfaces often contain pointers. Implement a fast path for this case.
name                   old time/op  new time/op  delta
MapInterfaceString-16  21.4ns ±19%  20.5ns ±10%     ~     (p=0.361 n=10+10)
MapInterfacePtr-16     25.8ns ± 8%  17.3ns ± 7%  -33.11%  (p=0.000 n=10+9)
We need this CL as well to fix 37721.
Update #37721
Fixes #37613
Change-Id: Ice52820e6259a3edeafcbbbeb25b1e363bef00d0
Reviewed-on: https://go-review.googlesource.com/c/go/+/219338
Run-TryBot: Keith Randall <khr@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
(cherry picked from commit 
afd691c579198387c874512ef1c75db651dba9bd)
Reviewed-on: https://go-review.googlesource.com/c/go/+/222779
Run-TryBot: Alexander Rakoczy <alex@golang.org>
 // maps generated by reflect.MapOf (reflect_typehash, below).
 func typehash(t *_type, p unsafe.Pointer, h uintptr) uintptr {
        if t.tflag&tflagRegularMemory != 0 {
-               return memhash(p, h, t.size)
+               // Handle ptr sizes specially, see issue 37086.
+               switch t.size {
+               case 4:
+                       return memhash32(p, h)
+               case 8:
+                       return memhash64(p, h)
+               default:
+                       return memhash(p, h, t.size)
+               }
        }
        switch t.kind & kindMask {
        case kindFloat32: