Statistics
| Branch: | Revision:

root / dyngen-exec.h @ 57be54bb

History | View | Annotate | Download (7.3 kB)

1 79638566 bellard
/*
2 79638566 bellard
 *  dyngen defines for micro operation code
3 79638566 bellard
 *
4 79638566 bellard
 *  Copyright (c) 2003 Fabrice Bellard
5 79638566 bellard
 *
6 79638566 bellard
 * This library is free software; you can redistribute it and/or
7 79638566 bellard
 * modify it under the terms of the GNU Lesser General Public
8 79638566 bellard
 * License as published by the Free Software Foundation; either
9 79638566 bellard
 * version 2 of the License, or (at your option) any later version.
10 79638566 bellard
 *
11 79638566 bellard
 * This library is distributed in the hope that it will be useful,
12 79638566 bellard
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 79638566 bellard
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14 79638566 bellard
 * Lesser General Public License for more details.
15 79638566 bellard
 *
16 79638566 bellard
 * You should have received a copy of the GNU Lesser General Public
17 79638566 bellard
 * License along with this library; if not, write to the Free Software
18 79638566 bellard
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
19 79638566 bellard
 */
20 67867308 bellard
#if !defined(__DYNGEN_EXEC_H__)
21 67867308 bellard
#define __DYNGEN_EXEC_H__
22 67867308 bellard
23 ec530c81 bellard
/* prevent Solaris from trying to typedef FILE in gcc's
24 ec530c81 bellard
   include/floatingpoint.h which will conflict with the
25 ec530c81 bellard
   definition down below */
26 ec530c81 bellard
#ifdef __sun__
27 ec530c81 bellard
#define _FILEDEFED
28 ec530c81 bellard
#endif
29 ec530c81 bellard
30 1e6cae95 bellard
/* NOTE: standard headers should be used with special care at this
31 1e6cae95 bellard
   point because host CPU registers are used as global variables. Some
32 1e6cae95 bellard
   host headers do not allow that. */
33 513b500f bellard
#include <stddef.h>
34 513b500f bellard
35 79638566 bellard
typedef unsigned char uint8_t;
36 79638566 bellard
typedef unsigned short uint16_t;
37 79638566 bellard
typedef unsigned int uint32_t;
38 74ccb34e bellard
// Linux/Sparc64 defines uint64_t
39 74ccb34e bellard
#if !(defined (__sparc_v9__) && defined(__linux__))
40 4f2ac237 bellard
/* XXX may be done for all 64 bits targets ? */
41 b8076a74 bellard
#if defined (__x86_64__) || defined(__ia64)
42 4f2ac237 bellard
typedef unsigned long uint64_t;
43 4f2ac237 bellard
#else
44 79638566 bellard
typedef unsigned long long uint64_t;
45 4f2ac237 bellard
#endif
46 74ccb34e bellard
#endif
47 79638566 bellard
48 ec530c81 bellard
/* if Solaris/__sun__, don't typedef int8_t, as it will be typedef'd
49 ec530c81 bellard
   prior to this and will cause an error in compliation, conflicting
50 ec530c81 bellard
   with /usr/include/sys/int_types.h, line 75 */
