summaryrefslogtreecommitdiff
path: root/SCM/setjump.mar
blob: 3fc223c14f5badb43dd940364679992da68a0a65 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
        .title setjump and longjump

;       The VAX C runtime library uses the $unwind utility for
;       implementing longjmp.  That fails if your program does not
;       follow normal stack decipline.  This is a dirty implementation
;       of setjmp and longjmp that does not have that problem.  The
;       names longjmp and setjmp are avoided so that the code can be
;       linked with the vax c runtime library without name clashes.

;	This code was contributed by an anonymous reviewer from
;	comp.sources.reviewed.

        .entry  setjump,^M<IV>
        movl    4(ap),r0
        movq    r2,(r0)+
        movq    r4,(r0)+
        movq    r6,(r0)+
        movq    r8,(r0)+
        movq    r10,(r0)+
        movl    fp,(r0)+
        movo    4(fp),(r0)+
        movq    20(fp),(r0)
        clrl    r0
        ret

        .entry  longjump,^M<IV>
        movl    4(ap),r0
        movq    (r0)+,r2
        movq    (r0)+,r4
        movq    (r0)+,r6
        movq    (r0)+,r8
        movq    (r0)+,r10
        movl    (r0)+,r1
        movo    (r0)+,4(r1)
        movq    (r0),20(r1)
        movl    8(ap),r0
        movl    r1,fp
        ret
        .end