SPARC Subroutines



Open Subroutines



Open Subroutine (Macro) Examples

        sll     %l0, 2, %l0
        sll     %l0, 3, %g1
        sub     %l0, %g1, %l0
        sll     %g1, 2, %g1
        add     %l0, %g1, %l0



Closed Subroutines



Call to a Label



SPARC registers



save



restore



Deep calls



Code Example

void f (int a, int b, int c) {
  ...
}

... f(1, 99, 77) ...

f: save %sp, -64, %sp ! a is in i0, b in i1, c in i2 ... ret restore

... ! put 1 in o0, 99 in o1, 77 in o2 call f delay slot instruction ...



Call and Return



Arguments



Stack frame

The stack frame is delimited by %fp to %sp (%fp > %sp):



Return Values



Example

int foo(int a, int b, int c, int d,
        int e, int f, int g, int h) {
  return (a + b + c + d + e + f + g + h);
}

main () { foo(1, 2, 3, 4, 5, 6, 7, 8) }



m4

foo
        define(hs, argd(8))
        define(gs, argd(7))
        define(fr, i5)
        define(er, i4)
        define(dr, i3)
        define(cr, i2)
        define(br, i1)
        define(ar, i0)

foo: save %sp, -(64+4+24), %sp ld [%fp + hs], %o0 ld [%fp + gs], %o1 add %o1, %o0, %o0 add %fr, %o0, %o0 ... add %ar, %o0, %o0 ret restore



m4

main
main:   save    %sp, -(64+4+24), %sp
        ld      %o0, 8
        st      [%sp - 4], %o0
        ld      %o0, 7
        st      [%sp - 8], %o0
        ld      %o0, 1
        ld      %o1, 2
        ld      %o2, 3
        ld      %o3, 4
        ld      %o4, 5
	call    foo
        ld      %o5, 6
        ret
        restore