Commit 79638566e5b87058e92f537b989df0dbc23f8b41

Authored by bellard
1 parent 03daf0e3

moved dyngen generic code to dyngen-exec.h


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@236 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 2 changed files with 199 additions and 145 deletions
dyngen-exec.h 0 → 100644
  1 +/*
  2 + * dyngen defines for micro operation code
  3 + *
  4 + * Copyright (c) 2003 Fabrice Bellard
  5 + *
  6 + * This library is free software; you can redistribute it and/or
  7 + * modify it under the terms of the GNU Lesser General Public
  8 + * License as published by the Free Software Foundation; either
  9 + * version 2 of the License, or (at your option) any later version.
  10 + *
  11 + * This library is distributed in the hope that it will be useful,
  12 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14 + * Lesser General Public License for more details.
  15 + *
  16 + * You should have received a copy of the GNU Lesser General Public
  17 + * 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
  19 + */
  20 +typedef unsigned char uint8_t;
  21 +typedef unsigned short uint16_t;
  22 +typedef unsigned int uint32_t;
  23 +typedef unsigned long long uint64_t;
  24 +
  25 +typedef signed char int8_t;
  26 +typedef signed short int16_t;
  27 +typedef signed int int32_t;
  28 +typedef signed long long int64_t;
  29 +
  30 +#define bswap32(x) \
  31 +({ \
  32 + uint32_t __x = (x); \
  33 + ((uint32_t)( \
  34 + (((uint32_t)(__x) & (uint32_t)0x000000ffUL) << 24) | \
  35 + (((uint32_t)(__x) & (uint32_t)0x0000ff00UL) << 8) | \
  36 + (((uint32_t)(__x) & (uint32_t)0x00ff0000UL) >> 8) | \
  37 + (((uint32_t)(__x) & (uint32_t)0xff000000UL) >> 24) )); \
  38 +})
  39 +
  40 +typedef struct FILE FILE;
  41 +extern int fprintf(FILE *, const char *, ...);
  42 +extern int printf(const char *, ...);
  43 +#define NULL 0
  44 +#include <fenv.h>
  45 +
  46 +#ifdef __i386__
  47 +#define AREG0 "ebp"
  48 +#define AREG1 "ebx"
  49 +#define AREG2 "esi"
  50 +#define AREG3 "edi"
  51 +#endif
  52 +#ifdef __powerpc__
  53 +#define AREG0 "r27"
  54 +#define AREG1 "r24"
  55 +#define AREG2 "r25"
  56 +#define AREG3 "r26"
  57 +#define AREG4 "r16"
  58 +#define AREG5 "r17"
  59 +#define AREG6 "r18"
  60 +#define AREG7 "r19"
  61 +#define AREG8 "r20"
  62 +#define AREG9 "r21"
  63 +#define AREG10 "r22"
  64 +#define AREG11 "r23"
  65 +#define USE_INT_TO_FLOAT_HELPERS
  66 +#define BUGGY_GCC_DIV64
  67 +#endif
  68 +#ifdef __arm__
  69 +#define AREG0 "r7"
  70 +#define AREG1 "r4"
  71 +#define AREG2 "r5"
  72 +#define AREG3 "r6"
  73 +#endif
  74 +#ifdef __mips__
  75 +#define AREG0 "s3"
  76 +#define AREG1 "s0"
  77 +#define AREG2 "s1"
  78 +#define AREG3 "s2"
  79 +#endif
  80 +#ifdef __sparc__
  81 +#define AREG0 "g6"
  82 +#define AREG1 "g1"
  83 +#define AREG2 "g2"
  84 +#define AREG3 "g3"
  85 +#define AREG4 "l0"
  86 +#define AREG5 "l1"
  87 +#define AREG6 "l2"
  88 +#define AREG7 "l3"
  89 +#define AREG8 "l4"
  90 +#define AREG9 "l5"
  91 +#define AREG10 "l6"
  92 +#define AREG11 "l7"
  93 +#define USE_FP_CONVERT
  94 +#endif
  95 +#ifdef __s390__
  96 +#define AREG0 "r10"
  97 +#define AREG1 "r7"
  98 +#define AREG2 "r8"
  99 +#define AREG3 "r9"
  100 +#endif
  101 +#ifdef __alpha__
  102 +/* Note $15 is the frame pointer, so anything in op-i386.c that would
  103 + require a frame pointer, like alloca, would probably loose. */
  104 +#define AREG0 "$15"
  105 +#define AREG1 "$9"
  106 +#define AREG2 "$10"
  107 +#define AREG3 "$11"
  108 +#define AREG4 "$12"
  109 +#define AREG5 "$13"
  110 +#define AREG6 "$14"
  111 +#endif
  112 +#ifdef __ia64__
  113 +#define AREG0 "r27"
  114 +#define AREG1 "r24"
  115 +#define AREG2 "r25"
  116 +#define AREG3 "r26"
  117 +#endif
  118 +
  119 +/* force GCC to generate only one epilog at the end of the function */
  120 +#define FORCE_RET() asm volatile ("");
  121 +
  122 +#ifndef OPPROTO
  123 +#define OPPROTO
  124 +#endif
  125 +
  126 +#define xglue(x, y) x ## y
  127 +#define glue(x, y) xglue(x, y)
  128 +
  129 +#ifdef __alpha__
  130 +/* the symbols are considered non exported so a br immediate is generated */
  131 +#define __hidden __attribute__((visibility("hidden")))
  132 +#else
  133 +#define __hidden
  134 +#endif
  135 +
  136 +#ifdef __alpha__
  137 +/* Suggested by Richard Henderson. This will result in code like
  138 + ldah $0,__op_param1($29) !gprelhigh
  139 + lda $0,__op_param1($0) !gprellow
  140 + We can then conveniently change $29 to $31 and adapt the offsets to
  141 + emit the appropriate constant. */
  142 +extern int __op_param1 __hidden;
  143 +extern int __op_param2 __hidden;
  144 +extern int __op_param3 __hidden;
  145 +#define PARAM1 ({ int _r; asm("" : "=r"(_r) : "0" (&__op_param1)); _r; })
  146 +#define PARAM2 ({ int _r; asm("" : "=r"(_r) : "0" (&__op_param2)); _r; })
  147 +#define PARAM3 ({ int _r; asm("" : "=r"(_r) : "0" (&__op_param3)); _r; })
  148 +#else
  149 +extern int __op_param1, __op_param2, __op_param3;
  150 +#define PARAM1 ((long)(&__op_param1))
  151 +#define PARAM2 ((long)(&__op_param2))
  152 +#define PARAM3 ((long)(&__op_param3))
  153 +#endif
  154 +
  155 +extern int __op_jmp0, __op_jmp1;
