diff options
author | Thomas Martitz <kugel@rockbox.org> | 2010-08-24 12:38:42 +0000 |
---|---|---|
committer | Thomas Martitz <kugel@rockbox.org> | 2010-08-24 12:38:42 +0000 |
commit | 46454ac2a8a7d693ac135f0d4a9461bbcf24eea9 (patch) | |
tree | 86488784b36537f382ccd448c6684d60f1540527 /lib/libsetjmp/mips/setjmp.S | |
parent | 20de4c55a2ddfa802a01cc353884d73a934bf7ba (diff) | |
download | rockbox-46454ac2a8a7d693ac135f0d4a9461bbcf24eea9.tar.gz rockbox-46454ac2a8a7d693ac135f0d4a9461bbcf24eea9.zip |
Move setjmp to lib and add setjmp for sh (imported from newlib) and compile it as separate library.
It's used by both, plugins and codecs, and sh/hwcodec doesn't compile codecs
so it doesn't fit into sources.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@27869 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'lib/libsetjmp/mips/setjmp.S')
-rw-r--r-- | lib/libsetjmp/mips/setjmp.S | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/lib/libsetjmp/mips/setjmp.S b/lib/libsetjmp/mips/setjmp.S new file mode 100644 index 0000000000..7fa127a7a4 --- /dev/null +++ b/lib/libsetjmp/mips/setjmp.S | |||
@@ -0,0 +1,101 @@ | |||
1 | #include "config.h" | ||
2 | #include "mips.h" | ||
3 | |||
4 | /* This is a simple version of setjmp and longjmp for MIPS 32 and 64. | ||
5 | |||
6 | Ian Lance Taylor, Cygnus Support, 13 May 1993. */ | ||
7 | |||
8 | #ifdef __mips16 | ||
9 | /* This file contains 32 bit assembly code. */ | ||
10 | .set nomips16 | ||
11 | #endif | ||
12 | |||
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) | ||
25 | |||
26 | #define NUM_GPRS_SAVED 11 | ||
27 | |||
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 | ||
45 | |||
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 | ||
59 | |||
60 | #define GPOFF(INDEX) (INDEX * BYTES_PER_WORD) | ||
61 | #define FPOFF(INDEX) ((INDEX + NUM_GPRS_SAVED) * BYTES_PER_WORD) | ||
62 | |||
63 | /* int setjmp (jmp_buf); */ | ||
64 | .globl setjmp | ||
65 | .ent setjmp | ||
66 | setjmp: | ||
67 | .frame sp, 0, ra | ||
68 | |||
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 | ||
75 | |||
76 | move v0, $0 | ||
77 | j ra | ||
78 | |||
79 | .end setjmp | ||
80 | |||
81 | /* volatile void longjmp (jmp_buf, int); */ | ||
82 | .globl longjmp | ||
83 | .ent longjmp | ||
84 | longjmp: | ||
85 | .frame sp, 0, ra | ||
86 | |||
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 | ||
93 | |||
94 | bne a1, $0, 1f | ||
95 | li a1, 1 | ||
96 | 1: | ||
97 | move v0, a1 | ||
98 | j ra | ||
99 | |||
100 | .end longjmp | ||
101 | |||