Statistics
| Branch: | Revision:

root / dyngen-exec.h @ db8d9902

History | View | Annotate | Download (6.1 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 128ab2ff blueswir1
#ifdef __OpenBSD__
36 128ab2ff blueswir1
#include <sys/types.h>
37 128ab2ff blueswir1
#else
38 79638566 bellard
typedef unsigned char uint8_t;
39 79638566 bellard
typedef unsigned short uint16_t;
40 79638566 bellard
typedef unsigned int uint32_t;
41 74ccb34e bellard
// Linux/Sparc64 defines uint64_t
42 31a53c63 ths
#if !(defined (__sparc_v9__) && defined(__linux__)) && !(defined(__APPLE__) && defined(__x86_64__))
43 4f2ac237 bellard
/* XXX may be done for all 64 bits targets ? */
44 810260a8 malc
#if defined (__x86_64__) || defined(__ia64) || defined(__s390x__) || defined(__alpha__) || defined(__powerpc64__)
45 4f2ac237 bellard
typedef unsigned long uint64_t;
46 4f2ac237 bellard
#else
47 79638566 bellard
typedef unsigned long long uint64_t;
48 4f2ac237 bellard
#endif
49 74ccb34e bellard
#endif
50 79638566 bellard
51 ec530c81 bellard
/* if Solaris/__sun__, don't typedef int8_t, as it will be typedef'd
52 ec530c81 bellard
   prior to this and will cause an error in compliation, conflicting
53 ec530c81 bellard
   with /usr/include/sys/int_types.h, line 75 */
54 ec530c81 bellard
#ifndef __sun__
55 79638566 bellard
typedef signed char int8_t;
56 ec530c81 bellard
#endif
57 79638566 bellard
typedef signed short int16_t;
58 79638566 bellard
typedef signed int int32_t;
59 74ccb34e bellard
// Linux/Sparc64 defines int64_t
60 31a53c63 ths
#if !(defined (__sparc_v9__) && defined(__linux__)) && !(defined(__APPLE__) && defined(__x86_64__))
61 810260a8 malc
#if defined (__x86_64__) || defined(__ia64) || defined(__s390x__) || defined(__alpha__) || defined(__powerpc64__)
62 4f2ac237 bellard
typedef signed long int64_t;
63 4f2ac237 bellard
#else
64 79638566 bellard
typedef signed long long int64_t;
65 4f2ac237 bellard
#endif
66 74ccb34e bellard
#endif
67 128ab2ff blueswir1
#endif
68 79638566 bellard
69 1057eaa7 pbrook
/* XXX: This may be wrong for 64-bit ILP32 hosts.  */
70 1057eaa7 pbrook
typedef void * host_reg_t;
71 1057eaa7 pbrook
72 67867308 bellard
#define INT8_MIN                (-128)
73 67867308 bellard
#define INT16_MIN                (-32767-1)
74 67867308 bellard
#define INT32_MIN                (-2147483647-1)
75 67867308 bellard
#define INT64_MIN                (-(int64_t)(9223372036854775807)-1)
76 67867308 bellard
#define INT8_MAX                (127)
77 67867308 bellard
#define INT16_MAX                (32767)
78 67867308 bellard
#define INT32_MAX                (2147483647)
79 67867308 bellard
#define INT64_MAX                ((int64_t)(9223372036854775807))
80 67867308 bellard
#define UINT8_MAX                (255)
81 67867308 bellard
#define UINT16_MAX                (65535)
82 67867308 bellard
#define UINT32_MAX                (4294967295U)
83 67867308 bellard
#define UINT64_MAX                ((uint64_t)(18446744073709551615))
84 67867308 bellard
85 cce1075c ths
#ifdef _BSD
86 cce1075c ths
typedef struct __sFILE FILE;
87 cce1075c ths
#else
88 79638566 bellard
typedef struct FILE FILE;
89 cce1075c ths
#endif
90 79638566 bellard
extern int fprintf(FILE *, const char *, ...);
91 24c7b0e3 ths
extern int fputs(const char *, FILE *);
92 79638566 bellard
extern int printf(const char *, ...);
93 513b500f bellard
#undef NULL
94 79638566 bellard
#define NULL 0
95 79638566 bellard
96 522777bb ths
#if defined(__i386__)
97 79638566 bellard
#define AREG0 "ebp"
98 79638566 bellard
#define AREG1 "ebx"
99 79638566 bellard
#define AREG2 "esi"
100 79638566 bellard
#define AREG3 "edi"
101 522777bb ths
#elif defined(__x86_64__)
102 43024c6a ths
#define AREG0 "r14"
103 43024c6a ths
#define AREG1 "r15"
104 bc51c5c9 bellard
#define AREG2 "r12"
105 bc51c5c9 bellard
#define AREG3 "r13"
106 43024c6a ths
//#define AREG4 "rbp"
107 43024c6a ths
//#define AREG5 "rbx"
108 522777bb ths
#elif defined(__powerpc__)
109 79638566 bellard
#define AREG0 "r27"
110 79638566 bellard
#define AREG1 "r24"
111 79638566 bellard
#define AREG2 "r25"
112 79638566 bellard
#define AREG3 "r26"
113 bf71c9d9 bellard
/* XXX: suppress this hack */
114 bf71c9d9 bellard
#if defined(CONFIG_USER_ONLY)
115 79638566 bellard
#define AREG4 "r16"
116 79638566 bellard
#define AREG5 "r17"
117 79638566 bellard
#define AREG6 "r18"
118 79638566 bellard
#define AREG7 "r19"
119 79638566 bellard
#define AREG8 "r20"
120 79638566 bellard
#define AREG9 "r21"
121 79638566 bellard
#define AREG10 "r22"
122 79638566 bellard
#define AREG11 "r23"
123 bf71c9d9 bellard
#endif
124 522777bb ths
#elif defined(__arm__)
125 79638566 bellard
#define AREG0 "r7"
126 79638566 bellard
#define AREG1 "r4"
127 79638566 bellard
#define AREG2 "r5"
128 79638566 bellard
#define AREG3 "r6"
129 f54b3f92 aurel32
#elif defined(__hppa__)
130 f54b3f92 aurel32
#define AREG0 "r17"
131 f54b3f92 aurel32
#define AREG1 "r14"
132 f54b3f92 aurel32
#define AREG2 "r15"
133 f54b3f92 aurel32
#define AREG3 "r16"
134 522777bb ths
#elif defined(__mips__)
135 c4b89d18 ths
#define AREG0 "fp"
136 79638566 bellard
#define AREG1 "s0"
137 79638566 bellard
#define AREG2 "s1"
138 79638566 bellard
#define AREG3 "s2"
139 c4b89d18 ths
#define AREG4 "s3"
140 c4b89d18 ths
#define AREG5 "s4"
141 c4b89d18 ths
#define AREG6 "s5"
142 c4b89d18 ths
#define AREG7 "s6"
143 c4b89d18 ths
#define AREG8 "s7"
144 522777bb ths
#elif defined(__sparc__)
145 fdbb4691 bellard
#ifdef HOST_SOLARIS
146 fdbb4691 bellard
#define AREG0 "g2"
147 fdbb4691 bellard
#define AREG1 "g3"
148 fdbb4691 bellard
#define AREG2 "g4"
149 fdbb4691 bellard
#define AREG3 "g5"
150 fdbb4691 bellard
#define AREG4 "g6"
151 fdbb4691 bellard
#else
152 74ccb34e bellard
#ifdef __sparc_v9__
153 e97b640d blueswir1
#define AREG0 "g5"
154 e97b640d blueswir1
#define AREG1 "g6"
155 e97b640d blueswir1
#define AREG2 "g7"
156 74ccb34e bellard
#else
157 79638566 bellard
#define AREG0 "g6"
158 79638566 bellard
#define AREG1 "g1"
159 79638566 bellard
#define AREG2 "g2"
160 79638566 bellard
#define AREG3 "g3"
161 79638566 bellard
#define AREG4 "l0"
162 79638566 bellard
#define AREG5 "l1"
163 79638566 bellard
#define AREG6 "l2"
164 79638566 bellard
#define AREG7 "l3"
165 79638566 bellard
#define AREG8 "l4"
166 79638566 bellard
#define AREG9 "l5"
167 79638566 bellard
#define AREG10 "l6"
168 79638566 bellard
#define AREG11 "l7"
169 fdbb4691 bellard
#endif
170 74ccb34e bellard
#endif
171 522777bb ths
#elif defined(__s390__)
172 79638566 bellard
#define AREG0 "r10"
173 79638566 bellard
#define AREG1 "r7"
174 79638566 bellard
#define AREG2 "r8"
175 79638566 bellard
#define AREG3 "r9"
176 522777bb ths
#elif defined(__alpha__)
177 79638566 bellard
/* Note $15 is the frame pointer, so anything in op-i386.c that would
178 79638566 bellard
   require a frame pointer, like alloca, would probably loose.  */
179 79638566 bellard
#define AREG0 "$15"
180 79638566 bellard
#define AREG1 "$9"
181 79638566 bellard
#define AREG2 "$10"
182 79638566 bellard
#define AREG3 "$11"
183 79638566 bellard
#define AREG4 "$12"
184 79638566 bellard
#define AREG5 "$13"
185 79638566 bellard
#define AREG6 "$14"
186 522777bb ths
#elif defined(__mc68000)
187 38e584a0 bellard
#define AREG0 "%a5"
188 38e584a0 bellard
#define AREG1 "%a4"
189 38e584a0 bellard
#define AREG2 "%d7"
190 38e584a0 bellard
#define AREG3 "%d6"
191 38e584a0 bellard
#define AREG4 "%d5"
192 522777bb ths
#elif defined(__ia64__)
193 b8076a74 bellard
#define AREG0 "r7"
194 b8076a74 bellard
#define AREG1 "r4"
195 b8076a74 bellard
#define AREG2 "r5"
196 b8076a74 bellard
#define AREG3 "r6"
197 522777bb ths
#else
198 522777bb ths
#error unsupported CPU
199 79638566 bellard
#endif
200 79638566 bellard
201 79638566 bellard
#define xglue(x, y) x ## y
202 79638566 bellard
#define glue(x, y) xglue(x, y)
203 9621339d bellard
#define stringify(s)        tostring(s)
204 9621339d bellard
#define tostring(s)        #s
205 79638566 bellard
206 76d83bde ths
#if defined(__alpha__) || defined(__s390__)
207 79638566 bellard
/* the symbols are considered non exported so a br immediate is generated */
208 79638566 bellard
#define __hidden __attribute__((visibility("hidden")))
209 79638566 bellard
#else
210 5fafdf24 ths
#define __hidden
211 79638566 bellard
#endif
212 79638566 bellard
213 9b7b85d2 pbrook
/* The return address may point to the start of the next instruction.
214 9b7b85d2 pbrook
   Subtracting one gets us the call instruction itself.  */
215 9b7b85d2 pbrook
#if defined(__s390__)
216 9b7b85d2 pbrook
# define GETPC() ((void*)(((unsigned long)__builtin_return_address(0) & 0x7fffffffUL) - 1))
217 9b7b85d2 pbrook
#elif defined(__arm__)
218 9b7b85d2 pbrook
/* Thumb return addresses have the low bit set, so we need to subtract two.
219 9b7b85d2 pbrook
   This is still safe in ARM mode because instructions are 4 bytes.  */
220 9b7b85d2 pbrook
# define GETPC() ((void *)((unsigned long)__builtin_return_address(0) - 2))
221 9b7b85d2 pbrook
#else
222 9b7b85d2 pbrook
# define GETPC() ((void *)((unsigned long)__builtin_return_address(0) - 1))
223 9b7b85d2 pbrook
#endif
224 9b7b85d2 pbrook
225 67867308 bellard
#endif /* !defined(__DYNGEN_EXEC_H__) */