Update of Czech language - FS#11371 by Marek Salaba
[kugel-rb.git] / apps / codecs / lib / setjmp_mips.S
blob7fa127a7a4a011993a8cbe9501840e7c1c2315f9
1 #include "config.h"
2 #include "mips.h"
4 /* This is a simple version of setjmp and longjmp for MIPS 32 and 64.
6    Ian Lance Taylor, Cygnus Support, 13 May 1993.  */
8 #ifdef __mips16
9 /* This file contains 32 bit assembly code.  */
10         .set nomips16
11 #endif
13 #define GPR_LAYOUT                  \
14         GPR_OFFSET ($16, 0);        \
15         GPR_OFFSET ($17, 1);        \
16         GPR_OFFSET ($18, 2);        \
17         GPR_OFFSET ($19, 3);        \
18         GPR_OFFSET ($20, 4);        \
19         GPR_OFFSET ($21, 5);        \
20         GPR_OFFSET ($22, 6);        \
21         GPR_OFFSET ($23, 7);        \
22         GPR_OFFSET ($29, 8);        \
23         GPR_OFFSET ($30, 9);        \
24         GPR_OFFSET ($31, 10)
26 #define NUM_GPRS_SAVED 11
28 #ifdef __mips_hard_float
29 #define FPR_LAYOUT                   \
30         FPR_OFFSET ($f20, 0);        \
31         FPR_OFFSET ($f21, 1);        \
32         FPR_OFFSET ($f22, 2);        \
33         FPR_OFFSET ($f23, 3);        \
34         FPR_OFFSET ($f24, 4);        \
35         FPR_OFFSET ($f25, 5);        \
36         FPR_OFFSET ($f26, 6);        \
37         FPR_OFFSET ($f27, 7);        \
38         FPR_OFFSET ($f28, 8);        \
39         FPR_OFFSET ($f29, 9);        \
40         FPR_OFFSET ($f30, 10);       \
41         FPR_OFFSET ($f31, 11)
42 #else
43 #define FPR_LAYOUT
44 #endif
46 #if CPU_MIPS == 64
47 #define BYTES_PER_WORD 8
48 #define LOAD_GPR  ld
49 #define LOAD_FPR  ldc1
50 #define STORE_GPR sd
51 #define STORE_FPR sdc1
52 #else
53 #define BYTES_PER_WORD 4
54 #define LOAD_GPR  lw
55 #define LOAD_FPR  lwc1
56 #define STORE_GPR sw
57 #define STORE_FPR swc1
58 #endif
60 #define GPOFF(INDEX) (INDEX * BYTES_PER_WORD)
61 #define FPOFF(INDEX) ((INDEX + NUM_GPRS_SAVED) * BYTES_PER_WORD)
63 /* int setjmp (jmp_buf);  */
64         .globl      setjmp
65         .ent        setjmp
66 setjmp:
67         .frame      sp, 0, ra
69 #define GPR_OFFSET(REG, INDEX) STORE_GPR REG,GPOFF(INDEX)(a0)
70 #define FPR_OFFSET(REG, INDEX) STORE_FPR REG,FPOFF(INDEX)(a0)
71         GPR_LAYOUT
72         FPR_LAYOUT
73 #undef GPR_OFFSET
74 #undef FPR_OFFSET
76         move        v0, $0
77         j           ra
79         .end        setjmp
81 /* volatile void longjmp (jmp_buf, int);  */
82         .globl      longjmp
83         .ent        longjmp
84 longjmp:
85         .frame      sp, 0, ra
87 #define GPR_OFFSET(REG, INDEX) LOAD_GPR REG,GPOFF(INDEX)(a0)
88 #define FPR_OFFSET(REG, INDEX) LOAD_FPR REG,FPOFF(INDEX)(a0)
89         GPR_LAYOUT
90         FPR_LAYOUT
91 #undef GPR_OFFSET
92 #undef FPR_OFFSET
94         bne        a1, $0, 1f
95         li         a1, 1
97         move       v0, a1
98         j          ra
100         .end       longjmp