• Matthew Dempsky's avatar
    cmd/internal/obj: stop using as+ALAST as an opcode · e8531316
    Matthew Dempsky authored
    Currently, package obj reserves a range of 1<<12 opcodes for each
    target architecture.  E.g., mips64 has [6<<12, 7<<12).
    
    However, because mips.ABEQ and mips.ALAST are both within that range,
    the expression mips.ABEQ+mips.ALAST in turn falls (far) outside that
    range around 12<<12, meaning it could theoretically collide with
    another arch's opcodes.
    
    More practically, it's a problem because 12<<12 overflows an int16,
    which hampers fixing #14692.  (We could also just switch to uint16 to
    avoid the overflow, but that still leaves the first problem.)
    
    As a workaround, use Michael Hudson-Doyle's solution from
    https://golang.org/cl/20182 and use negative values for these variant
    instructions.
    
    Passes toolstash -cmp for GOARCH=arm and GOARCH=mips64.
    
    Updates #14692.
    
    Change-Id: Iad797d10652360109fa4db19d4d1edb6529fc2c0
    Reviewed-on: https://go-review.googlesource.com/20345
    Run-TryBot: Matthew Dempsky <mdempsky@google.com>
    Reviewed-by: 's avatarBrad Fitzpatrick <bradfitz@golang.org>
    TryBot-Result: Gobot Gobot <gobot@golang.org>
    e8531316
asm5.go 67.6 KB