Commit 24902c5b authored by Joel Sing's avatar Joel Sing

cmd/internal/obj/riscv: handle MOV rewrites in separate pass

Handle the rewriting of MOV pseudo-instructions in a separate pass. This allows
AMOV to be more readily used by other code, including AGETCALLERPC and ARET
implementations.

Updates #27532

Change-Id: Iea794121210048ed23ed0fb8f3c5e3cd5354a311
Reviewed-on: https://go-review.googlesource.com/c/go/+/212758Reviewed-by: default avatarCherry Zhang <cherryyz@google.com>
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 2ee2c623
...@@ -594,9 +594,8 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { ...@@ -594,9 +594,8 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
// Additional instruction rewriting. Any rewrites that change the number // Additional instruction rewriting. Any rewrites that change the number
// of instructions must occur here (before jump target resolution). // of instructions must occur here (before jump target resolution).
for p := cursym.Func.Text; p != nil; p = p.Link { for p := cursym.Func.Text; p != nil; p = p.Link {
if p.As == obj.AGETCALLERPC { switch p.As {
// Handle AGETCALLERPC early so we can use AMOV, which is then case obj.AGETCALLERPC:
// rewritten below.
if cursym.Leaf() { if cursym.Leaf() {
// MOV LR, Rd // MOV LR, Rd
p.As = AMOV p.As = AMOV
...@@ -608,14 +607,6 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { ...@@ -608,14 +607,6 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
p.From.Type = obj.TYPE_MEM p.From.Type = obj.TYPE_MEM
p.From.Reg = REG_SP p.From.Reg = REG_SP
} }
}
switch p.As {
case AMOV, AMOVB, AMOVH, AMOVW, AMOVBU, AMOVHU, AMOVWU, AMOVF, AMOVD:
// Rewrite MOV pseudo-instructions. This cannot be done in
// progedit, as SP offsets need to be applied before we split
// up some of the Addrs.
rewriteMOV(ctxt, newprog, p)
case obj.ACALL: case obj.ACALL:
switch p.To.Type { switch p.To.Type {
...@@ -666,6 +657,16 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) { ...@@ -666,6 +657,16 @@ func preprocess(ctxt *obj.Link, cursym *obj.LSym, newprog obj.ProgAlloc) {
} }
} }
// Rewrite MOV pseudo-instructions. This cannot be done in
// progedit, as SP offsets need to be applied before we split
// up some of the Addrs.
for p := cursym.Func.Text; p != nil; p = p.Link {
switch p.As {
case AMOV, AMOVB, AMOVH, AMOVW, AMOVBU, AMOVHU, AMOVWU, AMOVF, AMOVD:
rewriteMOV(ctxt, newprog, p)
}
}
// Split immediates larger than 12-bits. // Split immediates larger than 12-bits.
for p := cursym.Func.Text; p != nil; p = p.Link { for p := cursym.Func.Text; p != nil; p = p.Link {
switch p.As { switch p.As {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment