blob: cc2502e68e52dacc883825334f33c7c89180bf2c [file] [log] [blame]
bellard79638562003-06-15 19:46:57 +00001/*
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 */
bellard67867302003-11-23 17:05:30 +000020#if !defined(__DYNGEN_EXEC_H__)
21#define __DYNGEN_EXEC_H__
22
bellardec530c82006-04-25 22:36:06 +000023/* 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
bellard1e6cae92004-07-10 15:31:19 +000030/* 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. */
bellard513b5002004-01-04 17:44:08 +000033#include <stddef.h>
34
blueswir1128ab2f2008-08-15 18:33:42 +000035#ifdef __OpenBSD__
36#include <sys/types.h>
37#else
bellard79638562003-06-15 19:46:57 +000038typedef unsigned char uint8_t;
39typedef unsigned short uint16_t;
40typedef unsigned int uint32_t;
bellard74ccb342006-07-18 21:23:34 +000041// Linux/Sparc64 defines uint64_t
ths31a53c62008-06-05 23:06:46 +000042#if !(defined (__sparc_v9__) && defined(__linux__)) && !(defined(__APPLE__) && defined(__x86_64__))
bellard4f2ac232004-04-26 19:44:02 +000043/* XXX may be done for all 64 bits targets ? */
malc810260a2008-07-23 19:17:46 +000044#if defined (__x86_64__) || defined(__ia64) || defined(__s390x__) || defined(__alpha__) || defined(__powerpc64__)
bellard4f2ac232004-04-26 19:44:02 +000045typedef unsigned long uint64_t;
46#else
bellard79638562003-06-15 19:46:57 +000047typedef unsigned long long uint64_t;
bellard4f2ac232004-04-26 19:44:02 +000048#endif
bellard74ccb342006-07-18 21:23:34 +000049#endif
bellard79638562003-06-15 19:46:57 +000050
bellardec530c82006-04-25 22:36:06 +000051/* 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__
bellard79638562003-06-15 19:46:57 +000055typedef signed char int8_t;
bellardec530c82006-04-25 22:36:06 +000056#endif
bellard79638562003-06-15 19:46:57 +000057typedef signed short int16_t;
58typedef signed int int32_t;
bellard74ccb342006-07-18 21:23:34 +000059// Linux/Sparc64 defines int64_t
ths31a53c62008-06-05 23:06:46 +000060#if !(defined (__sparc_v9__) && defined(__linux__)) && !(defined(__APPLE__) && defined(__x86_64__))
malc810260a2008-07-23 19:17:46 +000061#if defined (__x86_64__) || defined(__ia64) || defined(__s390x__) || defined(__alpha__) || defined(__powerpc64__)
bellard4f2ac232004-04-26 19:44:02 +000062typedef signed long int64_t;
63#else
bellard79638562003-06-15 19:46:57 +000064typedef signed long long int64_t;
bellard4f2ac232004-04-26 19:44:02 +000065#endif
bellard74ccb342006-07-18 21:23:34 +000066#endif
blueswir1128ab2f2008-08-15 18:33:42 +000067#endif
bellard79638562003-06-15 19:46:57 +000068
pbrook1057eaa2007-02-04 13:37:44 +000069/* XXX: This may be wrong for 64-bit ILP32 hosts. */
70typedef void * host_reg_t;
71
bellard67867302003-11-23 17:05:30 +000072#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
thscce10752007-04-02 12:39:43 +000085#ifdef _BSD
86typedef struct __sFILE FILE;
87#else
bellard79638562003-06-15 19:46:57 +000088typedef struct FILE FILE;
thscce10752007-04-02 12:39:43 +000089#endif
bellard79638562003-06-15 19:46:57 +000090extern int fprintf(FILE *, const char *, ...);
ths24c7b0e2007-03-30 16:44:54 +000091extern int fputs(const char *, FILE *);
bellard79638562003-06-15 19:46:57 +000092extern int printf(const char *, ...);
bellard513b5002004-01-04 17:44:08 +000093#undef NULL
bellard79638562003-06-15 19:46:57 +000094#define NULL 0
bellard79638562003-06-15 19:46:57 +000095
ths522777b2007-05-08 23:30:44 +000096#if defined(__i386__)
bellard79638562003-06-15 19:46:57 +000097#define AREG0 "ebp"
98#define AREG1 "ebx"
99#define AREG2 "esi"
100#define AREG3 "edi"
ths522777b2007-05-08 23:30:44 +0000101#elif defined(__x86_64__)
ths43024c62007-02-10 18:21:04 +0000102#define AREG0 "r14"
103#define AREG1 "r15"
bellardbc51c5c2004-03-17 23:46:04 +0000104#define AREG2 "r12"
105#define AREG3 "r13"
ths43024c62007-02-10 18:21:04 +0000106//#define AREG4 "rbp"
107//#define AREG5 "rbx"
ths522777b2007-05-08 23:30:44 +0000108#elif defined(__powerpc__)
bellard79638562003-06-15 19:46:57 +0000109#define AREG0 "r27"
110#define AREG1 "r24"
111#define AREG2 "r25"
112#define AREG3 "r26"
bellardbf71c9d2004-11-09 22:12:08 +0000113/* XXX: suppress this hack */
114#if defined(CONFIG_USER_ONLY)
bellard79638562003-06-15 19:46:57 +0000115#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"
bellardbf71c9d2004-11-09 22:12:08 +0000123#endif
ths522777b2007-05-08 23:30:44 +0000124#elif defined(__arm__)
bellard79638562003-06-15 19:46:57 +0000125#define AREG0 "r7"
126#define AREG1 "r4"
127#define AREG2 "r5"
128#define AREG3 "r6"
aurel32f54b3f92008-04-12 20:14:54 +0000129#elif defined(__hppa__)
130#define AREG0 "r17"
131#define AREG1 "r14"
132#define AREG2 "r15"
133#define AREG3 "r16"
ths522777b2007-05-08 23:30:44 +0000134#elif defined(__mips__)
thsc4b89d12007-05-05 19:23:11 +0000135#define AREG0 "fp"
bellard79638562003-06-15 19:46:57 +0000136#define AREG1 "s0"
137#define AREG2 "s1"
138#define AREG3 "s2"
thsc4b89d12007-05-05 19:23:11 +0000139#define AREG4 "s3"
140#define AREG5 "s4"
141#define AREG6 "s5"
142#define AREG7 "s6"
143#define AREG8 "s7"
ths522777b2007-05-08 23:30:44 +0000144#elif defined(__sparc__)
bellardfdbb4692006-06-14 17:32:25 +0000145#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
bellard74ccb342006-07-18 21:23:34 +0000152#ifdef __sparc_v9__
blueswir1e97b6402008-07-26 17:19:35 +0000153#define AREG0 "g5"
154#define AREG1 "g6"
155#define AREG2 "g7"
bellard74ccb342006-07-18 21:23:34 +0000156#else
bellard79638562003-06-15 19:46:57 +0000157#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"
bellardfdbb4692006-06-14 17:32:25 +0000169#endif
bellard74ccb342006-07-18 21:23:34 +0000170#endif
ths522777b2007-05-08 23:30:44 +0000171#elif defined(__s390__)
bellard79638562003-06-15 19:46:57 +0000172#define AREG0 "r10"
173#define AREG1 "r7"
174#define AREG2 "r8"
175#define AREG3 "r9"
ths522777b2007-05-08 23:30:44 +0000176#elif defined(__alpha__)
bellard79638562003-06-15 19:46:57 +0000177/* 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"
ths522777b2007-05-08 23:30:44 +0000186#elif defined(__mc68000)
bellard38e584a2003-08-10 22:14:22 +0000187#define AREG0 "%a5"
188#define AREG1 "%a4"
189#define AREG2 "%d7"
190#define AREG3 "%d6"
191#define AREG4 "%d5"
ths522777b2007-05-08 23:30:44 +0000192#elif defined(__ia64__)
bellardb8076a72005-04-07 22:20:31 +0000193#define AREG0 "r7"
194#define AREG1 "r4"
195#define AREG2 "r5"
196#define AREG3 "r6"
ths522777b2007-05-08 23:30:44 +0000197#else
198#error unsupported CPU
bellard79638562003-06-15 19:46:57 +0000199#endif
200
bellard79638562003-06-15 19:46:57 +0000201#define xglue(x, y) x ## y
202#define glue(x, y) xglue(x, y)
bellard96213392003-07-11 15:17:41 +0000203#define stringify(s) tostring(s)
204#define tostring(s) #s
bellard79638562003-06-15 19:46:57 +0000205
ths76d83bd2007-11-18 21:22:10 +0000206#if defined(__alpha__) || defined(__s390__)
bellard79638562003-06-15 19:46:57 +0000207/* the symbols are considered non exported so a br immediate is generated */
208#define __hidden __attribute__((visibility("hidden")))
209#else
ths5fafdf22007-09-16 21:08:06 +0000210#define __hidden
bellard79638562003-06-15 19:46:57 +0000211#endif
212
pbrook9b7b85d2008-05-25 00:36:06 +0000213/* 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
bellard67867302003-11-23 17:05:30 +0000225#endif /* !defined(__DYNGEN_EXEC_H__) */