CACAO
md-asm.hpp
Go to the documentation of this file.
1 /* src/vm/jit/aarch64/md-asm.hpp - assembler defines for Aarch64 ABI
2 
3  Copyright (C) 1996-2013
4  CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
5 
6  This file is part of CACAO.
7 
8  This program is free software; you can redistribute it and/or
9  modify it under the terms of the GNU General Public License as
10  published by the Free Software Foundation; either version 2, or (at
11  your option) any later version.
12 
13  This program is distributed in the hope that it will be useful, but
14  WITHOUT ANY WARRANTY; without even the implied warranty of
15  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  General Public License for more details.
17 
18  You should have received a copy of the GNU General Public License
19  along with this program; if not, write to the Free Software
20  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21  02110-1301, USA.
22 
23 */
24 
25 
26 #ifndef MD_ASM_HPP_
27 #define MD_ASM_HPP_ 1
28 
29 
30 /* register defines ***********************************************************/
31 
32 #define a0 x0 /* argument & result registers */
33 #define a1 x1
34 #define a2 x2
35 #define a3 x3
36 #define a4 x4
37 #define a5 x5
38 #define a6 x6
39 #define a7 x7
40 
41 #define ires x8 /* indirect result location (structs) */
42 
43 #define t0 x12 /* temporary registers */
44 #define t1 x13
45 #define t2 x14
46 #define t3 x15
47 #define t4 x16
48 #define t5 x17
49 
50 #define xptr x9 /* exception pointer = itmp1 */
51 #define xpc x10 /* exception pc = itmp2 */
52 
53 #define itmp1 x9
54 #define itmp2 x10
55 #define itmp3 x11
56 
57 #define t0i w12
58 #define t1i w13
59 
60 #define ip0 x16 /* intra-procedure-call temporary registers */
61 #define ip1 x17
62 
63 #define platf x18 /* platform register (for platf-specific ABI) */
64 
65 #define pv x18 /* using platf for procedure vector */
66 #define mptr x10 /* using itmp2 for method pointer */
67 
68 #define s0 x19 /* variable registers, all following registers are callee saved reg */
69 #define s1 x20
70 #define s2 x21
71 #define s3 x22
72 #define s4 x23
73 #define s5 x24
74 #define s6 x25
75 #define s7 x26
76 #define s8 x27
77 #define s9 x28
78 
79 #define fp x29 /* frame pointer */
80 #define lr x30 /* link register */
81 #define sp sp /* stack pointer */
82 
83 #define zero xzr /* zero register */
84 
85 #define fa0 d0 /*argument and result register for SMID & FP */
86 #define fa1 d1
87 #define fa2 d2
88 #define fa3 d3
89 #define fa4 d4
90 #define fa5 d5
91 #define fa6 d6
92 #define fa7 d7
93 
94 #define fs0 d8
95 #define fs1 d9
96 #define fs2 d10
97 #define fs3 d11
98 #define fs4 d12
99 #define fs5 d13
100 #define fs6 d14
101 #define fs7 d15
102 
103 #define ft0 d19
104 #define ft1 d20
105 #define ft2 d21
106 #define ft3 d22
107 #define ft4 d23
108 #define ft5 d24
109 #define ft6 d25
110 #define ft7 d26
111 #define ft8 d27
112 #define ft9 d28
113 #define ft10 d29
114 #define ft11 d30
115 #define ft12 d31
116 
117 /* save and restore macros ***************************************************/
118 
119 #define SAVE_ARGUMENT_REGISTERS \
120  str a0, [sp] ; \
121  str a1, [sp, 1 * 8] ; \
122  str a2, [sp, 2 * 8] ; \
123  str a3, [sp, 3 * 8] ; \
124  str a4, [sp, 4 * 8] ; \
125  str a5, [sp, 5 * 8] ; \
126  str a6, [sp, 6 * 8] ; \
127  str a7, [sp, 7 * 8] ; \
128  \
129  str fa0, [sp, 8 * 8] ; \
130  str fa1, [sp, 9 * 8] ; \
131  str fa2, [sp, 10 * 8] ; \
132  str fa3, [sp, 11 * 8] ; \
133  str fa4, [sp, 12 * 8] ; \
134  str fa5, [sp, 13 * 8] ; \
135  str fa6, [sp, 14 * 8] ; \
136  str fa7, [sp, 15 * 8] ;
137 
138 #define RESTORE_ARGUMENT_REGISTERS \
139  ldr a0, [sp] ; \
140  ldr a1, [sp, 1 * 8] ; \
141  ldr a2, [sp, 2 * 8] ; \
142  ldr a3, [sp, 3 * 8] ; \
143  ldr a4, [sp, 4 * 8] ; \
144  ldr a5, [sp, 5 * 8] ; \
145  ldr a6, [sp, 6 * 8] ; \
146  ldr a7, [sp, 7 * 8] ; \
147  \
148  ldr fa0, [sp, 8 * 8] ; \
149  ldr fa1, [sp, 9 * 8] ; \
150  ldr fa2, [sp, 10 * 8] ; \
151  ldr fa3, [sp, 11 * 8] ; \
152  ldr fa4, [sp, 12 * 8] ; \
153  ldr fa5, [sp, 13 * 8] ; \
154  ldr fa6, [sp, 14 * 8] ; \
155  ldr fa7, [sp, 15 * 8] ;
156 
157 #define SAVE_TEMPORARY_REGISTERS(off) \
158  str t0, [sp, (0 + (off)) * 8] ; \
159  str t1, [sp, (1 + (off)) * 8] ; \
160  str t2, [sp, (2 + (off)) * 8] ; \
161  str t3, [sp, (3 + (off)) * 8] ; \
162  str t4, [sp, (4 + (off)) * 8] ; \
163  str t5, [sp, (5 + (off)) * 8] ; \
164  \
165  str ft0, [sp, (6 + (off)) * 8] ; \
166  str ft1, [sp, (7 + (off)) * 8] ; \
167  str ft2, [sp, (8 + (off)) * 8] ; \
168  str ft3, [sp, (9 + (off)) * 8] ; \
169  str ft4, [sp, (10 + (off)) * 8] ; \
170  str ft5, [sp, (11 + (off)) * 8] ; \
171  str ft6, [sp, (12 + (off)) * 8] ; \
172  str ft7, [sp, (13 + (off)) * 8] ; \
173  str ft8, [sp, (14 + (off)) * 8] ; \
174  str ft9, [sp, (15 + (off)) * 8] ; \
175  str ft10, [sp, (16 + (off)) * 8] ; \
176  str ft11, [sp, (17 + (off)) * 8] ; \
177  str ft12, [sp, (18 + (off)) * 8] ; \
178 
179 #define RESTORE_TEMPORARY_REGISTERS(off) \
180  ldr t0, [sp, (0 + (off)) * 8] ; \
181  ldr t1, [sp, (1 + (off)) * 8] ; \
182  ldr t2, [sp, (2 + (off)) * 8] ; \
183  ldr t3, [sp, (3 + (off)) * 8] ; \
184  ldr t3, [sp, (4 + (off)) * 8] ; \
185  ldr t3, [sp, (5 + (off)) * 8] ; \
186  \
187  ldr ft0, [sp, (6 + (off)) * 8] ; \
188  ldr ft1, [sp, (7 + (off)) * 8] ; \
189  ldr ft2, [sp, (8 + (off)) * 8] ; \
190  ldr ft3, [sp, (9 + (off)) * 8] ; \
191  ldr ft4, [sp, (10 + (off)) * 8] ; \
192  ldr ft5, [sp, (11 + (off)) * 8] ; \
193  ldr ft6, [sp, (12 + (off)) * 8] ; \
194  ldr ft7, [sp, (13 + (off)) * 8] ; \
195  ldr ft8, [sp, (14 + (off)) * 8] ; \
196  ldr ft9, [sp, (15 + (off)) * 8] ; \
197  ldr ft10, [sp, (16 + (off)) * 8] ; \
198  ldr ft11, [sp, (17 + (off)) * 8] ; \
199  ldr ft12, [sp, (18 + (off)) * 8] ; \
200 
201 #endif // MD_ASM_HPP_
202 
203 /*
204  * These are local overrides for various environment variables in Emacs.
205  * Please do not remove this and leave it at the end of the file, where
206  * Emacs will automagically detect them.
207  * ---------------------------------------------------------------------
208  * Local variables:
209  * mode: c++
210  * indent-tabs-mode: t
211  * c-basic-offset: 4
212  * tab-width: 4
213  * End:
214  */