]> Cypherpunks repositories - gostls13.git/commit
cmd/internal/obj: stop using as+ALAST as an opcode
authorMatthew Dempsky <mdempsky@google.com>
Mon, 7 Mar 2016 23:15:57 +0000 (15:15 -0800)
committerMatthew Dempsky <mdempsky@google.com>
Tue, 8 Mar 2016 00:11:15 +0000 (00:11 +0000)
commite853131699680c875d2d4e6cf82d959272dacd00
treee3d952bc7da2fdd912e312162ea7eb834ce75518
parent399f0f5fe8029e31e742e0341c7ddfd2097f3926
cmd/internal/obj: stop using as+ALAST as an opcode

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: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
src/cmd/internal/obj/arm/asm5.go
src/cmd/internal/obj/mips/asm0.go