source: trunk/libs/newlib/src/newlib/libc/machine/mep/setjmp.S @ 444

Last change on this file since 444 was 444, checked in by satin@…, 6 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 2.0 KB
Line 
1#
2#  Setjmp/longjmp for MeP
3#
4#  DJ Delorie, Red Hat Inc.
5#
6#  19 32-bit words in the jmpbuf:
7#    $0
8#    $1
9#    ...
10#    $15
11#    $pc
12#    $hi
13#    $lo
14#
15#  Note that $0 is saved but not restored.  It can't be restored
16#  as it's the return value of setjmp, but we save it in case
17#  some application wants to see it in the jmp_buf.  Ideally,
18#  we should not need to save anything that is call-clobbered,
19#  but you never know what the user is going to tell gcc with -f
20#  options.
21
22        .noregerr
23        .text
24
25        .globl  setjmp
26        .type   setjmp,@function
27
28setjmp:
29
30        # $1 is the address of the buffer.  We return 0 in $0.
31
32        sw      $0, ($1)
33        sw      $1, 4($1)
34        sw      $2, 8($1)
35        sw      $3, 12($1)
36        sw      $4, 16($1)
37        sw      $5, 20($1)
38        sw      $6, 24($1)
39        sw      $7, 28($1)
40        sw      $8, 32($1)
41        sw      $9, 36($1)
42        sw      $10, 40($1)
43        sw      $11, 44($1)
44        sw      $12, 48($1)
45        sw      $13, 52($1)
46        sw      $14, 56($1)
47        sw      $15, 60($1)
48
49        ldc     $0, $lp
50        sw      $0, 64($1)
51        ldc     $0, $opt
52        sra     $0, 24
53        and3    $0, $0, 3
54        beqz    $0, sj_skip_hilo
55        ldc     $0, $hi
56        sw      $0, 68($1)
57        ldc     $0, $lo
58        sw      $0, 72($1)
59sj_skip_hilo:
60
61        mov     $0, 0
62        ret
63
64        .globl  longjmp
65        .type   longjmp,@function
66
67longjmp:
68
69        # $1 is the address of the buffer.  $2 is the value setjmp
70        # returns.  We do not faithfully restore $0 or $lp, because
71        # the act of calling setjmp clobbered those anyway.
72
73        bnez    $2, rv_not_zero
74        mov     $2, 1
75rv_not_zero:
76
77        # We restore $sp first so we can save the return value there,
78        # otherwise we'd need to have another unrestored register.
79        lw      $15, 60($1)
80        add3    $sp, $sp, -4
81        sw      $2, ($sp)
82
83        # Now restore the general registers.
84        lw      $2, 8($1)
85        lw      $3, 12($1)
86        lw      $4, 16($1)
87        lw      $5, 20($1)
88        lw      $6, 24($1)
89        lw      $7, 28($1)
90        lw      $8, 32($1)
91        lw      $9, 36($1)
92        lw      $10, 40($1)
93        lw      $11, 44($1)
94        lw      $12, 48($1)
95        lw      $13, 52($1)
96        lw      $14, 56($1)
97
98        # We restore $pc's value to $lp so that we can just ret later.
99        lw      $0, 64($1)
100        stc     $0, $lp
101        ldc     $0, $opt
102        sra     $0, 24
103        and3    $0, $0, 3
104        beqz    $0, lj_skip_hilo
105        lw      $0, 68($1)
106        stc     $0, $hi
107        lw      $0, 72($1)
108        stc     $0, $lo
109lj_skip_hilo:
110
111        # Restore $1
112        lw      $1, 8($1)
113
114        # Get the return value off the stack, and restore the stack.
115        lw      $0, ($sp)
116        add3    $sp, $sp, 4
117
118        ret
Note: See TracBrowser for help on using the repository browser.