Statistics
| Branch: | Revision:

root / dyngen-exec.h @ 3fb94d56

History | View | Annotate | Download (5.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 fad6cb1a aurel32
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA  02110-1301 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 e58ffeb3 malc
#if defined (__x86_64__) || defined(__ia64) || defined(__s390x__) || defined(__alpha__) || defined(_ARCH_PPC64)
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 e58ffeb3 malc
#if defined (__x86_64__) || defined(__ia64) || defined(__s390x__) || defined(__alpha__) || defined(_ARCH_PPC64)
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 179a2c19 blueswir1
#ifdef HOST_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 522777bb ths
#elif defined(__x86_64__)
101 43024c6a ths
#define AREG0 "r14"
102 43024c6a ths
#define AREG1 "r15"
103 bc51c5c9 bellard
#define AREG2 "r12"
104 e58ffeb3 malc
#elif defined(_ARCH_PPC)
105 79638566 bellard
#define AREG0 "r27"
106 79638566 bellard
#define AREG1 "r24"
107 79638566 bellard
#define AREG2 "r25"
108 522777bb ths
#elif defined(__arm__)
109 79638566 bellard
#define AREG0 "r7"
110 79638566 bellard
#define AREG1 "r4"
111 79638566 bellard
#define AREG2 "r5"
112 f54b3f92 aurel32
#elif defined(__hppa__)
113 f54b3f92 aurel32
#define AREG0 "r17"
114 f54b3f92 aurel32
#define AREG1 "r14"
115 f54b3f92 aurel32
#define AREG2 "r15"
116 522777bb ths
#elif defined(__mips__)
117 c4b89d18 ths
#define AREG0 "fp"
118 79638566 bellard
#define AREG1 "s0"
119 79638566 bellard
#define AREG2 "s1"
120 522777bb ths
#elif defined(__sparc__)
121 fdbb4691 bellard
#ifdef HOST_SOLARIS
122 fdbb4691 bellard
#define AREG0 "g2"
123 fdbb4691 bellard
#define AREG1 "g3"
124 fdbb4691 bellard
#define AREG2 "g4"
125 fdbb4691 bellard
#else
126 74ccb34e bellard
#ifdef __sparc_v9__
127 e97b640d blueswir1
#define AREG0 "g5"
128 e97b640d blueswir1
#define AREG1 "g6"
129 e97b640d blueswir1
#define AREG2 "g7"
130 74ccb34e bellard
#else
131 79638566 bellard
#define AREG0 "g6"
132 79638566 bellard
#define AREG1 "g1"
133 79638566 bellard
#define AREG2 "g2"
134 fdbb4691 bellard
#endif
135 74ccb34e bellard
#endif
136 522777bb ths
#elif defined(__s390__)
137 79638566 bellard
#define AREG0 "r10"
138 79638566 bellard
#define AREG1 "r7"
139 79638566 bellard
#define AREG2 "r8"
140 522777bb ths
#elif defined(__alpha__)
141 79638566 bellard
/* Note $15 is the frame pointer, so anything in op-i386.c that would
142 79638566 bellard
   require a frame pointer, like alloca, would probably loose.  */
143 79638566 bellard
#define AREG0 "$15"
144 79638566 bellard
#define AREG1 "$9"
145 79638566 bellard
#define AREG2 "$10"
146 522777bb ths
#elif defined(__mc68000)
147 38e584a0 bellard
#define AREG0 "%a5"
148 38e584a0 bellard
#define AREG1 "%a4"
149 38e584a0 bellard
#define AREG2 "%d7"
150 522777bb ths
#elif defined(__ia64__)
151 b8076a74 bellard
#define AREG0 "r7"
152 b8076a74 bellard
#define AREG1 "r4"
153 b8076a74 bellard
#define AREG2 "r5"
154 522777bb ths
#else
155 522777bb ths
#error unsupported CPU
156 79638566 bellard
#endif
157 79638566 bellard
158 79638566 bellard
#define xglue(x, y) x ## y
159 79638566 bellard
#define glue(x, y) xglue(x, y)
160 9621339d bellard
#define stringify(s)        tostring(s)
161 9621339d bellard
#define tostring(s)        #s
162 79638566 bellard
163 9b7b85d2 pbrook
/* The return address may point to the start of the next instruction.
164 9b7b85d2 pbrook
   Subtracting one gets us the call instruction itself.  */
165 9b7b85d2 pbrook
#if defined(__s390__)
166 9b7b85d2 pbrook
# define GETPC() ((void*)(((unsigned long)__builtin_return_address(0) & 0x7fffffffUL) - 1))
167 9b7b85d2 pbrook
#elif defined(__arm__)
168 9b7b85d2 pbrook
/* Thumb return addresses have the low bit set, so we need to subtract two.
169 9b7b85d2 pbrook
   This is still safe in ARM mode because instructions are 4 bytes.  */
170 9b7b85d2 pbrook
# define GETPC() ((void *)((unsigned long)__builtin_return_address(0) - 2))
171 9b7b85d2 pbrook
#else
172 9b7b85d2 pbrook
# define GETPC() ((void *)((unsigned long)__builtin_return_address(0) - 1))
173 9b7b85d2 pbrook
#endif
174 9b7b85d2 pbrook
175 67867308 bellard
#endif /* !defined(__DYNGEN_EXEC_H__) */