]>
Commit | Line | Data |
---|---|---|
390b6370 | 1 | /* This file contains the floating-point save and restore routines. |
2 | * | |
f1717362 | 3 | * Copyright (C) 2004-2016 Free Software Foundation, Inc. |
390b6370 | 4 | * |
5 | * This file is free software; you can redistribute it and/or modify it | |
6 | * under the terms of the GNU General Public License as published by the | |
6bc9506f | 7 | * Free Software Foundation; either version 3, or (at your option) any |
390b6370 | 8 | * later version. |
9 | * | |
390b6370 | 10 | * This file is distributed in the hope that it will be useful, but |
11 | * WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 | * General Public License for more details. | |
14 | * | |
6bc9506f | 15 | * Under Section 7 of GPL version 3, you are granted additional |
16 | * permissions described in the GCC Runtime Library Exception, version | |
17 | * 3.1, as published by the Free Software Foundation. | |
18 | * | |
19 | * You should have received a copy of the GNU General Public License and | |
20 | * a copy of the GCC Runtime Library Exception along with this program; | |
21 | * see the files COPYING3 and COPYING.RUNTIME respectively. If not, see | |
22 | * <http://www.gnu.org/licenses/>. | |
390b6370 | 23 | */ |
24 | ||
25 | /* THE SAVE AND RESTORE ROUTINES CAN HAVE ONLY ONE GLOBALLY VISIBLE | |
26 | ENTRY POINT - callers have to jump to "saveFP+60" to save f29..f31, | |
27 | for example. For FP reg saves/restores, it takes one instruction | |
28 | (4 bytes) to do the operation; for Vector regs, 2 instructions are | |
29 | required (8 bytes.) | |
30 | ||
31 | MORAL: DO NOT MESS AROUND WITH THESE FUNCTIONS! */ | |
32 | ||
36fb8648 | 33 | #include "darwin-asm.h" |
34 | ||
390b6370 | 35 | .text |
36 | .align 2 | |
37 | ||
36fb8648 | 38 | /* saveFP saves R0 -- assumed to be the callers LR -- to 8/16(R1). */ |
390b6370 | 39 | |
40 | .private_extern saveFP | |
41 | saveFP: | |
42 | stfd f14,-144(r1) | |
43 | stfd f15,-136(r1) | |
44 | stfd f16,-128(r1) | |
45 | stfd f17,-120(r1) | |
46 | stfd f18,-112(r1) | |
47 | stfd f19,-104(r1) | |
48 | stfd f20,-96(r1) | |
49 | stfd f21,-88(r1) | |
50 | stfd f22,-80(r1) | |
51 | stfd f23,-72(r1) | |
52 | stfd f24,-64(r1) | |
53 | stfd f25,-56(r1) | |
54 | stfd f26,-48(r1) | |
55 | stfd f27,-40(r1) | |
56 | stfd f28,-32(r1) | |
57 | stfd f29,-24(r1) | |
58 | stfd f30,-16(r1) | |
59 | stfd f31,-8(r1) | |
36fb8648 | 60 | stg r0,SAVED_LR_OFFSET(r1) |
390b6370 | 61 | blr |
62 | ||
36fb8648 | 63 | /* restFP restores the caller`s LR from 8/16(R1). Note that the code for |
390b6370 | 64 | this starts at the offset of F30 restoration, so calling this |
65 | routine in an attempt to restore only F31 WILL NOT WORK (it would | |
66 | be a stupid thing to do, anyway.) */ | |
67 | ||
68 | .private_extern restFP | |
69 | restFP: | |
70 | lfd f14,-144(r1) | |
71 | lfd f15,-136(r1) | |
72 | lfd f16,-128(r1) | |
73 | lfd f17,-120(r1) | |
74 | lfd f18,-112(r1) | |
75 | lfd f19,-104(r1) | |
76 | lfd f20,-96(r1) | |
77 | lfd f21,-88(r1) | |
78 | lfd f22,-80(r1) | |
79 | lfd f23,-72(r1) | |
80 | lfd f24,-64(r1) | |
81 | lfd f25,-56(r1) | |
82 | lfd f26,-48(r1) | |
83 | lfd f27,-40(r1) | |
84 | lfd f28,-32(r1) | |
85 | lfd f29,-24(r1) | |
86 | /* <OFFSET OF F30 RESTORE> restore callers LR */ | |
36fb8648 | 87 | lg r0,SAVED_LR_OFFSET(r1) |
390b6370 | 88 | lfd f30,-16(r1) |
89 | /* and prepare for return to caller */ | |
90 | mtlr r0 | |
91 | lfd f31,-8(r1) | |
92 | blr |