exec-i386.h
@@ -17,136 +17,59 @@ @@ -17,136 +17,59 @@
17 * License along with this library; if not, write to the Free Software 17 * 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 18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 */ 19 */
20 -typedef unsigned char uint8_t;  
21 -typedef unsigned short uint16_t;  
22 -typedef unsigned int uint32_t;  
23 -typedef unsigned long long uint64_t;  
24 -  
25 -typedef signed char int8_t;  
26 -typedef signed short int16_t;  
27 -typedef signed int int32_t;  
28 -typedef signed long long int64_t;  
29 -  
30 -#define bswap32(x) \  
31 -({ \  
32 - uint32_t __x = (x); \  
33 - ((uint32_t)( \  
34 - (((uint32_t)(__x) & (uint32_t)0x000000ffUL) << 24) | \  
35 - (((uint32_t)(__x) & (uint32_t)0x0000ff00UL) << 8) | \  
36 - (((uint32_t)(__x) & (uint32_t)0x00ff0000UL) >> 8) | \  
37 - (((uint32_t)(__x) & (uint32_t)0xff000000UL) >> 24) )); \  
38 -})  
39 -  
40 -#define NULL 0  
41 -#include <fenv.h>  
42 -  
43 -typedef struct FILE FILE;  
44 -extern FILE *logfile;  
45 -extern int loglevel;  
46 -extern int fprintf(FILE *, const char *, ...);  
47 -extern int printf(const char *, ...);  
48 -  
49 -#ifdef __i386__  
50 -register unsigned int T0 asm("ebx");  
51 -register unsigned int T1 asm("esi");  
52 -register unsigned int A0 asm("edi");  
53 -register struct CPUX86State *env asm("ebp");  
54 -#endif  
55 -#ifdef __powerpc__  
56 -register unsigned int EAX asm("r16");  
57 -register unsigned int ECX asm("r17");  
58 -register unsigned int EDX asm("r18");  
59 -register unsigned int EBX asm("r19");  
60 -register unsigned int ESP asm("r20");  
61 -register unsigned int EBP asm("r21");  
62 -register unsigned int ESI asm("r22");  
63 -register unsigned int EDI asm("r23");  
64 -register unsigned int T0 asm("r24");  
65 -register unsigned int T1 asm("r25");  
66 -register unsigned int A0 asm("r26");  
67 -register struct CPUX86State *env asm("r27");  
68 -#define USE_INT_TO_FLOAT_HELPERS  
69 -#define BUGGY_GCC_DIV64 20 +#include "dyngen-exec.h"
  21 +
  22 +/* at least 4 register variables are defines */
  23 +register struct CPUX86State *env asm(AREG0);
  24 +register uint32_t T0 asm(AREG1);
  25 +register uint32_t T1 asm(AREG2);
  26 +register uint32_t T2 asm(AREG3);
  27 +
  28 +#define A0 T2
  29 +
  30 +/* if more registers are available, we define some registers too */
  31 +#ifdef AREG4
  32 +register uint32_t EAX asm(AREG4);
