4c15a83f4bf04d47b8c867964fa273a7492be1b3
[cacao.git] / src / vm / jit / mips / md-asm.h
1 /* src/vm/jit/mips/md-asm.h - assembler defines for MIPS ABI
2
3    Copyright (C) 1996-2005 R. Grafl, A. Krall, C. Kruegel, C. Oates,
4    R. Obermaisser, M. Platter, M. Probst, S. Ring, E. Steiner,
5    C. Thalinger, D. Thuernbeck, P. Tomsich, C. Ullrich, J. Wenninger,
6    Institut f. Computersprachen - TU Wien
7
8    This file is part of CACAO.
9
10    This program is free software; you can redistribute it and/or
11    modify it under the terms of the GNU General Public License as
12    published by the Free Software Foundation; either version 2, or (at
13    your option) any later version.
14
15    This program is distributed in the hope that it will be useful, but
16    WITHOUT ANY WARRANTY; without even the implied warranty of
17    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18    General Public License for more details.
19
20    You should have received a copy of the GNU General Public License
21    along with this program; if not, write to the Free Software
22    Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
23    02111-1307, USA.
24
25    Contact: cacao@complang.tuwien.ac.at
26
27    Authors: Christian Thalinger
28
29    Changes:
30
31    $Id: md-asm.h 3928 2005-12-09 14:30:12Z twisti $
32
33 */
34
35
36 #ifndef _MD_ASM_H
37 #define _MD_ASM_H
38
39 #include "config.h"
40
41
42 /* register defines ***********************************************************/
43
44 #if SIZEOF_VOID_P == 8
45
46 #define zero    $0
47 #define itmp1   $1
48 #define v0      $2
49 #define itmp2   $3
50 #define a0      $4
51 #define a1      $5
52 #define a2      $6
53 #define a3      $7
54
55 #define a4      $8
56 #define a5      $9
57 #define a6      $10
58 #define a7      $11
59 #define t0      $12
60 #define t1      $13
61 #define t2      $14
62 #define t3      $15
63
64 #define s0      $16
65 #define s1      $17
66 #define s2      $18
67 #define s3      $19
68 #define s4      $20
69 #define s5      $21
70 #define s6      $22
71 #define s7      $23
72
73 #define t8      $24
74 #define t9      $25
75 #define k0      $26
76 #define k1      $27
77
78 #define gp      $28
79 #define sp      $29
80 #define s8      $30
81 #define ra      $31
82
83 #define pv      s8
84 #define itmp3   t9
85
86 #define xptr    itmp1
87 #define xpc     itmp2
88 #define mptr    itmp3
89 #define mptrreg 25
90
91
92 #define fv0     $f0
93 #define ft0     $f1
94 #define ft1     $f2
95 #define ft2     $f3
96 #define ft3     $f4
97 #define ft4     $f5
98 #define ft5     $f6
99 #define ft6     $f7
100
101 #define ft7     $f8
102 #define ft8     $f9
103 #define ft9     $f10
104 #define ft10    $f11
105 #define fa0     $f12
106 #define fa1     $f13
107 #define fa2     $f14
108 #define fa3     $f15
109
110 #define fa4     $f16
111 #define fa5     $f17
112 #define fa6     $f18
113 #define fa7     $f19
114 #define ft11    $f20
115 #define ft12    $f21
116 #define ft13    $f22
117 #define ft14    $f23
118
119 #define fs0     $f24
120 #define ft15    $f25
121 #define fs1     $f26
122 #define ft16    $f27
123 #define fs2     $f28
124 #define ft17    $f29
125 #define fs3     $f30
126 #define ft18    $f31
127
128 #define fss0    $f20
129 #define fss1    $f22
130 #define fss2    $f25
131 #define fss3    $f27
132 #define fss4    $f29
133 #define fss5    $f31
134
135 #else /* SIZEOF_VOID_P == 8 */
136
137 #define zero    $0
138 #define itmp1   $1
139 #define v0      $2
140 #define v1      $3
141 #define a0      $4
142 #define a1      $5
143 #define a2      $6
144 #define a3      $7
145
146 #define t0      $8
147 #define t1      $9
148 #define t2      $10
149 #define t3      $11
150 #define t4      $12
151 #define t5      $13
152 #define t6      $14
153 #define t7      $15
154
155 #define s0      $16
156 #define s1      $17
157 #define s2      $18
158 #define s3      $19
159 #define s4      $20
160 #define s5      $21
161 #define s6      $22
162 #define s7      $23
163
164 #define itmp2   $24
165 #define itmp3   $25
166 #define k0      $26
167 #define k1      $27
168
169 #define gp      $28
170 #define sp      $29
171 #define s8      $30
172 #define ra      $31
173
174
175 #define pv      s8
176 #define xptr    itmp1
177 #define xpc     itmp2
178 #define mptr    itmp3
179 #define mptrreg 25
180
181
182 #define fv0     $f0
183 #define ftmp1   $f2
184 #define ftmp2   $f4
185 #define ftmp3   $f6
186
187 #define ft0     $f8
188 #define ft1     $f10
189 #define fa0     $f12
190 #define fa1     $f14
191
192 #define ft2     $f16
193 #define ft3     $f18
194 #define fs0     $f20
195 #define fs1     $f22
196
197 #define fs2     $f24
198 #define fs3     $f26
199 #define fs4     $f28
200 #define fs5     $f30
201
202 #endif /* SIZEOF_VOID_P == 8 */
203
204 #if SIZEOF_VOID_P == 8
205
206 #define aaddu   daddu
207 #define asubu   dsubu
208 #define aaddi   daddi
209 #define aaddiu  daddiu
210 #define ald     ld
211 #define ast     sd
212 #define ala     dla
213 #define asll    dsll
214
215 #define all     lld
216 #define asc     scd
217
218 #else
219
220 #define aaddu   addu
221 #define asubu   subu
222 #define aaddi   addi
223 #define aaddiu  addiu
224 #define ald     lw
225 #define ast     sw
226 #define ala     la
227 #define asll    sll
228
229 #define all     ll
230 #define asc     sc
231
232 #endif
233
234
235 /* save and restore macros ****************************************************/
236
237 #if SIZEOF_VOID_P == 8
238
239 #define SAVE_RETURN_REGISTERS(off) \
240         sd      v0,(0+(off))*8(sp)      ; \
241         sdc1    fv0,(1+(off))*8(sp)     ;
242
243 #define RESTORE_RETURN_REGISTERS(off) \
244         ld      v0,(0+(off))*8(sp)      ; \
245         ldc1    fv0,(1+(off))*8(sp)     ;
246
247
248 #define SAVE_ARGUMENT_REGISTERS(off) \
249         sd      a0,(0+(off))*8(sp)      ; \
250         sd      a1,(1+(off))*8(sp)      ; \
251         sd      a2,(2+(off))*8(sp)      ; \
252         sd      a3,(3+(off))*8(sp)      ; \
253         sd      a4,(4+(off))*8(sp)      ; \
254         sd      a5,(5+(off))*8(sp)      ; \
255         sd      a6,(6+(off))*8(sp)      ; \
256         sd      a7,(7+(off))*8(sp)      ; \
257         \
258         sdc1    fa0,(8+(off))*8(sp)     ; \
259         sdc1    fa1,(9+(off))*8(sp)     ; \
260         sdc1    fa2,(10+(off))*8(sp); \
261         sdc1    fa3,(11+(off))*8(sp); \
262         sdc1    fa4,(12+(off))*8(sp); \
263         sdc1    fa5,(13+(off))*8(sp); \
264         sdc1    fa6,(14+(off))*8(sp); \
265         sdc1    fa7,(15+(off))*8(sp); 
266
267 #define RESTORE_ARGUMENT_REGISTERS(off) \
268         ld      a0,(0+(off))*8(sp)      ; \
269         ld      a1,(1+(off))*8(sp)      ; \
270         ld      a2,(2+(off))*8(sp)      ; \
271         ld      a3,(3+(off))*8(sp)      ; \
272         ld      a4,(4+(off))*8(sp)      ; \
273         ld      a5,(5+(off))*8(sp)      ; \
274         ld      a6,(6+(off))*8(sp)      ; \
275         ld      a7,(7+(off))*8(sp)      ; \
276         \
277         ldc1    fa0,(8+(off))*8(sp); \
278         ldc1    fa1,(9+(off))*8(sp); \
279         ldc1    fa2,(10+(off))*8(sp); \
280         ldc1    fa3,(11+(off))*8(sp); \
281         ldc1    fa4,(12+(off))*8(sp); \
282         ldc1    fa5,(13+(off))*8(sp); \
283         ldc1    fa6,(14+(off))*8(sp); \
284         ldc1    fa7,(15+(off))*8(sp); 
285
286
287 #define SAVE_TEMPORARY_REGISTERS(off) \
288         sd      t0,(0+(off))*8(sp)      ; \
289         sd      t1,(1+(off))*8(sp)      ; \
290         sd      t2,(2+(off))*8(sp)      ; \
291         sd      t3,(3+(off))*8(sp)      ; \
292         sd      t8,(4+(off))*8(sp)      ; \
293         \
294         sdc1    ft3,(5+(off))*8(sp)     ; \
295         sdc1    ft4,(6+(off))*8(sp)     ; \
296         sdc1    ft5,(7+(off))*8(sp)     ; \
297         sdc1    ft6,(8+(off))*8(sp)     ; \
298         sdc1    ft7,(9+(off))*8(sp)     ; \
299         sdc1    ft8,(10+(off))*8(sp)    ; \
300         sdc1    ft9,(11+(off))*8(sp)    ; \
301         sdc1    ft10,(12+(off))*8(sp)   ; \
302         sdc1    ft11,(13+(off))*8(sp)   ; \
303         sdc1    ft12,(14+(off))*8(sp)   ; \
304         sdc1    ft13,(15+(off))*8(sp)   ; \
305         sdc1    ft14,(16+(off))*8(sp)   ; \
306         sdc1    ft15,(17+(off))*8(sp)   ; \
307         sdc1    ft16,(18+(off))*8(sp)   ; \
308         sdc1    ft17,(19+(off))*8(sp)   ; \
309         sdc1    ft18,(20+(off))*8(sp)   ;
310
311 #define RESTORE_TEMPORARY_REGISTERS(off) \
312         ld      t0,(0+(off))*8(sp)      ; \
313         ld      t1,(1+(off))*8(sp)      ; \
314         ld      t2,(2+(off))*8(sp)      ; \
315         ld      t3,(3+(off))*8(sp)      ; \
316         ld      t8,(4+(off))*8(sp)      ; \
317         \
318         ldc1    ft3,(5+(off))*8(sp)     ; \
319         ldc1    ft4,(6+(off))*8(sp)     ; \
320         ldc1    ft5,(7+(off))*8(sp)     ; \
321         ldc1    ft6,(8+(off))*8(sp)     ; \
322         ldc1    ft7,(9+(off))*8(sp)     ; \
323         ldc1    ft8,(10+(off))*8(sp)    ; \
324         ldc1    ft9,(11+(off))*8(sp)    ; \
325         ldc1    ft10,(12+(off))*8(sp)   ; \
326         ldc1    ft11,(13+(off))*8(sp)   ; \
327         ldc1    ft12,(14+(off))*8(sp)   ; \
328         ldc1    ft13,(15+(off))*8(sp)   ; \
329         ldc1    ft14,(16+(off))*8(sp)   ; \
330         ldc1    ft15,(17+(off))*8(sp)   ; \
331         ldc1    ft16,(18+(off))*8(sp)   ; \
332         ldc1    ft17,(19+(off))*8(sp)   ; \
333         ldc1    ft18,(20+(off))*8(sp)   ;
334
335 #else /* SIZEOF_VOID_P == 8 */
336
337 #define SAVE_RETURN_REGISTERS(off) \
338         sw      v0,(0+(off))*4(sp)      ; \
339         sw      v1,(1+(off))*4(sp)      ; \
340         sdc1    fv0,(2+(off))*4(sp)     ;
341
342 #define RESTORE_RETURN_REGISTERS(off) \
343         lw      v0,(0+(off))*4(sp)      ; \
344         lw      v1,(1+(off))*4(sp)      ; \
345         ldc1    fv0,(2+(off))*4(sp)     ;
346
347
348 #define SAVE_ARGUMENT_REGISTERS(off) \
349         sw      a0,(0+(off))*4(sp)      ; \
350         sw      a1,(1+(off))*4(sp)      ; \
351         sw      a2,(2+(off))*4(sp)      ; \
352         sw      a3,(3+(off))*4(sp)      ;
353
354 #define RESTORE_ARGUMENT_REGISTERS(off) \
355         lw      a0,(0+(off))*4(sp)      ; \
356         lw      a1,(1+(off))*4(sp)      ; \
357         lw      a2,(2+(off))*4(sp)      ; \
358         lw      a3,(3+(off))*4(sp)      ;
359
360
361 #define SAVE_TEMPORARY_REGISTERS(off) \
362         sw      t0,(0+(off))*4(sp)      ; \
363         sw      t1,(1+(off))*4(sp)      ; \
364         sw      t2,(2+(off))*4(sp)      ; \
365         sw      t3,(3+(off))*4(sp)      ; \
366         sw      t4,(4+(off))*4(sp)      ; \
367         sw      t5,(5+(off))*4(sp)      ; \
368         sw      t6,(6+(off))*4(sp)      ; \
369         sw      t7,(7+(off))*4(sp)      ;
370
371 #define RESTORE_TEMPORARY_REGISTERS(off) \
372         lw      t0,(0+(off))*4(sp)      ; \
373         lw      t1,(1+(off))*4(sp)      ; \
374         lw      t2,(2+(off))*4(sp)      ; \
375         lw      t3,(3+(off))*4(sp)      ; \
376         lw      t4,(4+(off))*4(sp)      ; \
377         lw      t5,(5+(off))*4(sp)      ; \
378         lw      t6,(6+(off))*4(sp)      ; \
379         lw      t7,(7+(off))*4(sp)      ;
380
381 #endif /* SIZEOF_VOID_P == 8 */
382
383 #endif /* _MD_ASM_H */
384
385
386 /*
387  * These are local overrides for various environment variables in Emacs.
388  * Please do not remove this and leave it at the end of the file, where
389  * Emacs will automagically detect them.
390  * ---------------------------------------------------------------------
391  * Local variables:
392  * mode: c
393  * indent-tabs-mode: t
394  * c-basic-offset: 4
395  * tab-width: 4
396  * End:
397  */