mirror of
https://github.com/golang/go
synced 2024-11-17 04:04:46 -07:00
cmd/asm: add error check for move constant instructions on arm64
The current Go assembler encodes "MOVK $(0<<16|32|48), Rd" as the same binary with "MOVK $0, Rd", but for arm64 move constant instructions MOVK, MOVN and MOVZ, "op $0, Rd" and "op $(0<<16|32|48), Rd" have different semantics. In order not to change the way the assembler frontend parses constants, this patch adds a check for the zero shifts. Change-Id: Ia844c419ce49f63605b549e3a2e98d9075dd1cf1 Reviewed-on: https://go-review.googlesource.com/c/go/+/275812 Run-TryBot: Cherry Mui <cherryyz@google.com> TryBot-Result: Go Bot <gobot@golang.org> Trust: fannie zhang <Fannie.Zhang@arm.com> Reviewed-by: Cherry Mui <cherryyz@google.com>
This commit is contained in:
parent
2d6d558417
commit
6656269288
@ -430,4 +430,6 @@ TEXT errors(SB),$0
|
||||
STP (R3, R4), 0x1234567(R27) // ERROR "REGTMP used in large offset store"
|
||||
LDP 0x1234567(R27), (R3, R4) // ERROR "REGTMP used in large offset load"
|
||||
STP (R26, R27), 700(R2) // ERROR "cannot use REGTMP as source"
|
||||
MOVK $0, R10 // ERROR "zero shifts cannot be handled correctly"
|
||||
MOVK $(0<<32), R10 // ERROR "zero shifts cannot be handled correctly"
|
||||
RET
|
||||
|
@ -3877,6 +3877,9 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
|
||||
o1 = c.opirr(p, p.As)
|
||||
|
||||
d := p.From.Offset
|
||||
if d == 0 {
|
||||
c.ctxt.Diag("zero shifts cannot be handled correctly: %v", p)
|
||||
}
|
||||
s := movcon(d)
|
||||
if s < 0 || s >= 4 {
|
||||
c.ctxt.Diag("bad constant for MOVK: %#x\n%v", uint64(d), p)
|
||||
|
Loading…
Reference in New Issue
Block a user