• erifan01's avatar
    cmd/compile: eliminate unnecessary type conversions in TrailingZeros(16|8) for arm64 · 4e2b0dda
    erifan01 authored
    This CL eliminates unnecessary type conversion operations: OpZeroExt16to64 and OpZeroExt8to64.
    If the input argrument is a nonzero value, then ORconst operation can also be eliminated.
    
    Benchmarks:
    
    name               old time/op  new time/op  delta
    TrailingZeros-8    2.75ns ± 0%  2.75ns ± 0%     ~     (all equal)
    TrailingZeros8-8   3.49ns ± 1%  2.93ns ± 0%  -16.00%  (p=0.000 n=10+10)
    TrailingZeros16-8  3.49ns ± 1%  2.93ns ± 0%  -16.05%  (p=0.000 n=9+10)
    TrailingZeros32-8  2.67ns ± 1%  2.68ns ± 1%     ~     (p=0.468 n=10+10)
    TrailingZeros64-8  2.67ns ± 1%  2.65ns ± 0%   -0.62%  (p=0.022 n=10+9)
    
    code:
    
    func f16(x uint) { z = bits.TrailingZeros16(uint16(x)) }
    
    Before:
    
    "".f16 STEXT size=48 args=0x8 locals=0x0 leaf
            0x0000 00000 (test.go:7)        TEXT    "".f16(SB), LEAF|NOFRAME|ABIInternal, $0-8
            0x0000 00000 (test.go:7)        FUNCDATA        ZR, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
            0x0000 00000 (test.go:7)        FUNCDATA        $1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
            0x0000 00000 (test.go:7)        FUNCDATA        $3, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
            0x0000 00000 (test.go:7)        PCDATA  $2, ZR
            0x0000 00000 (test.go:7)        PCDATA  ZR, ZR
            0x0000 00000 (test.go:7)        MOVD    "".x(FP), R0
            0x0004 00004 (test.go:7)        MOVHU   R0, R0
            0x0008 00008 (test.go:7)        ORR     $65536, R0, R0
            0x000c 00012 (test.go:7)        RBIT    R0, R0
            0x0010 00016 (test.go:7)        CLZ     R0, R0
            0x0014 00020 (test.go:7)        MOVD    R0, "".z(SB)
            0x0020 00032 (test.go:7)        RET     (R30)
    
    This line of code is unnecessary:
            0x0004 00004 (test.go:7)        MOVHU   R0, R0
    
    After:
    
    "".f16 STEXT size=32 args=0x8 locals=0x0 leaf
            0x0000 00000 (test.go:7)        TEXT    "".f16(SB), LEAF|NOFRAME|ABIInternal, $0-8
            0x0000 00000 (test.go:7)        FUNCDATA        ZR, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
            0x0000 00000 (test.go:7)        FUNCDATA        $1, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
            0x0000 00000 (test.go:7)        FUNCDATA        $3, gclocals·33cdeccccebe80329f1fdbee7f5874cb(SB)
            0x0000 00000 (test.go:7)        PCDATA  $2, ZR
            0x0000 00000 (test.go:7)        PCDATA  ZR, ZR
            0x0000 00000 (test.go:7)        MOVD    "".x(FP), R0
            0x0004 00004 (test.go:7)        ORR     $65536, R0, R0
            0x0008 00008 (test.go:7)        RBITW   R0, R0
            0x000c 00012 (test.go:7)        CLZW    R0, R0
            0x0010 00016 (test.go:7)        MOVD    R0, "".z(SB)
            0x001c 00028 (test.go:7)        RET     (R30)
    
    The situation of TrailingZeros8 is similar to TrailingZeros16.
    
    Change-Id: I473bdca06be8460a0be87abbae6fe640017e4c9d
    Reviewed-on: https://go-review.googlesource.com/c/go/+/156999Reviewed-by: default avatarCherry Zhang <cherryyz@google.com>
    Run-TryBot: Cherry Zhang <cherryyz@google.com>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    4e2b0dda
rewriteARM64.go 877 KB