ARM64 allows for a register to be specified with a return
instruction. While the assembler parsing and encoding currently
supports this, the preprocess function uses LR unconditionally.
Correct this such that if a register is specified, the register
is used.
Change-Id: I708f6c7e910d141559b60d2d5ee76ae2e1dc3a0e
Reviewed-on: https://go-review.googlesource.com/c/go/+/592796
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: David Chase <drchase@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
CASPD (R2, R3), (R2), (R8, R9) // 487c2248
// RET
- RET
+ RET // c0035fd6
+ RET R0 // 00005fd6
+ RET R6 // c0005fd6
+ RET R27 // 60035fd6
+ RET R30 // c0035fd6
RET foo(SB)
// B/BL/B.cond cases, and canonical names JMP, CALL.
var q *obj.Prog
var q1 *obj.Prog
- var retjmp *obj.LSym
for p := c.cursym.Func().Text; p != nil; p = p.Link {
o := p.As
switch o {
break
}
- retjmp = p.To.Sym
+ retJMP, retReg := p.To.Sym, p.To.Reg
+ if retReg == 0 {
+ retReg = REGLINK
+ }
p.To = obj.Addr{}
if c.cursym.Func().Text.Mark&LEAF != 0 {
if c.autosize != 0 {
p = q
}
- if retjmp != nil { // retjmp
+ if retJMP != nil {
p.As = AB
p.To.Type = obj.TYPE_BRANCH
- p.To.Sym = retjmp
+ p.To.Sym = retJMP
p.Spadj = +c.autosize
break
}
p.As = obj.ARET
p.To.Type = obj.TYPE_MEM
p.To.Offset = 0
- p.To.Reg = REGLINK
+ p.To.Reg = retReg
p.Spadj = +c.autosize
case AADD, ASUB: