dyngen-exec.h 6.33 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/*
 *  dyngen defines for micro operation code
 *
 *  Copyright (c) 2003 Fabrice Bellard
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
20 21 22
#if !defined(__DYNGEN_EXEC_H__)
#define __DYNGEN_EXEC_H__

bellard's avatar
comment  
bellard committed
23 24 25
/* NOTE: standard headers should be used with special care at this
   point because host CPU registers are used as global variables. Some
   host headers do not allow that. */
26 27
#include <stddef.h>

28 29 30
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
bellard's avatar
bellard committed
31
/* XXX may be done for all 64 bits targets ? */
bellard's avatar
bellard committed
32
#if defined (__x86_64__) || defined(__ia64)
bellard's avatar
bellard committed
33 34
typedef unsigned long uint64_t;
#else
35
typedef unsigned long long uint64_t;
bellard's avatar
bellard committed
36
#endif
37 38 39 40

typedef signed char int8_t;
typedef signed short int16_t;
typedef signed int int32_t;
bellard's avatar
bellard committed
41
#if defined (__x86_64__) || defined(__ia64)
bellard's avatar
bellard committed
42 43
typedef signed long int64_t;
#else
44
typedef signed long long int64_t;
bellard's avatar
bellard committed
45
#endif
46

47 48 49 50 51 52 53 54 55 56 57 58 59
#define INT8_MIN		(-128)
#define INT16_MIN		(-32767-1)
#define INT32_MIN		(-2147483647-1)
#define INT64_MIN		(-(int64_t)(9223372036854775807)-1)
#define INT8_MAX		(127)
#define INT16_MAX		(32767)
#define INT32_MAX		(2147483647)
#define INT64_MAX		((int64_t)(9223372036854775807))
#define UINT8_MAX		(255)
#define UINT16_MAX		(65535)
#define UINT32_MAX		(4294967295U)
#define UINT64_MAX		((uint64_t)(18446744073709551615))

60 61 62
typedef struct FILE FILE;
extern int fprintf(FILE *, const char *, ...);
extern int printf(const char *, ...);
63
#undef NULL
64 65 66 67 68 69 70 71
#define NULL 0

#ifdef __i386__
#define AREG0 "ebp"
#define AREG1 "ebx"
#define AREG2 "esi"
#define AREG3 "edi"
#endif
72 73 74 75 76 77 78 79
#ifdef __x86_64__
#define AREG0 "rbp"
#define AREG1 "rbx"
#define AREG2 "r12"
#define AREG3 "r13"
#define AREG4 "r14"
#define AREG5 "r15"
#endif
80 81 82 83 84
#ifdef __powerpc__
#define AREG0 "r27"
#define AREG1 "r24"
#define AREG2 "r25"
#define AREG3 "r26"
85 86
/* XXX: suppress this hack */
#if defined(CONFIG_USER_ONLY)
87 88 89 90 91 92 93 94
#define AREG4 "r16"
#define AREG5 "r17"
#define AREG6 "r18"
#define AREG7 "r19"
#define AREG8 "r20"
#define AREG9 "r21"
#define AREG10 "r22"
#define AREG11 "r23"
95
#endif
96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
#define USE_INT_TO_FLOAT_HELPERS
#define BUGGY_GCC_DIV64
#endif
#ifdef __arm__
#define AREG0 "r7"
#define AREG1 "r4"
#define AREG2 "r5"
#define AREG3 "r6"
#endif
#ifdef __mips__
#define AREG0 "s3"
#define AREG1 "s0"
#define AREG2 "s1"
#define AREG3 "s2"
#endif
#ifdef __sparc__
#define AREG0 "g6"
#define AREG1 "g1"
#define AREG2 "g2"
#define AREG3 "g3"
#define AREG4 "l0"
#define AREG5 "l1"
#define AREG6 "l2"
#define AREG7 "l3"
#define AREG8 "l4"
#define AREG9 "l5"
#define AREG10 "l6"
#define AREG11 "l7"
#define USE_FP_CONVERT
#endif
#ifdef __s390__
#define AREG0 "r10"
#define AREG1 "r7"
#define AREG2 "r8"
#define AREG3 "r9"
#endif
#ifdef __alpha__
/* Note $15 is the frame pointer, so anything in op-i386.c that would
   require a frame pointer, like alloca, would probably loose.  */
#define AREG0 "$15"
#define AREG1 "$9"
#define AREG2 "$10"
#define AREG3 "$11"
#define AREG4 "$12"
#define AREG5 "$13"
#define AREG6 "$14"
#endif
bellard's avatar
bellard committed
143 144 145 146 147 148 149
#ifdef __mc68000
#define AREG0 "%a5"
#define AREG1 "%a4"
#define AREG2 "%d7"
#define AREG3 "%d6"
#define AREG4 "%d5"
#endif
150
#ifdef __ia64__
bellard's avatar
bellard committed
151 152 153 154
#define AREG0 "r7"
#define AREG1 "r4"
#define AREG2 "r5"
#define AREG3 "r6"
155 156 157 158 159 160 161 162 163 164 165
#endif

