p.Reg = REG_R2
}
- // BHI done
- p = obj.Appendp(ctxt, p)
- q1 := p
+ // BLS do-morestack
+ bls := obj.Appendp(ctxt, p)
+ bls.As = ABLS
+ bls.To.Type = obj.TYPE_BRANCH
- p.As = ABHI
- p.To.Type = obj.TYPE_BRANCH
+ var last *obj.Prog
+ for last = ctxt.Cursym.Text; last.Link != nil; last = last.Link {
+ }
// MOV LR, R3
- p = obj.Appendp(ctxt, p)
-
- p.As = AMOVD
- p.From.Type = obj.TYPE_REG
- p.From.Reg = REGLINK
- p.To.Type = obj.TYPE_REG
- p.To.Reg = REG_R3
+ movlr := obj.Appendp(ctxt, last)
+ movlr.As = AMOVD
+ movlr.From.Type = obj.TYPE_REG
+ movlr.From.Reg = REGLINK
+ movlr.To.Type = obj.TYPE_REG
+ movlr.To.Reg = REG_R3
if q != nil {
- q.Pcond = p
+ q.Pcond = movlr
+ }
+ bls.Pcond = movlr
+
+ debug := movlr
+ if false {
+ debug = obj.Appendp(ctxt, debug)
+ debug.As = AMOVD
+ debug.From.Type = obj.TYPE_CONST
+ debug.From.Offset = int64(framesize)
+ debug.To.Type = obj.TYPE_REG
+ debug.To.Reg = REGTMP
}
-
- // TODO(minux): only for debug
- p = obj.Appendp(ctxt, p)
- p.As = AMOVD
- p.From.Type = obj.TYPE_CONST
- p.From.Offset = int64(framesize)
- p.To.Type = obj.TYPE_REG
- p.To.Reg = REGTMP
// BL runtime.morestack(SB)
- p = obj.Appendp(ctxt, p)
-
- p.As = ABL
- p.To.Type = obj.TYPE_BRANCH
- if ctxt.Cursym.Cfunc != 0 {
- p.To.Sym = obj.Linklookup(ctxt, "runtime.morestackc", 0)
- } else if ctxt.Cursym.Text.From3.Offset&obj.NEEDCTXT == 0 {
- p.To.Sym = obj.Linklookup(ctxt, "runtime.morestack_noctxt", 0)
- } else {
- p.To.Sym = obj.Linklookup(ctxt, "runtime.morestack", 0)
+ call := obj.Appendp(ctxt, debug)
+ call.As = ABL
+ call.To.Type = obj.TYPE_BRANCH
+ morestack := "runtime.morestack"
+ switch {
+ case ctxt.Cursym.Cfunc != 0:
+ morestack = "runtime.morestackc"
+ case ctxt.Cursym.Text.From3.Offset&obj.NEEDCTXT == 0:
+ morestack = "runtime.morestack_noctxt"
}
+ call.To.Sym = obj.Linklookup(ctxt, morestack, 0)
// B start
- p = obj.Appendp(ctxt, p)
-
- p.As = AB
- p.To.Type = obj.TYPE_BRANCH
- p.Pcond = ctxt.Cursym.Text.Link
-
- // placeholder for q1's jump target
- p = obj.Appendp(ctxt, p)
+ jmp := obj.Appendp(ctxt, call)
+ jmp.As = AB
+ jmp.To.Type = obj.TYPE_BRANCH
+ jmp.Pcond = ctxt.Cursym.Text.Link
- p.As = obj.ANOP
- q1.Pcond = p
+ // placeholder for bls's jump target
+ // p = obj.Appendp(ctxt, p)
+ // p.As = obj.ANOP
- return p
+ return bls
}
func progedit(ctxt *obj.Link, p *obj.Prog) {