You need to sign in or sign up before continuing.
exec-i386.h 6.3 KB
Newer Older
B
bellard 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/*
 *  i386 execution defines 
 *
 *  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
 */
B
bellard 已提交
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
typedef unsigned char uint8_t;
typedef unsigned short uint16_t;
typedef unsigned int uint32_t;
typedef unsigned long long uint64_t;

typedef signed char int8_t;
typedef signed short int16_t;
typedef signed int int32_t;
typedef signed long long int64_t;

#define bswap32(x) \
({ \
	uint32_t __x = (x); \
	((uint32_t)( \
		(((uint32_t)(__x) & (uint32_t)0x000000ffUL) << 24) | \
		(((uint32_t)(__x) & (uint32_t)0x0000ff00UL) <<  8) | \
		(((uint32_t)(__x) & (uint32_t)0x00ff0000UL) >>  8) | \
		(((uint32_t)(__x) & (uint32_t)0xff000000UL) >> 24) )); \
})

#define NULL 0
#include <fenv.h>

typedef struct FILE FILE;
extern FILE *logfile;
extern int loglevel;
extern int fprintf(FILE *, const char *, ...);
B
bellard 已提交
47
extern int printf(const char *, ...);
B
bellard 已提交
48 49 50 51 52 53 54 55

#ifdef __i386__
register unsigned int T0 asm("ebx");
register unsigned int T1 asm("esi");
register unsigned int A0 asm("edi");
register struct CPUX86State *env asm("ebp");
#endif
#ifdef __powerpc__
B
bellard 已提交
56 57 58 59 60 61 62 63
register unsigned int EAX asm("r16");
register unsigned int ECX asm("r17");
register unsigned int EDX asm("r18");
register unsigned int EBX asm("r19");
register unsigned int ESP asm("r20");
register unsigned int EBP asm("r21");
register unsigned int ESI asm("r22");
register unsigned int EDI asm("r23");
B
bellard 已提交
64 65 66 67
register unsigned int T0 asm("r24");
register unsigned int T1 asm("r25");
register unsigned int A0 asm("r26");
register struct CPUX86State *env asm("r27");
B
bellard 已提交
68
#define USE_INT_TO_FLOAT_HELPERS
B
bellard 已提交
69
#define BUGGY_GCC_DIV64
B
bellard 已提交
70 71 72 73 74 75 76 77
#define reg_EAX
#define reg_ECX
#define reg_EDX
#define reg_EBX
#define reg_ESP
#define reg_EBP
#define reg_ESI
#define reg_EDI
B
bellard 已提交
78 79 80 81 82 83 84 85 86 87 88 89 90 91
#endif
#ifdef __arm__
register unsigned int T0 asm("r4");
register unsigned int T1 asm("r5");
register unsigned int A0 asm("r6");
register struct CPUX86State *env asm("r7");
#endif
#ifdef __mips__
register unsigned int T0 asm("s0");
register unsigned int T1 asm("s1");
register unsigned int A0 asm("s2");
register struct CPUX86State *env asm("s3");
#endif
#ifdef __sparc__
B
bellard 已提交
92 93 94 95 96 97 98 99 100 101 102 103
register unsigned int EAX asm("l0");
register unsigned int ECX asm("l1");
register unsigned int EDX asm("l2");
register unsigned int EBX asm("l3");
register unsigned int ESP asm("l4");
register unsigned int EBP asm("l5");
register unsigned int ESI asm("l6");
register unsigned int EDI asm("l7");
register unsigned int T0 asm("g1");
register unsigned int T1 asm("g2");
register unsigned int A0 asm("g3");
register struct CPUX86State *env asm("g6");
B
bellard 已提交
104
#define USE_FP_CONVERT
B
bellard 已提交
105 106 107 108 109 110 111 112
#define reg_EAX
#define reg_ECX
#define reg_EDX
#define reg_EBX
#define reg_ESP
#define reg_EBP
#define reg_ESI
#define reg_EDI
B
bellard 已提交
113
#endif
B
bellard 已提交
114 115 116 117 118 119
#ifdef __s390__
register unsigned int T0 asm("r7");
register unsigned int T1 asm("r8");
register unsigned int A0 asm("r9");
register struct CPUX86State *env asm("r10");
#endif
B
bellard 已提交
120 121 122 123
#ifdef __alpha__
register unsigned int T0 asm("$9");
register unsigned int T1 asm("$10");
register unsigned int A0 asm("$11");
B
bellard 已提交
124 125 126 127 128 129 130
register unsigned int EAX asm("$12");
register unsigned int ESP asm("$13");
register unsigned int EBP asm("$14");
register struct CPUX86State *env asm("$15");
#define reg_EAX
#define reg_ESP
#define reg_EBP
B
bellard 已提交
131
#endif
B
bellard 已提交
132 133 134 135 136 137
#ifdef __ia64__
register unsigned int T0 asm("r24");
register unsigned int T1 asm("r25");
register unsigned int A0 asm("r26");
register struct CPUX86State *env asm("r27");
#endif
B
bellard 已提交
138 139 140 141 142 143 144 145 146 147 148

