1. 17 Feb, 2015 7 commits
  2. 14 Feb, 2015 1 commit
  3. 13 Feb, 2015 29 commits
  4. 12 Feb, 2015 3 commits
    • Josh Bleecher Snyder's avatar
      cmd/gc: evaluate concrete == interface without allocating · 77a21139
      Josh Bleecher Snyder authored
      Consider an interface value i of type I and concrete value c of type C.
      
      Prior to this CL, i==c was evaluated as
      	I(c) == i
      
      Evaluating I(c) can allocate.
      
      This CL changes the evaluation of i==c to
      	x, ok := i.(C); ok && x == c
      
      The new generated code is shorter and does not allocate directly.
      
      If C is small, as it is in every instance in the stdlib,
      the new code also uses less stack space
      and makes one runtime call instead of two.
      
      If C is very large, the original implementation is used.
      The cutoff for "very large" is 1<<16,
      following the stack vs heap cutoff used elsewhere.
      
      This kind of comparison occurs in 38 places in the stdlib,
      mostly in the net and os packages.
      
      benchmark                     old ns/op     new ns/op     delta
      BenchmarkEqEfaceConcrete      29.5          7.92          -73.15%
      BenchmarkEqIfaceConcrete      32.1          7.90          -75.39%
      BenchmarkNeEfaceConcrete      29.9          7.90          -73.58%
      BenchmarkNeIfaceConcrete      35.9          7.90          -77.99%
      
      Fixes #9370.
      
      Change-Id: I7c4555950bcd6406ee5c613be1f2128da2c9a2b7
      Reviewed-on: https://go-review.googlesource.com/2096Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      77a21139
    • Josh Bleecher Snyder's avatar
      cmd/6g, cmd/8g: make 2/3 word sgen more efficient · 747c8498
      Josh Bleecher Snyder authored
      When compiling the stdlib most of the calls
      to sgen are for exactly 2 or 3 words:
      85% for 6g and 70% for 8g.
      Special case them for performance.
      This optimization is not relevant to 5g and 9g.
      
      6g
      
      benchmark                old ns/op     new ns/op     delta
      BenchmarkCopyFat16       3.25          0.82          -74.77%
      BenchmarkCopyFat24       5.47          0.95          -82.63%
      
      8g
      
      benchmark               old ns/op     new ns/op     delta
      BenchmarkCopyFat8       3.84          2.42          -36.98%
      BenchmarkCopyFat12      4.94          2.15          -56.48%
      
      Change-Id: I8bc60b453f12597dfd916df2d072a7d5fc33ab85
      Reviewed-on: https://go-review.googlesource.com/2607Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      747c8498
    • Josh Bleecher Snyder's avatar
      cmd/6g: allocate fewer new registers in sgen · c1c3ce6b
      Josh Bleecher Snyder authored
      When possible, generate nodl/nodr directly into DI/SI
      rather than going through a temporary register.
      
      CX has already been saved; use it during trailing bytes cleanup.
      
      Change-Id: I4ec6209bcc5d3bfdc927c5c132009bd8d791ada3
      Reviewed-on: https://go-review.googlesource.com/2608Reviewed-by: 's avatarRuss Cox <rsc@golang.org>
      Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
      c1c3ce6b