aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKai Backman <kaib@golang.org>2009-09-18 16:45:41 -0700
committerKai Backman <kaib@golang.org>2009-09-18 16:45:41 -0700
commit46e392e01c630dee41a67e01223b538aae9dc9b5 (patch)
treee613ef968c90fef5103915306dc7f848c26afe13
parent2e5a588718ed741112a5a8c04bbf1d53e417fbda (diff)
downloadgo-46e392e01c630dee41a67e01223b538aae9dc9b5.tar.xz
changed 5c calling convention to use stack exclusively for in
params. a number of fixes to assembly routines that assumed R0 had the first arg. one stack offset fix, arm pushes the link register on stack top. go/test: passes 65% (235/364) tests R=rsc APPROVED=rsc DELTA=20 (11 added, 0 deleted, 9 changed) OCL=34809 CL=34812
-rw-r--r--src/cmd/5g/ggen.c4
-rw-r--r--src/cmd/5g/gobj.c4
-rw-r--r--src/cmd/5l/5.out.h3
-rw-r--r--src/pkg/runtime/arm/asm.s11
-rw-r--r--src/pkg/runtime/arm/vlop.s1
-rw-r--r--src/pkg/runtime/linux/arm/sys.s6
6 files changed, 20 insertions, 9 deletions
diff --git a/src/cmd/5g/ggen.c b/src/cmd/5g/ggen.c
index 00b44b080e..9f4cc35b7a 100644
--- a/src/cmd/5g/ggen.c
+++ b/src/cmd/5g/ggen.c
@@ -275,7 +275,7 @@ cgen_callret(Node *n, Node *res)
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);
}
@@ -305,7 +305,7 @@ cgen_aret(Node *n, Node *res)
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) {
diff --git a/src/cmd/5g/gobj.c b/src/cmd/5g/gobj.c
index 8cb1a54d16..bc29ba28bf 100644
--- a/src/cmd/5g/gobj.c
+++ b/src/cmd/5g/gobj.c
@@ -621,6 +621,9 @@ dsymptr(Sym *s, int off, Sym *x, int xoff)
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;
@@ -692,6 +695,7 @@ out:
//print("4. %P\n", p);
pc->as = ARET; // overwrite AEND
+*/
}
void
diff --git a/src/cmd/5l/5.out.h b/src/cmd/5l/5.out.h
index 3901803002..f78b3f6b73 100644
--- a/src/cmd/5l/5.out.h
+++ b/src/cmd/5l/5.out.h
@@ -38,7 +38,8 @@
#define ALLTHUMBS (1<<3)
#define REGRET 0
-#define REGARG 0
+/* -1 disables use of REGARG */
+#define REGARG -1
/* compiler allocates R1 up as temps */
/* compiler allocates register variables R3 up */
#define REGEXT 10
diff --git a/src/pkg/runtime/arm/asm.s b/src/pkg/runtime/arm/asm.s
index c43b6eed57..18e17be475 100644
--- a/src/pkg/runtime/arm/asm.s
+++ b/src/pkg/runtime/arm/asm.s
@@ -92,6 +92,7 @@ TEXT breakpoint(SB),7,$0
// 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)
@@ -101,8 +102,8 @@ TEXT gosave(SB), 7, $0
// 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
@@ -113,7 +114,8 @@ TEXT gogo(SB), 7, $0
// (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
@@ -222,6 +224,7 @@ TEXT sys·morestackx(SB), 7, $-4
#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:
@@ -253,7 +256,7 @@ TEXT jmpdefer(SB), 7, $0
// 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
diff --git a/src/pkg/runtime/arm/vlop.s b/src/pkg/runtime/arm/vlop.s
index 56771ec840..2c1d583fdb 100644
--- a/src/pkg/runtime/arm/vlop.s
+++ b/src/pkg/runtime/arm/vlop.s
@@ -31,6 +31,7 @@ arg=0
/* replaced use of R10 by R11 because the former can be the data segment base register */
TEXT _mulv(SB), $0
+ MOVW 0(FP), R0
MOVW 8(FP), R2 /* l0 */
MOVW 4(FP), R3 /* h0 */
MOVW 16(FP), R4 /* l1 */
diff --git a/src/pkg/runtime/linux/arm/sys.s b/src/pkg/runtime/linux/arm/sys.s
index c61d08f090..d7eb43e739 100644
--- a/src/pkg/runtime/linux/arm/sys.s
+++ b/src/pkg/runtime/linux/arm/sys.s
@@ -12,8 +12,9 @@
#define SYS_mmap2 (SYS_BASE + 192)
TEXT write(SB),7,$0
- MOVW 8(SP), R1
- MOVW 12(SP), R2
+ MOVW 0(FP), R0
+ MOVW 4(FP), R1
+ MOVW 8(FP), R2
SWI $SYS_write
RET
@@ -22,6 +23,7 @@ TEXT exit(SB),7,$0
SWI $SYS_exit
TEXT sys·mmap(SB),7,$0
+ MOVW 0(FP), R0
MOVW 4(FP), R1
MOVW 8(FP), R2
MOVW 12(FP), R3