51 ec530c81 bellard
#ifndef __sun__
52 79638566 bellard
typedef signed char int8_t;
53 ec530c81 bellard
#endif
54 79638566 bellard
typedef signed short int16_t;
55 79638566 bellard
typedef signed int int32_t;
56 74ccb34e bellard
// Linux/Sparc64 defines int64_t
57 74ccb34e bellard
#if !(defined (__sparc_v9__) && defined(__linux__))
58 b8076a74 bellard
#if defined (__x86_64__) || defined(__ia64)
59 4f2ac237 bellard
typedef signed long int64_t;
60 4f2ac237 bellard
#else
61 79638566 bellard
typedef signed long long int64_t;
62 4f2ac237 bellard
#endif
63 74ccb34e bellard
#endif
64 79638566 bellard
65 67867308 bellard
#define INT8_MIN                (-128)
66 67867308 bellard
#define INT16_MIN                (-32767-1)
67 67867308 bellard
#define INT32_MIN                (-2147483647-1)
68 67867308 bellard
#define INT64_MIN                (-(int64_t)(9223372036854775807)-1)
69 67867308 bellard
#define INT8_MAX                (127)
70 67867308 bellard
#define INT16_MAX                (32767)
71 67867308 bellard
#define INT32_MAX                (2147483647)
72 67867308 bellard
#define INT64_MAX                ((int64_t)(9223372036854775807))
73 67867308 bellard
#define UINT8_MAX                (255)
74 67867308 bellard
#define UINT16_MAX                (65535)
75 67867308 bellard
#define UINT32_MAX                (4294967295U)
76 67867308 bellard
#define UINT64_MAX                ((uint64_t)(18446744073709551615))
77 67867308 bellard
78 79638566 bellard
typedef struct FILE FILE;
79 79638566 bellard
extern int fprintf(FILE *, const char *, ...);
80 79638566 bellard
extern int printf(const char *, ...);
81 513b500f bellard
#undef NULL
82 79638566 bellard
#define NULL 0
83 79638566 bellard
84 79638566 bellard
#ifdef __i386__
85 79638566 bellard
#define AREG0 "ebp"
86 79638566 bellard
#define AREG1 "ebx"
87 79638566 bellard
#define AREG2 "esi"
88 79638566 bellard
#define AREG3 "edi"
89 79638566 bellard
#endif
90 bc51c5c9 bellard
#ifdef __x86_64__
91 bc51c5c9 bellard
#define AREG0 "rbp"
92 bc51c5c9 bellard
#define AREG1 "rbx"
93 bc51c5c9 bellard
#define AREG2 "r12"
94 bc51c5c9 bellard
#define AREG3 "r13"
95 dff293e7 bellard
//#define AREG4 "r14"
96 dff293e7 bellard
//#define AREG5 "r15"
97 bc51c5c9 bellard
#endif
98 79638566 bellard
#ifdef __powerpc__
99 79638566 bellard
#define AREG0 "r27"
100 79638566 bellard
#define AREG1 "r24"
101 79638566 bellard
#define AREG2 "r25"
102 79638566 bellard
#define AREG3 "r26"
103 bf71c9d9 bellard
/* XXX: suppress this hack */
104 bf71c9d9 bellard
#if defined(CONFIG_USER_ONLY)
105 79638566 bellard
#define AREG4 "r16"
106 79638566 bellard
#define AREG5 "r17"
107 79638566 bellard
#define AREG6 "r18"
108 79638566 bellard
#define AREG7 "r19"
109 79638566 bellard
#define AREG8 "r20"
110 79638566 bellard
#define AREG9 "r21"
111 79638566 bellard
#define AREG10 "r22"
112 79638566 bellard
#define AREG11 "r23"
113 bf71c9d9 bellard
#endif
114 79638566 bellard
#define USE_INT_TO_FLOAT_HELPERS
115 79638566 bellard
#define BUGGY_GCC_DIV64
116 79638566 bellard
#endif
117 79638566 bellard
#ifdef __arm__
118 79638566 bellard
#define AREG0 "r7"
119 79638566 bellard
#define AREG1 "r4"
120 79638566 bellard
#define AREG2 "r5"
121 79638566 bellard
#define AREG3 "r6"
122 79638566 bellard
#endif
123 79638566 bellard
#ifdef __mips__
124 79638566 bellard
#define AREG0 "s3"
125 79638566 bellard
#define AREG1 "s0"
126 79638566 bellard
#define AREG2 "s1"
127 79638566 bellard
#define AREG3 "s2"
128 79638566 bellard
#endif
129 79638566 bellard
#ifdef __sparc__
130 fdbb4691 bellard
#ifdef HOST_SOLARIS
131 fdbb4691 bellard
#define AREG0 "g2"
132 fdbb4691 bellard
#define AREG1 "g3"
133 fdbb4691 bellard
#define AREG2 "g4"
134 fdbb4691 bellard
#define AREG3 "g5"
135 fdbb4691 bellard
#define AREG4 "g6"
136 fdbb4691 bellard
#else
137 74ccb34e bellard
#ifdef __sparc_v9__
138 74ccb34e bellard
#define AREG0 "g1"
139 74ccb34e bellard
#define AREG1 "g4"
140 74ccb34e bellard
#define AREG2 "g5"
141 74ccb34e bellard
#define AREG3 "g7"
142 74ccb34e bellard
#else
143 79638566 bellard
#define AREG0 "g6"
144 79638566 bellard
#define AREG1 "g1"
145 79638566 bellard
#define AREG2 "g2"
146 79638566 bellard
#define AREG3 "g3"
147 79638566 bellard
#define AREG4 "l0"
148 79638566 bellard
#define AREG5 "l1"
149 79638566 bellard
#define AREG6 "l2"
150 79638566 bellard
#define AREG7 "l3"
151 79638566 bellard
#define AREG8 "l4"
152 79638566 bellard
#define AREG9 "l5"
153 79638566 bellard
#define AREG10 "l6"
154 79638566 bellard
#define AREG11 "l7"
155 fdbb4691 bellard
#endif
156 74ccb34e bellard
#endif
157 79638566 bellard
#define USE_FP_CONVERT
158 79638566 bellard
#endif
159 79638566 bellard
#ifdef __s390__
160 79638566 bellard
#define AREG0 "r10"
161 79638566 bellard
#define AREG1 "r7"
162 79638566 bellard
#define AREG2 "r8"
163 79638566 bellard
#define AREG3 "r9"
164 79638566 bellard
#endif
165 79638566 bellard
#ifdef __alpha__
166 79638566 bellard
/* Note $15 is the frame pointer, so anything in op-i386.c that would
167 79638566 bellard
   require a frame pointer, like alloca, would probably loose.  */
