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 17 * License along with this library; if not, write to the Free Software
18 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 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 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 38 #define reg_ESP
  39 +#endif
  40 +
  41 +#ifdef AREG6
  42 +register uint32_t EBP asm(AREG6);
110 43 #define reg_EBP
111   -#define reg_ESI
112   -#define reg_EDI
113 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 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 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 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 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 74 #ifndef reg_EAX
152 75 #define EAX (env->regs[R_EAX])
... ... @@ -189,33 +112,6 @@ register struct CPUX86State *env asm(&quot;r27&quot;);
189 112 #define FP_CONVERT (env->fp_convert)
190 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 115 #include "cpu-i386.h"
220 116 #include "exec.h"
221 117  
... ... @@ -425,3 +321,6 @@ void helper_fldenv(uint8_t *ptr, int data32);
425 321 void helper_fsave(uint8_t *ptr, int data32);
426 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];
... ...