]> Cypherpunks repositories - gostls13.git/commitdiff
changed 5c calling convention to use stack exclusively for in
authorKai Backman <kaib@golang.org>
Fri, 18 Sep 2009 23:45:41 +0000 (16:45 -0700)
committerKai Backman <kaib@golang.org>
Fri, 18 Sep 2009 23:45:41 +0000 (16:45 -0700)
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

src/cmd/5g/ggen.c
src/cmd/5g/gobj.c
src/cmd/5l/5.out.h
src/pkg/runtime/arm/asm.s
src/pkg/runtime/arm/vlop.s
src/pkg/runtime/linux/arm/sys.s

index 00b44b080e58e5b236a020a09691cf3be64deac3..9f4cc35b7a1b6c5a220b745715a0fedf74dc83ec 100644 (file)
@@ -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) {
index 8cb1a54d167fd6a328e6fc21574aec617bced4d4..bc29ba28bf1e11185b86fda7f559cce754edaf9c 100644 (file)
@@ -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
index 39018030029b7a07217f915d3a55f57b60b4d2d7..f78b3f6b73b8b355e2e204eeab741ea54d51131e 100644 (file)
@@ -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
index c43b6eed57d2097f5963452707c320a26c545635..18e17be475a714eab48ed6b54690d1a2f9e085a9 100644 (file)
@@ -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
index 56771ec840b85af5f9d7ae52a9ff4e083e043ddd..2c1d583fdb5f879089edf5821eb499e35d1f2086 100644 (file)
@@ -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 */
index c61d08f0908bc6011aebaffa4c6a03ae1680b264..d7eb43e7393266c4c0dd22d7830b444767a097a8 100644 (file)
@@ -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