/* 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)

B
bellard 已提交
149
#ifndef reg_EAX
B
bellard 已提交
150
#define EAX (env->regs[R_EAX])
B
bellard 已提交
151 152
#endif
#ifndef reg_ECX
B
bellard 已提交
153
#define ECX (env->regs[R_ECX])
B
bellard 已提交
154 155
#endif
#ifndef reg_EDX
B
bellard 已提交
156
#define EDX (env->regs[R_EDX])
B
bellard 已提交
157 158
#endif
#ifndef reg_EBX
B
bellard 已提交
159
#define EBX (env->regs[R_EBX])
B
bellard 已提交
160 161
#endif
#ifndef reg_ESP
B
bellard 已提交
162
#define ESP (env->regs[R_ESP])
B
bellard 已提交
163 164
#endif
#ifndef reg_EBP
B
bellard 已提交
165
#define EBP (env->regs[R_EBP])
B
bellard 已提交
166 167
#endif
#ifndef reg_ESI
B
bellard 已提交
168
#define ESI (env->regs[R_ESI])
B
bellard 已提交
169 170
#endif
#ifndef reg_EDI
B
bellard 已提交
171
#define EDI (env->regs[R_EDI])
B
bellard 已提交
172
#endif
B
bellard 已提交
173
#define EIP  (env->eip)
B
bellard 已提交
174 175 176 177 178 179 180 181 182 183 184 185
#define DF  (env->df)

#define CC_SRC (env->cc_src)
#define CC_DST (env->cc_dst)
#define CC_OP  (env->cc_op)

/* float macros */
#define FT0    (env->ft0)
#define ST0    (env->fpregs[env->fpstt])
#define ST(n)  (env->fpregs[(env->fpstt + (n)) & 7])
#define ST1    ST(1)

B
bellard 已提交
186 187 188 189
#ifdef USE_FP_CONVERT
#define FP_CONVERT  (env->fp_convert)
#endif

B
bellard 已提交
190 191 192 193 194 195 196 197 198 199 200 201 202
#ifdef __alpha__
/* 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 __attribute__((visibility("hidden")));
extern int __op_param2 __attribute__((visibility("hidden")));
extern int __op_param3 __attribute__((visibility("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
B
bellard 已提交
203 204 205 206
extern int __op_param1, __op_param2, __op_param3;
#define PARAM1 ((long)(&__op_param1))
#define PARAM2 ((long)(&__op_param2))
#define PARAM3 ((long)(&__op_param3))
B
bellard 已提交
207
#endif
B
bellard 已提交
208 209 210 211 212 213 214 215 216

#include "cpu-i386.h"

typedef struct CCTable {
    int (*compute_all)(void); /* return all the flags */
    int (*compute_c)(void);  /* return the C flag */
} CCTable;

extern CCTable cc_table[];
B
bellard 已提交
217 218

void load_seg(int seg_reg, int selector);
B
bellard 已提交
219 220
void cpu_lock(void);
void cpu_unlock(void);
B
bellard 已提交
221
void raise_exception_err(int exception_index, int error_code);
B
bellard 已提交
222 223 224 225
void raise_exception(int exception_index);

void OPPROTO op_movl_eflags_T0(void);
void OPPROTO op_movl_T0_eflags(void);