• Rémy Oudompheng's avatar
    cmd/5c, cmd/5g, cmd/5l: turn MOVB, MOVH into plain moves, optimize short arithmetic. · 357f7336
    Rémy Oudompheng authored
    Pseudo-instructions MOVBS and MOVHS are used to clarify
    the semantics of short integers vs. registers:
     * 8-bit and 16-bit values in registers are assumed to always
       be zero-extended or sign-extended depending on their type.
     * MOVB is truncation or move of an already extended value
       between registers.
     * MOVBU enforces zero-extension at the destination (register).
     * MOVBS enforces sign-extension at the destination (register).
    And similarly for MOVH/MOVS/MOVHU.
    
    The linker is adapted to assemble MOVB and MOVH to an ordinary
    mov. Also a peephole pass in 5g that aims at eliminating
    redundant zero/sign extensions is improved.
    
    encoding/binary:
    benchmark                              old ns/op    new ns/op    delta
    BenchmarkReadSlice1000Int32s              220387       217185   -1.45%
    BenchmarkReadStruct                        12839        12910   +0.55%
    BenchmarkReadInts                           5692         5534   -2.78%
    BenchmarkWriteInts                          6137         6016   -1.97%
    BenchmarkPutUvarint32                        257          241   -6.23%
    BenchmarkPutUvarint64                        812          754   -7.14%
    benchmark                               old MB/s     new MB/s  speedup
    BenchmarkReadSlice1000Int32s               18.15        18.42    1.01x
    BenchmarkReadStruct                         5.45         5.42    0.99x
    BenchmarkReadInts                           5.27         5.42    1.03x
    BenchmarkWriteInts                          4.89         4.99    1.02x
    BenchmarkPutUvarint32                      15.56        16.57    1.06x
    BenchmarkPutUvarint64                       9.85        10.60    1.08x
    
    crypto/des:
    benchmark                              old ns/op    new ns/op    delta
    BenchmarkEncrypt                            7002         5169  -26.18%
    BenchmarkDecrypt                            7015         5195  -25.94%
    benchmark                               old MB/s     new MB/s  speedup
    BenchmarkEncrypt                            1.14         1.55    1.36x
    BenchmarkDecrypt                            1.14         1.54    1.35x
    
    strconv:
    benchmark                              old ns/op    new ns/op    delta
    BenchmarkAtof64Decimal                       457          385  -15.75%
    BenchmarkAtof64Float                         574          479  -16.55%
    BenchmarkAtof64FloatExp                     1035          906  -12.46%
    BenchmarkAtof64Big                          1793         1457  -18.74%
    BenchmarkAtof64RandomBits                   2267         2066   -8.87%
    BenchmarkAtof64RandomFloats                 1416         1194  -15.68%
    BenchmarkAtof32Decimal                       451          379  -15.96%
    BenchmarkAtof32Float                         547          435  -20.48%
    BenchmarkAtof32FloatExp                     1095          986   -9.95%
    BenchmarkAtof32Random                       1154         1006  -12.82%
    BenchmarkAtoi                               1415         1380   -2.47%
    BenchmarkAtoiNeg                            1414         1401   -0.92%
    BenchmarkAtoi64                             1744         1671   -4.19%
    BenchmarkAtoi64Neg                          1737         1662   -4.32%
    
    Fixes #1837.
    
    R=rsc, dave, bradfitz
    CC=golang-dev
    https://golang.org/cl/12424043
    357f7336
Name
Last commit
Last update
..
Makefile Loading commit data...
cgen.c Loading commit data...
doc.go Loading commit data...
gc.h Loading commit data...
list.c Loading commit data...
mul.c Loading commit data...
peep.c Loading commit data...
reg.c Loading commit data...
sgen.c Loading commit data...
swt.c Loading commit data...
txt.c Loading commit data...