Commit 79638566e5b87058e92f537b989df0dbc23f8b41
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("r27"); | @@ -189,33 +112,6 @@ register struct CPUX86State *env asm("r27"); | ||
| 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]; |