Statistics
| Branch: | Revision:

root / dyngen-exec.h @ 192c7bd9

History | View | Annotate | Download (6.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 1e6cae95 bellard
/* NOTE: standard headers should be used with special care at this
24 1e6cae95 bellard
   point because host CPU registers are used as global variables. Some
25 1e6cae95 bellard
   host headers do not allow that. */
26 513b500f bellard
#include <stddef.h>
27 513b500f bellard
28 79638566 bellard
typedef unsigned char uint8_t;
29 79638566 bellard
typedef unsigned short uint16_t;
30 79638566 bellard
typedef unsigned int uint32_t;
31 4f2ac237 bellard
/* XXX may be done for all 64 bits targets ? */
32 b8076a74 bellard
#if defined (__x86_64__) || defined(__ia64)
33 4f2ac237 bellard
typedef unsigned long uint64_t;
34 4f2ac237 bellard
#else
35 79638566 bellard
typedef unsigned long long uint64_t;
36 4f2ac237 bellard
#endif
37 79638566 bellard
38 79638566 bellard
typedef signed char int8_t;
39 79638566 bellard
typedef signed short int16_t;
40 79638566 bellard
typedef signed int int32_t;
41 b8076a74 bellard
#if defined (__x86_64__) || defined(__ia64)
42 4f2ac237 bellard
typedef signed long int64_t;
43 4f2ac237 bellard
#else
44 79638566 bellard
typedef signed long long int64_t;
45 4f2ac237 bellard
#endif
46 79638566 bellard
47 67867308 bellard
#define INT8_MIN                (-128)
48 67867308 bellard
#define INT16_MIN                (-32767-1)
49 67867308 bellard
#define INT32_MIN                (-2147483647-1)
50 67867308 bellard
#define INT64_MIN                (-(int64_t)(9223372036854775807)-1)
51 67867308 bellard
#define INT8_MAX                (127)
52 67867308 bellard
#define INT16_MAX                (32767)
53 67867308 bellard
#define INT32_MAX                (2147483647)
54 67867308 bellard
#define INT64_MAX                ((int64_t)(9223372036854775807))
55 67867308 bellard
#define UINT8_MAX                (255)
56 67867308 bellard
#define UINT16_MAX                (65535)
57 67867308 bellard
#define UINT32_MAX                (4294967295U)
58 67867308 bellard
#define UINT64_MAX                ((uint64_t)(18446744073709551615))
59 67867308 bellard
60 79638566 bellard
typedef struct FILE FILE;
61 79638566 bellard
extern int fprintf(FILE *, const char *, ...);
62 79638566 bellard
extern int printf(const char *, ...);
63 513b500f bellard
#undef NULL
64 79638566 bellard
#define NULL 0
65 79638566 bellard
66 79638566 bellard
#ifdef __i386__
67 79638566 bellard
#define AREG0 "ebp"
68 79638566 bellard
#define AREG1 "ebx"
69 79638566 bellard
#define AREG2 "esi"
70 79638566 bellard
#define AREG3 "edi"
71 79638566 bellard
#endif
72 bc51c5c9 bellard
#ifdef __x86_64__
73 bc51c5c9 bellard
#define AREG0 "rbp"
74 bc51c5c9 bellard
#define AREG1 "rbx"
75 bc51c5c9 bellard
#define AREG2 "r12"
76 bc51c5c9 bellard
#define AREG3 "r13"
77 dff293e7 bellard
//#define AREG4 "r14"
78 dff293e7 bellard
//#define AREG5 "r15"
79 bc51c5c9 bellard
#endif
80 79638566 bellard
#ifdef __powerpc__
81 79638566 bellard
#define AREG0 "r27"
82 79638566 bellard
#define AREG1 "r24"
83 79638566 bellard
#define AREG2 "r25"
84 79638566 bellard
#define AREG3 "r26"
85 bf71c9d9 bellard
/* XXX: suppress this hack */
86 bf71c9d9 bellard
#if defined(CONFIG_USER_ONLY)
87 79638566 bellard
#define AREG4 "r16"
88 79638566 bellard
#define AREG5 "r17"
89 79638566 bellard
#define AREG6 "r18"
90 79638566 bellard
#define AREG7 "r19"
91 79638566 bellard
#define AREG8 "r20"
92 79638566 bellard
#define AREG9 "r21"
93 79638566 bellard
#define AREG10 "r22"
94 79638566 bellard
#define AREG11 "r23"
95 bf71c9d9 bellard
#endif
96 79638566 bellard
#define USE_INT_TO_FLOAT_HELPERS
97 79638566 bellard
#define BUGGY_GCC_DIV64
98 79638566 bellard
#endif
99 79638566 bellard
#ifdef __arm__
100 79638566 bellard
#define AREG0 "r7"
101 79638566 bellard
#define AREG1 "r4"
102 79638566 bellard
#define AREG2 "r5"
103 79638566 bellard
#define AREG3 "r6"
104 79638566 bellard
#endif
105 79638566 bellard
#ifdef __mips__
106 79638566 bellard
#define AREG0 "s3"
107 79638566 bellard
#define AREG1 "s0"
108 79638566 bellard
#define AREG2 "s1"
109 79638566 bellard
#define AREG3 "s2"
110 79638566 bellard
#endif
111 79638566 bellard
#ifdef __sparc__
112 79638566 bellard
#define AREG0 "g6"
113 79638566 bellard
#define AREG1 "g1"
114 79638566 bellard
#define AREG2 "g2"
115 79638566 bellard
#define AREG3 "g3"
116 79638566 bellard
#define AREG4 "l0"
117 79638566 bellard
#define AREG5 "l1"
118 79638566 bellard
#define AREG6 "l2"
119 79638566 bellard
#define AREG7 "l3"
120 79638566 bellard
#define AREG8 "l4"
121 79638566 bellard
#define AREG9 "l5"
122 79638566 bellard
#define AREG10 "l6"
123 79638566 bellard
#define AREG11 "l7"
124 79638566 bellard
#define USE_FP_CONVERT
125 79638566 bellard
#endif
126 79638566 bellard
#ifdef __s390__
127 79638566 bellard
#define AREG0 "r10"
128 79638566 bellard
#define AREG1 "r7"
129 79638566 bellard
#define AREG2 "r8"
130 79638566 bellard
#define AREG3 "r9"
131 79638566 bellard
#endif
132 79638566 bellard
#ifdef __alpha__
133 79638566 bellard
/* Note $15 is the frame pointer, so anything in op-i386.c that would
134 79638566 bellard
   require a frame pointer, like alloca, would probably loose.  */
135 79638566 bellard
#define AREG0 "$15"
136 79638566 bellard
#define AREG1 "$9"
137 79638566 bellard
#define AREG2 "$10"
138 79638566 bellard
#define AREG3 "$11"
139 79638566 bellard
#define AREG4 "$12"
140 79638566 bellard
#define AREG5 "$13"
141 79638566 bellard
#define AREG6 "$14"
142 79638566 bellard
#endif
143 38e584a0 bellard
#ifdef __mc68000
144 38e584a0 bellard
#define AREG0 "%a5"
145 38e584a0 bellard
#define AREG1 "%a4"
146 38e584a0 bellard
#define AREG2 "%d7"
147 38e584a0 bellard
#define AREG3 "%d6"
148 38e584a0 bellard
#define AREG4 "%d5"
149 38e584a0 bellard
#endif
150 79638566 bellard
#ifdef __ia64__
151 b8076a74 bellard
#define AREG0 "r7"
152 b8076a74 bellard
#define AREG1 "r4"
153 b8076a74 bellard
#define AREG2 "r5"
154 b8076a74 bellard
#define AREG3 "r6"
155 79638566 bellard
#endif
156 79638566 bellard
157 79638566 bellard
/* force GCC to generate only one epilog at the end of the function */
158 79638566 bellard
#define FORCE_RET() asm volatile ("");
159 79638566 bellard
160 79638566 bellard
#ifndef OPPROTO
161 79638566 bellard
#define OPPROTO
162 79638566 bellard
#endif
163 79638566 bellard
164 79638566 bellard
#define xglue(x, y) x ## y
165 79638566 bellard
#define glue(x, y) xglue(x, y)
166 9621339d bellard
#define stringify(s)        tostring(s)
167 9621339d bellard
#define tostring(s)        #s
168 79638566 bellard
169 79638566 bellard
#ifdef __alpha__
170 79638566 bellard
/* the symbols are considered non exported so a br immediate is generated */
171 79638566 bellard
#define __hidden __attribute__((visibility("hidden")))
172 79638566 bellard
#else
173 79638566 bellard
#define __hidden 
174 79638566 bellard
#endif
175 79638566 bellard
176 cab84d98 bellard
#if defined(__alpha__)
177 79638566 bellard
/* Suggested by Richard Henderson. This will result in code like
178 79638566 bellard
        ldah $0,__op_param1($29)        !gprelhigh
179 79638566 bellard
        lda $0,__op_param1($0)          !gprellow
180 79638566 bellard
   We can then conveniently change $29 to $31 and adapt the offsets to
181 79638566 bellard
   emit the appropriate constant.  */
182 79638566 bellard
extern int __op_param1 __hidden;
183 79638566 bellard
extern int __op_param2 __hidden;
184 79638566 bellard
extern int __op_param3 __hidden;
185 79638566 bellard
#define PARAM1 ({ int _r; asm("" : "=r"(_r) : "0" (&__op_param1)); _r; })
186 79638566 bellard
#define PARAM2 ({ int _r; asm("" : "=r"(_r) : "0" (&__op_param2)); _r; })
187 79638566 bellard
#define PARAM3 ({ int _r; asm("" : "=r"(_r) : "0" (&__op_param3)); _r; })
188 79638566 bellard
#else
189 cab84d98 bellard
#if defined(__APPLE__)
190 cab84d98 bellard
static int __op_param1, __op_param2, __op_param3;
191 cab84d98 bellard
#else
192 79638566 bellard
extern int __op_param1, __op_param2, __op_param3;
193 cab84d98 bellard
#endif
194 79638566 bellard
#define PARAM1 ((long)(&__op_param1))
195 79638566 bellard
#define PARAM2 ((long)(&__op_param2))
196 79638566 bellard
#define PARAM3 ((long)(&__op_param3))
197 cab84d98 bellard
#endif /* !defined(__alpha__) */
198 79638566 bellard
199 c106152d bellard
extern int __op_jmp0, __op_jmp1, __op_jmp2, __op_jmp3;
200 9621339d bellard
201 9191d4d1 bellard
#if defined(_WIN32) || defined(__APPLE__)
202 9df8aa4a bellard
#define ASM_NAME(x) "_" #x
203 9df8aa4a bellard
#else
204 9df8aa4a bellard
#define ASM_NAME(x) #x
205 9df8aa4a bellard
#endif
206 9df8aa4a bellard
207 9621339d bellard
#ifdef __i386__
208 9621339d bellard
#define EXIT_TB() asm volatile ("ret")
209 9df8aa4a bellard
#define GOTO_LABEL_PARAM(n) asm volatile ("jmp " ASM_NAME(__op_gen_label) #n)
210 9621339d bellard
#endif
211 bc51c5c9 bellard
#ifdef __x86_64__
212 bc51c5c9 bellard
#define EXIT_TB() asm volatile ("ret")
213 d785e6be bellard
#define GOTO_LABEL_PARAM(n) asm volatile ("jmp " ASM_NAME(__op_gen_label) #n)
214 bc51c5c9 bellard
#endif
215 9621339d bellard
#ifdef __powerpc__
216 9621339d bellard
#define EXIT_TB() asm volatile ("blr")
217 9df8aa4a bellard
#define GOTO_LABEL_PARAM(n) asm volatile ("b " ASM_NAME(__op_gen_label) #n)
218 9621339d bellard
#endif
219 9621339d bellard
#ifdef __s390__
220 9621339d bellard
#define EXIT_TB() asm volatile ("br %r14")
221 9621339d bellard
#endif
222 9621339d bellard
#ifdef __alpha__
223 9621339d bellard
#define EXIT_TB() asm volatile ("ret")
224 9621339d bellard
#endif
225 9621339d bellard
#ifdef __ia64__
226 9621339d bellard
#define EXIT_TB() asm volatile ("br.ret.sptk.many b0;;")
227 b8076a74 bellard
#define GOTO_LABEL_PARAM(n) asm volatile ("br.sptk.many " \
228 b8076a74 bellard
                                          ASM_NAME(__op_gen_label) #n)
229 9621339d bellard
#endif
230 9621339d bellard
#ifdef __sparc__
231 a96fc003 bellard
#define EXIT_TB() asm volatile ("jmpl %i0 + 8, %g0\n" \
232 9621339d bellard
                                "nop")
233 9621339d bellard
#endif
234 9621339d bellard
#ifdef __arm__
235 9621339d bellard
#define EXIT_TB() asm volatile ("b exec_loop")
236 ae200d10 bellard
#define GOTO_LABEL_PARAM(n) asm volatile ("b " ASM_NAME(__op_gen_label) #n)
237 9621339d bellard
#endif
238 38e584a0 bellard
#ifdef __mc68000
239 38e584a0 bellard
#define EXIT_TB() asm volatile ("rts")
240 38e584a0 bellard
#endif
241 67867308 bellard
242 67867308 bellard
#endif /* !defined(__DYNGEN_EXEC_H__) */