]>
Commit | Line | Data |
---|---|---|
1057eaa7 | 1 | /* |
cc5f688d | 2 | * Save/restore host registers. |
1057eaa7 PB |
3 | * |
4 | * Copyright (c) 2007 CodeSourcery | |
5 | * | |
6 | * This library is free software; you can redistribute it and/or | |
7 | * modify it under the terms of the GNU Lesser General Public | |
8 | * License as published by the Free Software Foundation; either | |
9 | * version 2 of the License, or (at your option) any later version. | |
10 | * | |
11 | * This library is distributed in the hope that it will be useful, | |
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 | * Lesser General Public License for more details. | |
15 | * | |
16 | * You should have received a copy of the GNU Lesser General Public | |
8167ee88 | 17 | * License along with this library; if not, see <http://www.gnu.org/licenses/>. |
1057eaa7 PB |
18 | */ |
19 | ||
54604f74 AJ |
20 | /* The GCC global register variable extension is used to reserve some |
21 | host registers for use by generated code. However only the core parts of | |
22 | the translation engine are compiled with these settings. We must manually | |
1057eaa7 PB |
23 | save/restore these registers when called from regular code. |
24 | It is not sufficient to save/restore T0 et. al. as these may be declared | |
25 | with a datatype smaller than the actual register. */ | |
26 | ||
27 | #if defined(DECLARE_HOST_REGS) | |
28 | ||
29 | #define DO_REG(REG) \ | |
c227f099 AL |
30 | register host_reg_t reg_AREG##REG asm(AREG##REG); \ |
31 | volatile host_reg_t saved_AREG##REG; | |
1057eaa7 PB |
32 | |
33 | #elif defined(SAVE_HOST_REGS) | |
34 | ||
35 | #define DO_REG(REG) \ | |
36 | __asm__ __volatile__ ("" : "=r" (reg_AREG##REG)); \ | |
37 | saved_AREG##REG = reg_AREG##REG; | |
38 | ||
39 | #else | |
40 | ||
41 | #define DO_REG(REG) \ | |
42 | reg_AREG##REG = saved_AREG##REG; \ | |
43 | __asm__ __volatile__ ("" : : "r" (reg_AREG##REG)); | |
44 | ||
45 | #endif | |
46 | ||
47 | #ifdef AREG0 | |
48 | DO_REG(0) | |
49 | #endif | |
50 | ||
51 | #ifdef AREG1 | |
52 | DO_REG(1) | |
53 | #endif | |
54 | ||
55 | #ifdef AREG2 | |
56 | DO_REG(2) | |
57 | #endif | |
58 | ||
1057eaa7 PB |
59 | #undef SAVE_HOST_REGS |
60 | #undef DECLARE_HOST_REGS | |
61 | #undef DO_REG |