root/test/sysperf/sw.S

                /*
                 * sw.S
                 *
                 * $DragonFly: src/test/sysperf/sw.S,v 1.1 2003/08/12 02:29:44 dillon Exp $
                 */
                .text
                .globl  qswitch, qrestore, qinit, qirestore, qstart

#if USE_ALL

#define PUSHAL          pushal
#define POPAL           popal

#endif

#if USE_CALLU1

#define PUSHAL          \
        pushl   %ebx ;  \
        pushl   %esi ;  \
        pushl   %edi ;  \
        pushl   %ebp 

#define POPAL           \
        popl    %ebp ;  \
        popl    %edi ;  \
        popl    %esi ;  \
        popl    %ebx

#endif

#if USE_CALLU2

#define PUSHAL                  \
        subl    $16,%esp ;      \
        movl    %ebx,(%esp) ;   \
        movl    %esi,4(%esp) ;  \
        movl    %edi,8(%esp) ;  \
        movl    %ebp,12(%esp)

#define POPAL                   \
        movl    (%esp),%ebx ;   \
        movl    4(%esp),%esi ;  \
        movl    8(%esp),%edi ;  \
        movl    12(%esp),%ebp ; \
        addl    $16,%esp

#endif

                /* qswitch(&olddesc, newdesc) */
qswitch:
                movl    8(%esp),%eax    /* new state */
                movl    4(%esp),%edx    /* save old state */
                PUSHAL
                pushl   $qrestore
                movl    %esp,(%edx)
                movl    %eax,%esp
                ret

                /* qstart(newdesc) */
qstart:
                movl    4(%esp),%esp
                ret

qrestore:
                POPAL
                ret

                /* newdesc = qinit(topofstk, func, arg) */
qinit:
                movl    4(%esp),%eax
                subl    $16,%eax
                movl    $qirestore,0(%eax)
                movl    8(%esp),%ecx
                movl    %ecx,4(%eax)
                movl    $0,8(%eax)
                movl    12(%esp),%ecx
                movl    %ecx,12(%eax)
                ret /* return eax */

qirestore:
                ret