168 79638566 bellard
#define AREG0 "$15"
169 79638566 bellard
#define AREG1 "$9"
170 79638566 bellard
#define AREG2 "$10"
171 79638566 bellard
#define AREG3 "$11"
172 79638566 bellard
#define AREG4 "$12"
173 79638566 bellard
#define AREG5 "$13"
174 79638566 bellard
#define AREG6 "$14"
175 79638566 bellard
#endif
176 38e584a0 bellard
#ifdef __mc68000
177 38e584a0 bellard
#define AREG0 "%a5"
178 38e584a0 bellard
#define AREG1 "%a4"
179 38e584a0 bellard
#define AREG2 "%d7"
180 38e584a0 bellard
#define AREG3 "%d6"
181 38e584a0 bellard
#define AREG4 "%d5"
182 38e584a0 bellard
#endif
183 79638566 bellard
#ifdef __ia64__
184 b8076a74 bellard
#define AREG0 "r7"
185 b8076a74 bellard
#define AREG1 "r4"
186 b8076a74 bellard
#define AREG2 "r5"
187 b8076a74 bellard
#define AREG3 "r6"
188 79638566 bellard
#endif
189 79638566 bellard
190 79638566 bellard
/* force GCC to generate only one epilog at the end of the function */
191 70ead434 ths
#define FORCE_RET() __asm__ __volatile__("" : : : "memory");
192 79638566 bellard
193 79638566 bellard
#ifndef OPPROTO
194 79638566 bellard
#define OPPROTO
195 79638566 bellard
#endif
196 79638566 bellard
197 79638566 bellard
#define xglue(x, y) x ## y
198 79638566 bellard
#define glue(x, y) xglue(x, y)
199 9621339d bellard
#define stringify(s)        tostring(s)
200 9621339d bellard
#define tostring(s)        #s
201 79638566 bellard
202 79638566 bellard
#ifdef __alpha__
203 79638566 bellard
/* the symbols are considered non exported so a br immediate is generated */
204 79638566 bellard
#define __hidden __attribute__((visibility("hidden")))
205 79638566 bellard
#else
206 79638566 bellard
#define __hidden 
207 79638566 bellard
#endif
208 79638566 bellard
209 cab84d98 bellard
#if defined(__alpha__)
210 79638566 bellard
/* Suggested by Richard Henderson. This will result in code like
211 79638566 bellard
        ldah $0,__op_param1($29)        !gprelhigh
212 79638566 bellard
        lda $0,__op_param1($0)          !gprellow
213 79638566 bellard
   We can then conveniently change $29 to $31 and adapt the offsets to
214 79638566 bellard
   emit the appropriate constant.  */
