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