nod.val.u.reg = REGSP;
nod.addable = 1;
- nod.xoffset = fp->width;
+ nod.xoffset = fp->width + 4; // +4: saved lr at 0(SP)
nod.type = fp->type;
cgen_as(res, &nod);
}
nod1.val.u.reg = REGSP;
nod1.addable = 1;
- nod1.xoffset = fp->width;
+ nod1.xoffset = fp->width + 4; // +4: saved lr at 0(SP)
nod1.type = fp->type;
if(res->op != OREGISTER) {
void
genembedtramp(Type *rcvr, Type *method, Sym *newnam)
{
+ // TODO(kaib): re-implement genembedtramp
+ genwrapper(rcvr, method, newnam);
+/*
Sym *e;
int c, d, o;
Prog *p;
//print("4. %P\n", p);
pc->as = ARET; // overwrite AEND
+*/
}
void
// uintptr gosave(Gobuf*)
// save state in Gobuf; setjmp
TEXT gosave(SB), 7, $0
+ MOVW 0(FP), R0
MOVW SP, gobuf_sp(R0)
MOVW LR, gobuf_pc(R0)
MOVW g, gobuf_g(R0)
// void gogo(Gobuf*, uintptr)
// restore state from Gobuf; longjmp
TEXT gogo(SB), 7, $0
- MOVW R0, R1 // gobuf
- MOVW 8(SP), R0 // return 2nd arg
+ MOVW 0(FP), R1 // gobuf
+ MOVW 4(FP), R0 // return 2nd arg
MOVW gobuf_g(R1), g
MOVW 0(g), R2 // make sure g != nil
MOVW gobuf_sp(R1), SP // restore SP
// (call fn, returning to state in Gobuf)
// using frame size $-4 means do not save LR on stack.
TEXT gogocall(SB), 7, $-4
- MOVW 8(SP), R1 // fn
+ MOVW 0(FP), R0
+ MOVW 4(FP), R1 // fn
MOVW gobuf_g(R0), g
MOVW 0(g), R2 // make sure g != nil
MOVW gobuf_sp(R0), SP // restore SP
#define STREX(a,v,r) WORD $(0xe<<28|0x01800f90 | (a)<<16 | (r)<<12 | (v)<<0)
TEXT cas+0(SB),0,$12 /* r0 holds p */
+ MOVW 0(FP), R0
MOVW ov+4(FP), R1
MOVW nv+8(FP), R2
spin:
// JMP AX // but first run the deferred function
TEXT sys·memclr(SB),7,$20
-// R0 = addr and passes implicitly to memset
+ MOVW 0(FP), R0
MOVW $0, R1 // c = 0
MOVW R1, -16(SP)
MOVW 4(FP), R1 // n