exec-i386.h 5.9 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 92 93 94 95
#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__
register unsigned int T0 asm("l0");
register unsigned int T1 asm("l1");
register unsigned int A0 asm("l2");
register struct CPUX86State *env asm("l3");
B
bellard 已提交
96
#define USE_FP_CONVERT
B
bellard 已提交
97
#endif
B
bellard 已提交
98 99 100 101 102 103
#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 已提交
104 105 106 107
#ifdef __alpha__
register unsigned int T0 asm("$9");
register unsigned int T1 asm("$10");
register unsigned int A0 asm("$11");
B
bellard 已提交
108 109 110 111 112 113 114
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 已提交
115
#endif
B
bellard 已提交
116 117 118 119 120 121
#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 已提交
122 123 124 125 126 127 128 129 130 131 132

/* 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 已提交
133
#ifndef reg_EAX
B
bellard 已提交
134
#define EAX (env->regs[R_EAX])
B
bellard 已提交
135 136
#endif
#ifndef reg_ECX
B
bellard 已提交
137
#define ECX (env->regs[R_ECX])
B
bellard 已提交
138 139
#endif
#ifndef reg_EDX
B
bellard 已提交
140
#define EDX (env->regs[R_EDX])
B
bellard 已提交
141 142
#endif
#ifndef reg_EBX
B
bellard 已提交
143
#define EBX (env->regs[R_EBX])
B
bellard 已提交
144 145
#endif
#ifndef reg_ESP
B
bellard 已提交
146
#define ESP (env->regs[R_ESP])
B
bellard 已提交
147 148
#endif
#ifndef reg_EBP
B
bellard 已提交
149
#define EBP (env->regs[R_EBP])
B
bellard 已提交
150 151
#endif
#ifndef reg_ESI
B
bellard 已提交
152
#define ESI (env->regs[R_ESI])
B
bellard 已提交
153 154
#endif
#ifndef reg_EDI
B
bellard 已提交
155
#define EDI (env->regs[R_EDI])
B
bellard 已提交
156
#endif
B
bellard 已提交
157
#define EIP  (env->eip)
B
bellard 已提交
158 159 160 161 162 163 164 165 166 167 168 169
#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 已提交
170 171 172 173
#ifdef USE_FP_CONVERT
#define FP_CONVERT  (env->fp_convert)
#endif

B
bellard 已提交
174 175 176 177 178 179 180 181 182 183 184 185 186
#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 已提交
187 188 189 190
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 已提交
191
#endif
B
bellard 已提交
192 193 194 195 196 197 198 199 200

#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 已提交
201 202

void load_seg(int seg_reg, int selector);
B
bellard 已提交
203 204
void cpu_lock(void);
void cpu_unlock(void);
B
bellard 已提交
205
void raise_exception_err(int exception_index, int error_code);
B
bellard 已提交
206 207 208 209
void raise_exception(int exception_index);

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