mirror of
https://github.com/golang/go
synced 2024-11-26 08:17:59 -07:00
cmd/internal/obj/arm64: disable AL and NV for some condition operation instructions
According to the armv8-a reference manual, conditions AL and NV are not allowed for instructions CINC, CINV, CNEG, CSET and CSETM. This CL adds this check and the corresponding test cases. Change-Id: Icb496b7b13a353f41491f2de4d939a5cd88abb04 Reviewed-on: https://go-review.googlesource.com/c/go/+/317912 Reviewed-by: eric fang <eric.fang@arm.com> Reviewed-by: Cherry Mui <cherryyz@google.com> Trust: eric fang <eric.fang@arm.com> Run-TryBot: eric fang <eric.fang@arm.com> TryBot-Result: Go Bot <gobot@golang.org>
This commit is contained in:
parent
12d383c7c7
commit
c925e1546e
10
src/cmd/asm/internal/asm/testdata/arm64error.s
vendored
10
src/cmd/asm/internal/asm/testdata/arm64error.s
vendored
@ -52,6 +52,16 @@ TEXT errors(SB),$0
|
|||||||
NEGSW R7@>2, R5 // ERROR "unsupported shift operator"
|
NEGSW R7@>2, R5 // ERROR "unsupported shift operator"
|
||||||
CINC CS, R2, R3, R4 // ERROR "illegal combination"
|
CINC CS, R2, R3, R4 // ERROR "illegal combination"
|
||||||
CSEL LT, R1, R2 // ERROR "illegal combination"
|
CSEL LT, R1, R2 // ERROR "illegal combination"
|
||||||
|
CINC AL, R2, R3 // ERROR "invalid condition"
|
||||||
|
CINC NV, R2, R3 // ERROR "invalid condition"
|
||||||
|
CINVW AL, R2, R3 // ERROR "invalid condition"
|
||||||
|
CINV NV, R2, R3 // ERROR "invalid condition"
|
||||||
|
CNEG AL, R2, R3 // ERROR "invalid condition"
|
||||||
|
CNEGW NV, R2, R3 // ERROR "invalid condition"
|
||||||
|
CSET AL, R2 // ERROR "invalid condition"
|
||||||
|
CSET NV, R2 // ERROR "invalid condition"
|
||||||
|
CSETMW AL, R2 // ERROR "invalid condition"
|
||||||
|
CSETM NV, R2 // ERROR "invalid condition"
|
||||||
LDP.P 8(R2), (R2, R3) // ERROR "constrained unpredictable behavior"
|
LDP.P 8(R2), (R2, R3) // ERROR "constrained unpredictable behavior"
|
||||||
LDP.W 8(R3), (R2, R3) // ERROR "constrained unpredictable behavior"
|
LDP.W 8(R3), (R2, R3) // ERROR "constrained unpredictable behavior"
|
||||||
LDP (R1), (R2, R2) // ERROR "constrained unpredictable behavior"
|
LDP (R1), (R2, R2) // ERROR "constrained unpredictable behavior"
|
||||||
|
@ -3536,27 +3536,25 @@ func (c *ctxt7) asmout(p *obj.Prog, o *Optab, out []uint32) {
|
|||||||
o1 = c.oprrr(p, p.As)
|
o1 = c.oprrr(p, p.As)
|
||||||
|
|
||||||
cond := int(p.From.Reg)
|
cond := int(p.From.Reg)
|
||||||
if cond < COND_EQ || cond > COND_NV {
|
// AL and NV are not allowed for CINC/CINV/CNEG/CSET/CSETM instructions
|
||||||
|
if cond < COND_EQ || cond > COND_NV || (cond == COND_AL || cond == COND_NV) && p.From3Type() == obj.TYPE_NONE {
|
||||||
c.ctxt.Diag("invalid condition: %v", p)
|
c.ctxt.Diag("invalid condition: %v", p)
|
||||||
} else {
|
} else {
|
||||||
cond -= COND_EQ
|
cond -= COND_EQ
|
||||||
}
|
}
|
||||||
|
|
||||||
r := int(p.Reg)
|
r := int(p.Reg)
|
||||||
var rf int
|
var rf int = r
|
||||||
if r != 0 {
|
if p.From3Type() == obj.TYPE_NONE {
|
||||||
if p.From3Type() == obj.TYPE_NONE {
|
/* CINC/CINV/CNEG or CSET/CSETM*/
|
||||||
/* CINC/CINV/CNEG */
|
if r == 0 {
|
||||||
rf = r
|
/* CSET/CSETM */
|
||||||
cond ^= 1
|
rf = REGZERO
|
||||||
} else {
|
r = rf
|
||||||
rf = int(p.GetFrom3().Reg) /* CSEL */
|
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
/* CSET */
|
|
||||||
rf = REGZERO
|
|
||||||
r = rf
|
|
||||||
cond ^= 1
|
cond ^= 1
|
||||||
|
} else {
|
||||||
|
rf = int(p.GetFrom3().Reg) /* CSEL */
|
||||||
}
|
}
|
||||||
|
|
||||||
rt := int(p.To.Reg)
|
rt := int(p.To.Reg)
|
||||||
|
Loading…
Reference in New Issue
Block a user