21 |
21 |
#include "dyngen-exec.h"
|
22 |
22 |
|
23 |
23 |
/* XXX: factorize this mess */
|
24 |
|
#if defined(__alpha__) || defined (__ia64__) || defined(__x86_64__)
|
25 |
|
#define HOST_LONG_BITS 64
|
26 |
|
#else
|
27 |
|
#define HOST_LONG_BITS 32
|
28 |
|
#endif
|
29 |
|
|
30 |
24 |
#ifdef TARGET_X86_64
|
31 |
25 |
#define TARGET_LONG_BITS 64
|
32 |
26 |
#else
|
33 |
27 |
#define TARGET_LONG_BITS 32
|
34 |
28 |
#endif
|
35 |
29 |
|
|
30 |
#include "cpu-defs.h"
|
|
31 |
|
36 |
32 |
/* at least 4 register variables are defined */
|
37 |
33 |
register struct CPUX86State *env asm(AREG0);
|
38 |
34 |
|
39 |
|
/* XXX: use 64 bit regs if HOST_LONG_BITS == 64 */
|
40 |
|
#if TARGET_LONG_BITS == 32
|
|
35 |
#if TARGET_LONG_BITS > HOST_LONG_BITS
|
|
36 |
|
|
37 |
/* no registers can be used */
|
|
38 |
#define T0 (env->t0)
|
|
39 |
#define T1 (env->t1)
|
|
40 |
#define T2 (env->t2)
|
41 |
41 |
|
42 |
|
register uint32_t T0 asm(AREG1);
|
43 |
|
register uint32_t T1 asm(AREG2);
|
44 |
|
register uint32_t T2 asm(AREG3);
|
|
42 |
#else
|
|
43 |
|
|
44 |
/* XXX: use unsigned long instead of target_ulong - better code will
|
|
45 |
be generated for 64 bit CPUs */
|
|
46 |
register target_ulong T0 asm(AREG1);
|
|
47 |
register target_ulong T1 asm(AREG2);
|
|
48 |
register target_ulong T2 asm(AREG3);
|
45 |
49 |
|
46 |
50 |
/* if more registers are available, we define some registers too */
|
47 |
51 |
#ifdef AREG4
|
48 |
|
register uint32_t EAX asm(AREG4);
|
|
52 |
register target_ulong EAX asm(AREG4);
|
49 |
53 |
#define reg_EAX
|
50 |
54 |
#endif
|
51 |
55 |
|
52 |
56 |
#ifdef AREG5
|
53 |
|
register uint32_t ESP asm(AREG5);
|
|
57 |
register target_ulong ESP asm(AREG5);
|
54 |
58 |
#define reg_ESP
|
55 |
59 |
#endif
|
56 |
60 |
|
57 |
61 |
#ifdef AREG6
|
58 |
|
register uint32_t EBP asm(AREG6);
|
|
62 |
register target_ulong EBP asm(AREG6);
|
59 |
63 |
#define reg_EBP
|
60 |
64 |
#endif
|
61 |
65 |
|
62 |
66 |
#ifdef AREG7
|
63 |
|
register uint32_t ECX asm(AREG7);
|
|
67 |
register target_ulong ECX asm(AREG7);
|
64 |
68 |
#define reg_ECX
|
65 |
69 |
#endif
|
66 |
70 |
|
67 |
71 |
#ifdef AREG8
|
68 |
|
register uint32_t EDX asm(AREG8);
|
|
72 |
register target_ulong EDX asm(AREG8);
|
69 |
73 |
#define reg_EDX
|
70 |
74 |
#endif
|
71 |
75 |
|
72 |
76 |
#ifdef AREG9
|
73 |
|
register uint32_t EBX asm(AREG9);
|
|
77 |
register target_ulong EBX asm(AREG9);
|
74 |
78 |
#define reg_EBX
|
75 |
79 |
#endif
|
76 |
80 |
|
77 |
81 |
#ifdef AREG10
|
78 |
|
register uint32_t ESI asm(AREG10);
|
|
82 |
register target_ulong ESI asm(AREG10);
|
79 |
83 |
#define reg_ESI
|
80 |
84 |
#endif
|
81 |
85 |
|
82 |
86 |
#ifdef AREG11
|
83 |
|
register uint32_t EDI asm(AREG11);
|
|
87 |
register target_ulong EDI asm(AREG11);
|
84 |
88 |
#define reg_EDI
|
85 |
89 |
#endif
|
86 |
90 |
|
87 |
|
#else
|
88 |
|
|
89 |
|
/* no registers can be used */
|
90 |
|
#define T0 (env->t0)
|
91 |
|
#define T1 (env->t1)
|
92 |
|
#define T2 (env->t2)
|
93 |
|
|
94 |
|
#endif
|
|
91 |
#endif /* ! (TARGET_LONG_BITS > HOST_LONG_BITS) */
|
95 |
92 |
|
96 |
93 |
#define A0 T2
|
97 |
94 |
|