• Aliaksandr Valialkin's avatar
    cmd/compile: optimize signed non-negative div/mod by a power of 2 · 0011cfbe
    Aliaksandr Valialkin authored
    This CL optimizes assembly for len() or cap() division
    by a power of 2 constants:
    
        func lenDiv(s []int) int {
            return len(s) / 16
        }
    
    amd64 assembly before the CL:
    
        MOVQ    "".s+16(SP), AX
        MOVQ    AX, CX
        SARQ    $63, AX
        SHRQ    $60, AX
        ADDQ    CX, AX
        SARQ    $4, AX
        MOVQ    AX, "".~r1+32(SP)
        RET
    
    amd64 assembly after the CL:
    
        MOVQ    "".s+16(SP), AX
        SHRQ    $4, AX
        MOVQ    AX, "".~r1+32(SP)
        RET
    
    The CL relies on the fact that len() and cap() result cannot
    be negative.
    
    Trigger stats for the added SSA rules on linux/amd64 when running
    make.bash:
    
         46 Div64
         12 Mod64
    
    The added SSA rules may trigger on more cases in the future
    when SSA values will be populated with the info on their
    lower bounds.
    
    For instance:
    
        func f(i int16) int16 {
            if i < 3 {
                return -1
            }
    
            // Lower bound of i is 3 here -> i is non-negative,
            // so unsigned arithmetics may be used here.
            return i % 16
        }
    
    Change-Id: I8bc6be5a03e71157ced533c01416451ff6f1a7f0
    Reviewed-on: https://go-review.googlesource.com/65530Reviewed-by: 's avatarKeith Randall <khr@golang.org>
    0011cfbe
asm_test.go 39.1 KB