/* force GCC to generate only one epilog at the end of the function */
#define FORCE_RET() asm volatile ("");

#ifndef OPPROTO
#define OPPROTO
#endif

#define xglue(x, y) x ## y
#define glue(x, y) xglue(x, y)
bellard's avatar
bellard committed
166 167
#define stringify(s)	tostring(s)
#define tostring(s)	#s
168 169 170 171 172 173 174 175

#ifdef __alpha__
/* the symbols are considered non exported so a br immediate is generated */
#define __hidden __attribute__((visibility("hidden")))
#else
#define __hidden 
#endif

bellard's avatar
bellard committed
176
#if defined(__alpha__)
177 178 179 180 181 182 183 184 185 186 187 188
/* Suggested by Richard Henderson. This will result in code like
        ldah $0,__op_param1($29)        !gprelhigh
        lda $0,__op_param1($0)          !gprellow
   We can then conveniently change $29 to $31 and adapt the offsets to
   emit the appropriate constant.  */
extern int __op_param1 __hidden;
extern int __op_param2 __hidden;
extern int __op_param3 __hidden;
#define PARAM1 ({ int _r; asm("" : "=r"(_r) : "0" (&__op_param1)); _r; })
#define PARAM2 ({ int _r; asm("" : "=r"(_r) : "0" (&__op_param2)); _r; })
#define PARAM3 ({ int _r; asm("" : "=r"(_r) : "0" (&__op_param3)); _r; })
#else
bellard's avatar
bellard committed
189 190 191
#if defined(__APPLE__)
static int __op_param1, __op_param2, __op_param3;
#else
192
extern int __op_param1, __op_param2, __op_param3;
bellard's avatar
bellard committed
193
#endif
194 195 196
#define PARAM1 ((long)(&__op_param1))
#define PARAM2 ((long)(&__op_param2))
#define PARAM3 ((long)(&__op_param3))
bellard's avatar
bellard committed
197
#endif /* !defined(__alpha__) */
198

bellard's avatar
bellard committed
199
extern int __op_jmp0, __op_jmp1, __op_jmp2, __op_jmp3;
bellard's avatar
bellard committed
200

bellard's avatar
bellard committed
201
#if defined(_WIN32) || defined(__APPLE__)
bellard's avatar
bellard committed
202 203 204 205 206
#define ASM_NAME(x) "_" #x
#else
#define ASM_NAME(x) #x
#endif

bellard's avatar
bellard committed
207 208
#ifdef __i386__
#define EXIT_TB() asm volatile ("ret")
bellard's avatar
bellard committed
209
#define GOTO_LABEL_PARAM(n) asm volatile ("jmp " ASM_NAME(__op_gen_label) #n)
bellard's avatar
bellard committed
210
#endif
211 212
#ifdef __x86_64__
#define EXIT_TB() asm volatile ("ret")
bellard's avatar
bellard committed
213
#define GOTO_LABEL_PARAM(n) asm volatile ("jmp " ASM_NAME(__op_gen_label) #n)
214
#endif
bellard's avatar
bellard committed
215 216
#ifdef __powerpc__
#define EXIT_TB() asm volatile ("blr")
bellard's avatar
bellard committed
217
#define GOTO_LABEL_PARAM(n) asm volatile ("b " ASM_NAME(__op_gen_label) #n)
bellard's avatar
bellard committed
218 219 220 221 222 223 224 225 226
#endif
#ifdef __s390__
#define EXIT_TB() asm volatile ("br %r14")
#endif
#ifdef __alpha__
#define EXIT_TB() asm volatile ("ret")
#endif
#ifdef __ia64__
#define EXIT_TB() asm volatile ("br.ret.sptk.many b0;;")
bellard's avatar
bellard committed
227 228
#define GOTO_LABEL_PARAM(n) asm volatile ("br.sptk.many " \
					  ASM_NAME(__op_gen_label) #n)
bellard's avatar
bellard committed
229 230
#endif
#ifdef __sparc__
bellard's avatar
bellard committed
231
#define EXIT_TB() asm volatile ("jmpl %i0 + 8, %g0\n" \
bellard's avatar
bellard committed
232 233 234 235
                                "nop")
#endif
#ifdef __arm__
#define EXIT_TB() asm volatile ("b exec_loop")
bellard's avatar
bellard committed
236
#define GOTO_LABEL_PARAM(n) asm volatile ("b " ASM_NAME(__op_gen_label) #n)
bellard's avatar
bellard committed
237
#endif
bellard's avatar
bellard committed
238 239 240
#ifdef __mc68000
#define EXIT_TB() asm volatile ("rts")
#endif
241 242

#endif /* !defined(__DYNGEN_EXEC_H__) */