17 |
* License along with this library; if not, write to the Free Software |
* 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 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
19 |
*/ |
*/ |
20 |
typedef unsigned char uint8_t; |
#include "dyngen-exec.h" |
|
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) )); \ |
|
|
}) |
|
21 |
|
|
22 |
#define NULL 0 |
/* at least 4 register variables are defines */ |
23 |
#include <fenv.h> |
register struct CPUX86State *env asm(AREG0); |
24 |
|
register uint32_t T0 asm(AREG1); |
25 |
typedef struct FILE FILE; |
register uint32_t T1 asm(AREG2); |
26 |
extern FILE *logfile; |
register uint32_t T2 asm(AREG3); |
27 |
extern int loglevel; |
|
28 |
extern int fprintf(FILE *, const char *, ...); |
#define A0 T2 |
29 |
extern int printf(const char *, ...); |
|
30 |
|
/* if more registers are available, we define some registers too */ |
31 |
#ifdef __i386__ |
#ifdef AREG4 |
32 |
register unsigned int T0 asm("ebx"); |
register uint32_t EAX asm(AREG4); |
|
register unsigned int T1 asm("esi"); |
|
|
register unsigned int A0 asm("edi"); |
|
|
register struct CPUX86State *env asm("ebp"); |
|
|
#endif |
|
|
#ifdef __powerpc__ |
|
|
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"); |
|
|
register unsigned int T0 asm("r24"); |
|
|
register unsigned int T1 asm("r25"); |
|
|
register unsigned int A0 asm("r26"); |
|
|
register struct CPUX86State *env asm("r27"); |
|
|
#define USE_INT_TO_FLOAT_HELPERS |
|
|
#define BUGGY_GCC_DIV64 |
|
33 |
#define reg_EAX |
#define reg_EAX |
34 |
#define reg_ECX |
#endif |
35 |
#define reg_EDX |
|
36 |
#define reg_EBX |
#ifdef AREG5 |
37 |
|
register uint32_t ESP asm(AREG5); |
38 |
#define reg_ESP |
#define reg_ESP |
39 |
|
#endif |
40 |
|
|
41 |
|
#ifdef AREG6 |
42 |
|
register uint32_t EBP asm(AREG6); |
43 |
#define reg_EBP |
#define reg_EBP |
|
#define reg_ESI |
|
|
#define reg_EDI |
|
44 |
#endif |
#endif |
45 |
#ifdef __arm__ |
|
46 |
register unsigned int T0 asm("r4"); |
#ifdef AREG7 |
47 |
register unsigned int T1 asm("r5"); |
register uint32_t ECX asm(AREG7); |
|
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 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"); |
|
|
#define USE_FP_CONVERT |
|
|
#define reg_EAX |
|
48 |
#define reg_ECX |
#define reg_ECX |
|
#define reg_EDX |
|
|
#define reg_EBX |
|
|
#define reg_ESP |
|
|
#define reg_EBP |
|
|
#define reg_ESI |
|
|
#define reg_EDI |
|
49 |
#endif |
#endif |
50 |
#ifdef __s390__ |
|
51 |
register unsigned int T0 asm("r7"); |
#ifdef AREG8 |
52 |
register unsigned int T1 asm("r8"); |
register uint32_t EDX asm(AREG8); |
53 |
register unsigned int A0 asm("r9"); |
#define reg_EDX |
|
register struct CPUX86State *env asm("r10"); |
|
|
#endif |
|
|
#ifdef __alpha__ |
|
|
register unsigned int T0 asm("$9"); |
|
|
register unsigned int T1 asm("$10"); |
|
|
register unsigned int A0 asm("$11"); |
|
|
register unsigned int EAX asm("$12"); |
|
|
register unsigned int ESP asm("$13"); |
|
|
register unsigned int EBP asm("$14"); |
|
|
/* Note $15 is the frame pointer, so anything in op-i386.c that would |
|
|
require a frame pointer, like alloca, would probably loose. */ |
|
|
register struct CPUX86State *env asm("$15"); |
|
|
#define reg_EAX |
|
|
#define reg_ESP |
|
|
#define reg_EBP |
|
54 |
#endif |
#endif |
55 |
#ifdef __ia64__ |
|
56 |
register unsigned int T0 asm("r24"); |
#ifdef AREG9 |
57 |
register unsigned int T1 asm("r25"); |
register uint32_t EBX asm(AREG9); |
58 |
register unsigned int A0 asm("r26"); |
#define reg_EBX |
|
register struct CPUX86State *env asm("r27"); |
|
59 |
#endif |
#endif |
60 |
|
|
61 |
/* force GCC to generate only one epilog at the end of the function */ |
#ifdef AREG10 |
62 |
#define FORCE_RET() asm volatile (""); |
register uint32_t ESI asm(AREG10); |
63 |
|
#define reg_ESI |
64 |
|
#endif |
65 |
|
|
66 |
#ifndef OPPROTO |
#ifdef AREG11 |
67 |
#define OPPROTO |
register uint32_t EDI asm(AREG11); |
68 |
|
#define reg_EDI |
69 |
#endif |
#endif |
70 |
|
|
71 |
#define xglue(x, y) x ## y |
extern FILE *logfile; |
72 |
#define glue(x, y) xglue(x, y) |
extern int loglevel; |
73 |
|
|
74 |
#ifndef reg_EAX |
#ifndef reg_EAX |
75 |
#define EAX (env->regs[R_EAX]) |
#define EAX (env->regs[R_EAX]) |
112 |
#define FP_CONVERT (env->fp_convert) |
#define FP_CONVERT (env->fp_convert) |
113 |
#endif |
#endif |
114 |
|
|
|
#ifdef __alpha__ |
|
|
/* the symbols are considered non exported so a br immediate is generated */ |
|
|
#define __hidden __attribute__((visibility("hidden"))) |
|
|
#else |
|
|
#define __hidden |
|
|
#endif |
|
|
|
|
|
#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 __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 |
|
|
extern int __op_param1, __op_param2, __op_param3; |
|
|
#define PARAM1 ((long)(&__op_param1)) |
|
|
#define PARAM2 ((long)(&__op_param2)) |
|
|
#define PARAM3 ((long)(&__op_param3)) |
|
|
#endif |
|
|
extern int __op_jmp0, __op_jmp1; |
|
|
|
|
115 |
#include "cpu-i386.h" |
#include "cpu-i386.h" |
116 |
#include "exec.h" |
#include "exec.h" |
117 |
|
|
321 |
void helper_fsave(uint8_t *ptr, int data32); |
void helper_fsave(uint8_t *ptr, int data32); |
322 |
void helper_frstor(uint8_t *ptr, int data32); |
void helper_frstor(uint8_t *ptr, int data32); |
323 |
|
|
324 |
|
const uint8_t parity_table[256]; |
325 |
|
const uint8_t rclw_table[32]; |
326 |
|
const uint8_t rclb_table[32]; |