215 79638566 bellard
extern int __op_param1 __hidden;
216 79638566 bellard
extern int __op_param2 __hidden;
217 79638566 bellard
extern int __op_param3 __hidden;
218 79638566 bellard
#define PARAM1 ({ int _r; asm("" : "=r"(_r) : "0" (&__op_param1)); _r; })
219 79638566 bellard
#define PARAM2 ({ int _r; asm("" : "=r"(_r) : "0" (&__op_param2)); _r; })
220 79638566 bellard
#define PARAM3 ({ int _r; asm("" : "=r"(_r) : "0" (&__op_param3)); _r; })
221 79638566 bellard
#else
222 cab84d98 bellard
#if defined(__APPLE__)
223 cab84d98 bellard
static int __op_param1, __op_param2, __op_param3;
224 cab84d98 bellard
#else
225 79638566 bellard
extern int __op_param1, __op_param2, __op_param3;
226 cab84d98 bellard
#endif
227 79638566 bellard
#define PARAM1 ((long)(&__op_param1))
228 79638566 bellard
#define PARAM2 ((long)(&__op_param2))
229 79638566 bellard
#define PARAM3 ((long)(&__op_param3))
230 cab84d98 bellard
#endif /* !defined(__alpha__) */
231 79638566 bellard
232 c106152d bellard
extern int __op_jmp0, __op_jmp1, __op_jmp2, __op_jmp3;
233 9621339d bellard
234 9191d4d1 bellard
#if defined(_WIN32) || defined(__APPLE__)
235 9df8aa4a bellard
#define ASM_NAME(x) "_" #x
236 9df8aa4a bellard
#else
237 9df8aa4a bellard
#define ASM_NAME(x) #x
238 9df8aa4a bellard
#endif
239 9df8aa4a bellard
240 9621339d bellard
#ifdef __i386__
241 9621339d bellard
#define EXIT_TB() asm volatile ("ret")
242 9df8aa4a bellard
#define GOTO_LABEL_PARAM(n) asm volatile ("jmp " ASM_NAME(__op_gen_label) #n)
243 9621339d bellard
#endif
244 bc51c5c9 bellard
#ifdef __x86_64__
245 bc51c5c9 bellard
#define EXIT_TB() asm volatile ("ret")
246 d785e6be bellard
#define GOTO_LABEL_PARAM(n) asm volatile ("jmp " ASM_NAME(__op_gen_label) #n)
247 bc51c5c9 bellard
#endif
248 9621339d bellard
#ifdef __powerpc__
249 9621339d bellard
#define EXIT_TB() asm volatile ("blr")
250 9df8aa4a bellard
#define GOTO_LABEL_PARAM(n) asm volatile ("b " ASM_NAME(__op_gen_label) #n)
251 9621339d bellard
#endif
252 9621339d bellard
#ifdef __s390__
253 9621339d bellard
#define EXIT_TB() asm volatile ("br %r14")
254 90cb9493 bellard
#define GOTO_LABEL_PARAM(n) asm volatile ("b " ASM_NAME(__op_gen_label) #n)
255 9621339d bellard
#endif
256 9621339d bellard
#ifdef __alpha__
257 9621339d bellard
#define EXIT_TB() asm volatile ("ret")
258 9621339d bellard
#endif
259 9621339d bellard
#ifdef __ia64__
260 9621339d bellard
#define EXIT_TB() asm volatile ("br.ret.sptk.many b0;;")
261 b8076a74 bellard
#define GOTO_LABEL_PARAM(n) asm volatile ("br.sptk.many " \
262 b8076a74 bellard
                                          ASM_NAME(__op_gen_label) #n)
263 9621339d bellard
#endif
264 9621339d bellard
#ifdef __sparc__
265 fdbb4691 bellard
#define EXIT_TB() asm volatile ("jmpl %i0 + 8, %g0; nop")
266 fdbb4691 bellard
#define GOTO_LABEL_PARAM(n) asm volatile ("ba " ASM_NAME(__op_gen_label) #n ";nop")
267 9621339d bellard
#endif
268 9621339d bellard
#ifdef __arm__
269 9621339d bellard
#define EXIT_TB() asm volatile ("b exec_loop")
270 ae200d10 bellard
#define GOTO_LABEL_PARAM(n) asm volatile ("b " ASM_NAME(__op_gen_label) #n)
271 9621339d bellard
#endif
272 38e584a0 bellard
#ifdef __mc68000
273 38e584a0 bellard
#define EXIT_TB() asm volatile ("rts")
274 38e584a0 bellard
#endif
275 67867308 bellard
276 67867308 bellard
#endif /* !defined(__DYNGEN_EXEC_H__) */