70 #define reg_EAX 33 #define reg_EAX
71 -#define reg_ECX  
72 -#define reg_EDX  
73 -#define reg_EBX  
74 -#define reg_ESP  
75 -#define reg_EBP  
76 -#define reg_ESI  
77 -#define reg_EDI  
78 -#endif  
79 -#ifdef __arm__  
80 -register unsigned int T0 asm("r4");  
81 -register unsigned int T1 asm("r5");  
82 -register unsigned int A0 asm("r6");  
83 -register struct CPUX86State *env asm("r7");  
84 #endif 34 #endif
85 -#ifdef __mips__  
86 -register unsigned int T0 asm("s0");  
87 -register unsigned int T1 asm("s1");  
88 -register unsigned int A0 asm("s2");  
89 -register struct CPUX86State *env asm("s3");  
90 -#endif  
91 -#ifdef __sparc__  
92 -register unsigned int EAX asm("l0");  
93 -register unsigned int ECX asm("l1");  
94 -register unsigned int EDX asm("l2");  
95 -register unsigned int EBX asm("l3");  
96 -register unsigned int ESP asm("l4");  
97 -register unsigned int EBP asm("l5");  
98 -register unsigned int ESI asm("l6");  
99 -register unsigned int EDI asm("l7");  
100 -register unsigned int T0 asm("g1");  
101 -register unsigned int T1 asm("g2");  
102 -register unsigned int A0 asm("g3");  
103 -register struct CPUX86State *env asm("g6");  
104 -#define USE_FP_CONVERT  
105 -#define reg_EAX  
106 -#define reg_ECX  
107 -#define reg_EDX  
108 -#define reg_EBX 35 +
  36 +#ifdef AREG5
  37 +register uint32_t ESP asm(AREG5);
109 #define reg_ESP 38 #define reg_ESP
  39 +#endif
  40 +
  41 +#ifdef AREG6
  42 +register uint32_t EBP asm(AREG6);
110 #define reg_EBP 43 #define reg_EBP
111 -#define reg_ESI  
112 -#define reg_EDI  
113 #endif 44 #endif
114 -#ifdef __s390__  
115 -register unsigned int T0 asm("r7");  
116 -register unsigned int T1 asm("r8");  
117 -register unsigned int A0 asm("r9");  
118 -register struct CPUX86State *env asm("r10"); 45 +
  46 +#ifdef AREG7
  47 +register uint32_t ECX asm(AREG7);
  48 +#define reg_ECX
119 #endif 49 #endif
120 -#ifdef __alpha__  
121 -register unsigned int T0 asm("$9");  
122 -register unsigned int T1 asm("$10");  
123 -register unsigned int A0 asm("$11");  
124 -register unsigned int EAX asm("$12");  
125 -register unsigned int ESP asm("$13");  
126 -register unsigned int EBP asm("$14");  
127 -/* Note $15 is the frame pointer, so anything in op-i386.c that would  
128 - require a frame pointer, like alloca, would probably loose. */  
129 -register struct CPUX86State *env asm("$15");  
130 -#define reg_EAX  
131 -#define reg_ESP  
132 -#define reg_EBP 50 +
  51 +#ifdef AREG8
  52 +register uint32_t EDX asm(AREG8);
  53 +#define reg_EDX
