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
|