|
1 /* |
|
2 * dyngen defines for micro operation code |
|
3 * |
|
4 * Copyright (c) 2003 Fabrice Bellard |
|
5 * |
|
6 * This library is free software; you can redistribute it and/or |
|
7 * modify it under the terms of the GNU Lesser General Public |
|
8 * License as published by the Free Software Foundation; either |
|
9 * version 2 of the License, or (at your option) any later version. |
|
10 * |
|
11 * This library is distributed in the hope that it will be useful, |
|
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
14 * Lesser General Public License for more details. |
|
15 * |
|
16 * You should have received a copy of the GNU Lesser General Public |
|
17 * License along with this library; if not, write to the Free Software |
|
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
19 */ |
|
20 #if !defined(__DYNGEN_EXEC_H__) |
|
21 #define __DYNGEN_EXEC_H__ |
|
22 |
|
23 /* prevent Solaris from trying to typedef FILE in gcc's |
|
24 include/floatingpoint.h which will conflict with the |
|
25 definition down below */ |
|
26 #ifdef __sun__ |
|
27 #define _FILEDEFED |
|
28 #endif |
|
29 |
|
30 /* NOTE: standard headers should be used with special care at this |
|
31 point because host CPU registers are used as global variables. Some |
|
32 host headers do not allow that. */ |
|
33 #include <stddef.h> |
|
34 |
|
35 #ifdef __OpenBSD__ |
|
36 #include <sys/types.h> |
|
37 #else |
|
38 typedef unsigned char uint8_t; |
|
39 typedef unsigned short uint16_t; |
|
40 typedef unsigned int uint32_t; |
|
41 // Linux/Sparc64 defines uint64_t |
|
42 #if !(defined (__sparc_v9__) && defined(__linux__)) && !(defined(__APPLE__) && defined(__x86_64__)) |
|
43 /* XXX may be done for all 64 bits targets ? */ |
|
44 #if defined (__x86_64__) || defined(__ia64) || defined(__s390x__) || defined(__alpha__) || defined(__powerpc64__) |
|
45 typedef unsigned long uint64_t; |
|
46 #else |
|
47 typedef unsigned long long uint64_t; |
|
48 #endif |
|
49 #endif |
|
50 |
|
51 /* if Solaris/__sun__, don't typedef int8_t, as it will be typedef'd |
|
52 prior to this and will cause an error in compliation, conflicting |
|
53 with /usr/include/sys/int_types.h, line 75 */ |
|
54 #ifndef __sun__ |
|
55 typedef signed char int8_t; |
|
56 #endif |
|
57 typedef signed short int16_t; |
|
58 typedef signed int int32_t; |
|
59 // Linux/Sparc64 defines int64_t |
|
60 #if !(defined (__sparc_v9__) && defined(__linux__)) && !(defined(__APPLE__) && defined(__x86_64__)) |
|
61 #if defined (__x86_64__) || defined(__ia64) || defined(__s390x__) || defined(__alpha__) || defined(__powerpc64__) |
|
62 typedef signed long int64_t; |
|
63 #else |
|
64 typedef signed long long int64_t; |
|
65 #endif |
|
66 #endif |
|
67 #endif |
|
68 |
|
69 /* XXX: This may be wrong for 64-bit ILP32 hosts. */ |
|
70 typedef void * host_reg_t; |
|
71 |
|
72 #define INT8_MIN (-128) |
|
73 #define INT16_MIN (-32767-1) |
|
74 #define INT32_MIN (-2147483647-1) |
|
75 #define INT64_MIN (-(int64_t)(9223372036854775807)-1) |
|
76 #define INT8_MAX (127) |
|
77 #define INT16_MAX (32767) |
|
78 #define INT32_MAX (2147483647) |
|
79 #define INT64_MAX ((int64_t)(9223372036854775807)) |
|
80 #define UINT8_MAX (255) |
|
81 #define UINT16_MAX (65535) |
|
82 #define UINT32_MAX (4294967295U) |
|
83 #define UINT64_MAX ((uint64_t)(18446744073709551615)) |
|
84 |
|
85 #ifdef _BSD |
|
86 typedef struct __sFILE FILE; |
|
87 #else |
|
88 typedef struct FILE FILE; |
|
89 #endif |
|
90 extern int fprintf(FILE *, const char *, ...); |
|
91 extern int fputs(const char *, FILE *); |
|
92 extern int printf(const char *, ...); |
|
93 #undef NULL |
|
94 #define NULL 0 |
|
95 |
|
96 #if defined(__i386__) |
|
97 #define AREG0 "ebp" |
|
98 #define AREG1 "ebx" |
|
99 #define AREG2 "esi" |
|
100 #define AREG3 "edi" |
|
101 #elif defined(__x86_64__) |
|
102 #define AREG0 "r14" |
|
103 #define AREG1 "r15" |
|
104 #define AREG2 "r12" |
|
105 #define AREG3 "r13" |
|
106 //#define AREG4 "rbp" |
|
107 //#define AREG5 "rbx" |
|
108 #elif defined(__powerpc__) |
|
109 #define AREG0 "r27" |
|
110 #define AREG1 "r24" |
|
111 #define AREG2 "r25" |
|
112 #define AREG3 "r26" |
|
113 /* XXX: suppress this hack */ |
|
114 #if defined(CONFIG_USER_ONLY) |
|
115 #define AREG4 "r16" |
|
116 #define AREG5 "r17" |
|
117 #define AREG6 "r18" |
|
118 #define AREG7 "r19" |
|
119 #define AREG8 "r20" |
|
120 #define AREG9 "r21" |
|
121 #define AREG10 "r22" |
|
122 #define AREG11 "r23" |
|
123 #endif |
|
124 #elif defined(__arm__) |
|
125 #define AREG0 "r7" |
|
126 #define AREG1 "r4" |
|
127 #define AREG2 "r5" |
|
128 #define AREG3 "r6" |
|
129 #elif defined(__hppa__) |
|
130 #define AREG0 "r17" |
|
131 #define AREG1 "r14" |
|
132 #define AREG2 "r15" |
|
133 #define AREG3 "r16" |
|
134 #elif defined(__mips__) |
|
135 #define AREG0 "fp" |
|
136 #define AREG1 "s0" |
|
137 #define AREG2 "s1" |
|
138 #define AREG3 "s2" |
|
139 #define AREG4 "s3" |
|
140 #define AREG5 "s4" |
|
141 #define AREG6 "s5" |
|
142 #define AREG7 "s6" |
|
143 #define AREG8 "s7" |
|
144 #elif defined(__sparc__) |
|
145 #ifdef HOST_SOLARIS |
|
146 #define AREG0 "g2" |
|
147 #define AREG1 "g3" |
|
148 #define AREG2 "g4" |
|
149 #define AREG3 "g5" |
|
150 #define AREG4 "g6" |
|
151 #else |
|
152 #ifdef __sparc_v9__ |
|
153 #define AREG0 "g5" |
|
154 #define AREG1 "g6" |
|
155 #define AREG2 "g7" |
|
156 #else |
|
157 #define AREG0 "g6" |
|
158 #define AREG1 "g1" |
|
159 #define AREG2 "g2" |
|
160 #define AREG3 "g3" |
|
161 #define AREG4 "l0" |
|
162 #define AREG5 "l1" |
|
163 #define AREG6 "l2" |
|
164 #define AREG7 "l3" |
|
165 #define AREG8 "l4" |
|
166 #define AREG9 "l5" |
|
167 #define AREG10 "l6" |
|
168 #define AREG11 "l7" |
|
169 #endif |
|
170 #endif |
|
171 #elif defined(__s390__) |
|
172 #define AREG0 "r10" |
|
173 #define AREG1 "r7" |
|
174 #define AREG2 "r8" |
|
175 #define AREG3 "r9" |
|
176 #elif defined(__alpha__) |
|
177 /* Note $15 is the frame pointer, so anything in op-i386.c that would |
|
178 require a frame pointer, like alloca, would probably loose. */ |
|
179 #define AREG0 "$15" |
|
180 #define AREG1 "$9" |
|
181 #define AREG2 "$10" |
|
182 #define AREG3 "$11" |
|
183 #define AREG4 "$12" |
|
184 #define AREG5 "$13" |
|
185 #define AREG6 "$14" |
|
186 #elif defined(__mc68000) |
|
187 #define AREG0 "%a5" |
|
188 #define AREG1 "%a4" |
|
189 #define AREG2 "%d7" |
|
190 #define AREG3 "%d6" |
|
191 #define AREG4 "%d5" |
|
192 #elif defined(__ia64__) |
|
193 #define AREG0 "r7" |
|
194 #define AREG1 "r4" |
|
195 #define AREG2 "r5" |
|
196 #define AREG3 "r6" |
|
197 #else |
|
198 #error unsupported CPU |
|
199 #endif |
|
200 |
|
201 #define xglue(x, y) x ## y |
|
202 #define glue(x, y) xglue(x, y) |
|
203 #define stringify(s) tostring(s) |
|
204 #define tostring(s) #s |
|
205 |
|
206 #if defined(__alpha__) || defined(__s390__) |
|
207 /* the symbols are considered non exported so a br immediate is generated */ |
|
208 #define __hidden __attribute__((visibility("hidden"))) |
|
209 #else |
|
210 #define __hidden |
|
211 #endif |
|
212 |
|
213 /* The return address may point to the start of the next instruction. |
|
214 Subtracting one gets us the call instruction itself. */ |
|
215 #if defined(__s390__) |
|
216 # define GETPC() ((void*)(((unsigned long)__builtin_return_address(0) & 0x7fffffffUL) - 1)) |
|
217 #elif defined(__arm__) |
|
218 /* Thumb return addresses have the low bit set, so we need to subtract two. |
|
219 This is still safe in ARM mode because instructions are 4 bytes. */ |
|
220 # define GETPC() ((void *)((unsigned long)__builtin_return_address(0) - 2)) |
|
221 #else |
|
222 # define GETPC() ((void *)((unsigned long)__builtin_return_address(0) - 1)) |
|
223 #endif |
|
224 |
|
225 #endif /* !defined(__DYNGEN_EXEC_H__) */ |