133 #endif 54 #endif
134 -#ifdef __ia64__  
135 -register unsigned int T0 asm("r24");  
136 -register unsigned int T1 asm("r25");  
137 -register unsigned int A0 asm("r26");  
138 -register struct CPUX86State *env asm("r27"); 55 +
  56 +#ifdef AREG9
  57 +register uint32_t EBX asm(AREG9);
  58 +#define reg_EBX
139 #endif 59 #endif
140 60
141 -/* force GCC to generate only one epilog at the end of the function */  
142 -#define FORCE_RET() asm volatile (""); 61 +#ifdef AREG10
  62 +register uint32_t ESI asm(AREG10);
  63 +#define reg_ESI
  64 +#endif
143 65
144 -#ifndef OPPROTO  
145 -#define OPPROTO 66 +#ifdef AREG11
  67 +register uint32_t EDI asm(AREG11);
  68 +#define reg_EDI
146 #endif 69 #endif
147 70
148 -#define xglue(x, y) x ## y  
149 -#define glue(x, y) xglue(x, y) 71 +extern FILE *logfile;
  72 +extern int loglevel;
150 73
151 #ifndef reg_EAX 74 #ifndef reg_EAX
152 #define EAX (env->regs[R_EAX]) 75 #define EAX (env->regs[R_EAX])
@@ -189,33 +112,6 @@ register struct CPUX86State *env asm(&quot;r27&quot;); @@ -189,33 +112,6 @@ register struct CPUX86State *env asm(&quot;r27&quot;);
189 #define FP_CONVERT (env->fp_convert) 112 #define FP_CONVERT (env->fp_convert)
190 #endif 113 #endif
191 114
192 -#ifdef __alpha__  
193 -/* the symbols are considered non exported so a br immediate is generated */  
194 -#define __hidden __attribute__((visibility("hidden")))  
195 -#else  
196 -#define __hidden  
197 -#endif  
198 -  
199 -#ifdef __alpha__  
200 -/* Suggested by Richard Henderson. This will result in code like  
201 - ldah $0,__op_param1($29) !gprelhigh  
202 - lda $0,__op_param1($0) !gprellow  
203 - We can then conveniently change $29 to $31 and adapt the offsets to  
204 - emit the appropriate constant. */  
205 -extern int __op_param1 __hidden;  
206 -extern int __op_param2 __hidden;  
207 -extern int __op_param3 __hidden;  
208 -#define PARAM1 ({ int _r; asm("" : "=r"(_r) : "0" (&__op_param1)); _r; })  
209 -#define PARAM2 ({ int _r; asm("" : "=r"(_r) : "0" (&__op_param2)); _r; })  
210 -#define PARAM3 ({ int _r; asm("" : "=r"(_r) : "0" (&__op_param3)); _r; })  
211 -#else  
212 -extern int __op_param1, __op_param2, __op_param3;  
213 -#define PARAM1 ((long)(&__op_param1))  
214 -#define PARAM2 ((long)(&__op_param2))  
215 -#define PARAM3 ((long)(&__op_param3))  
216 -#endif  
217 -extern int __op_jmp0, __op_jmp1;  
218 -  
219 #include "cpu-i386.h" 115 #include "cpu-i386.h"
220 #include "exec.h" 116 #include "exec.h"
221 117
@@ -425,3 +321,6 @@ void helper_fldenv(uint8_t *ptr, int data32); @@ -425,3 +321,6 @@ void helper_fldenv(uint8_t *ptr, int data32);
425 void helper_fsave(uint8_t *ptr, int data32); 321 void helper_fsave(uint8_t *ptr, int data32);
426 void helper_frstor(uint8_t *ptr, int data32); 322 void helper_frstor(uint8_t *ptr, int data32);
427 323
  324 +const uint8_t parity_table[256];
  325 +const uint8_t rclw_table[32];
  326 +const uint8_t rclb_table[32];