diff options
author | The Android Open Source Project <initial-contribution@android.com> | 2009-02-10 15:43:59 -0800 |
---|---|---|
committer | The Android Open Source Project <initial-contribution@android.com> | 2009-02-10 15:43:59 -0800 |
commit | c27f813900a3c114562efbb8df1065e94766fc48 (patch) | |
tree | d95919283707dcab61009e27007374a745c9541e /dyngen-exec.h | |
parent | 0852ad57fa372f9b2854e4df685eaba8d8ef6790 (diff) | |
download | external_qemu-c27f813900a3c114562efbb8df1065e94766fc48.zip external_qemu-c27f813900a3c114562efbb8df1065e94766fc48.tar.gz external_qemu-c27f813900a3c114562efbb8df1065e94766fc48.tar.bz2 |
auto import from //branches/cupcake/...@130745
Diffstat (limited to 'dyngen-exec.h')
-rw-r--r-- | dyngen-exec.h | 174 |
1 files changed, 94 insertions, 80 deletions
diff --git a/dyngen-exec.h b/dyngen-exec.h index acb5b55..9260b6f 100644 --- a/dyngen-exec.h +++ b/dyngen-exec.h @@ -32,15 +32,21 @@ host headers do not allow that. */ #include <stddef.h> +#ifdef __OpenBSD__ +#include <sys/types.h> +#else typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t; +// Linux/Sparc64 defines uint64_t +#if !(defined (__sparc_v9__) && defined(__linux__)) && !(defined(__APPLE__) && defined(__x86_64__)) /* XXX may be done for all 64 bits targets ? */ -#if defined (__x86_64__) || defined(__ia64) +#if defined (__x86_64__) || defined(__ia64) || defined(__s390x__) || defined(__alpha__) || defined(__powerpc64__) typedef unsigned long uint64_t; #else typedef unsigned long long uint64_t; #endif +#endif /* if Solaris/__sun__, don't typedef int8_t, as it will be typedef'd prior to this and will cause an error in compliation, conflicting @@ -50,11 +56,18 @@ typedef signed char int8_t; #endif typedef signed short int16_t; typedef signed int int32_t; -#if defined (__x86_64__) || defined(__ia64) +// Linux/Sparc64 defines int64_t +#if !(defined (__sparc_v9__) && defined(__linux__)) && !(defined(__APPLE__) && defined(__x86_64__)) +#if defined (__x86_64__) || defined(__ia64) || defined(__s390x__) || defined(__alpha__) || defined(__powerpc64__) typedef signed long int64_t; #else typedef signed long long int64_t; #endif +#endif +#endif + +/* XXX: This may be wrong for 64-bit ILP32 hosts. */ +typedef void * host_reg_t; #define INT8_MIN (-128) #define INT16_MIN (-32767-1) @@ -69,27 +82,30 @@ typedef signed long long int64_t; #define UINT32_MAX (4294967295U) #define UINT64_MAX ((uint64_t)(18446744073709551615)) +#ifdef _BSD +typedef struct __sFILE FILE; +#else typedef struct FILE FILE; +#endif extern int fprintf(FILE *, const char *, ...); +extern int fputs(const char *, FILE *); extern int printf(const char *, ...); #undef NULL #define NULL 0 -#ifdef __i386__ +#if defined(__i386__) #define AREG0 "ebp" #define AREG1 "ebx" #define AREG2 "esi" #define AREG3 "edi" -#endif -#ifdef __x86_64__ -#define AREG0 "rbp" -#define AREG1 "rbx" +#elif defined(__x86_64__) +#define AREG0 "r14" +#define AREG1 "r15" #define AREG2 "r12" #define AREG3 "r13" -//#define AREG4 "r14" -//#define AREG5 "r15" -#endif -#ifdef __powerpc__ +//#define AREG4 "rbp" +//#define AREG5 "rbx" +#elif defined(__powerpc__) #define AREG0 "r27" #define AREG1 "r24" #define AREG2 "r25" @@ -105,22 +121,27 @@ extern int printf(const char *, ...); #define AREG10 "r22" #define AREG11 "r23" #endif -#define USE_INT_TO_FLOAT_HELPERS -#define BUGGY_GCC_DIV64 -#endif -#ifdef __arm__ +#elif defined(__arm__) #define AREG0 "r7" #define AREG1 "r4" #define AREG2 "r5" #define AREG3 "r6" -#endif -#ifdef __mips__ -#define AREG0 "s3" +#elif defined(__hppa__) +#define AREG0 "r17" +#define AREG1 "r14" +#define AREG2 "r15" +#define AREG3 "r16" +#elif defined(__mips__) +#define AREG0 "fp" #define AREG1 "s0" #define AREG2 "s1" #define AREG3 "s2" -#endif -#ifdef __sparc__ +#define AREG4 "s3" +#define AREG5 "s4" +#define AREG6 "s5" +#define AREG7 "s6" +#define AREG8 "s7" +#elif defined(__sparc__) #ifdef HOST_SOLARIS #define AREG0 "g2" #define AREG1 "g3" @@ -128,6 +149,11 @@ extern int printf(const char *, ...); #define AREG3 "g5" #define AREG4 "g6" #else +#ifdef __sparc_v9__ +#define AREG0 "g5" +#define AREG1 "g6" +#define AREG2 "g7" +#else #define AREG0 "g6" #define AREG1 "g1" #define AREG2 "g2" @@ -141,15 +167,13 @@ extern int printf(const char *, ...); #define AREG10 "l6" #define AREG11 "l7" #endif -#define USE_FP_CONVERT #endif -#ifdef __s390__ +#elif defined(__s390__) #define AREG0 "r10" #define AREG1 "r7" #define AREG2 "r8" #define AREG3 "r9" -#endif -#ifdef __alpha__ +#elif defined(__alpha__) /* Note $15 is the frame pointer, so anything in op-i386.c that would require a frame pointer, like alloca, would probably loose. */ #define AREG0 "$15" @@ -159,28 +183,23 @@ extern int printf(const char *, ...); #define AREG4 "$12" #define AREG5 "$13" #define AREG6 "$14" -#endif -#ifdef __mc68000 +#elif defined(__mc68000) #define AREG0 "%a5" #define AREG1 "%a4" #define AREG2 "%d7" #define AREG3 "%d6" #define AREG4 "%d5" -#endif -#ifdef __ia64__ +#elif defined(__ia64__) #define AREG0 "r7" #define AREG1 "r4" #define AREG2 "r5" #define AREG3 "r6" +#else +#error unsupported CPU #endif /* force GCC to generate only one epilog at the end of the function */ -#if defined(__i386__) || defined(__x86_64__) -/* Also add 4 bytes of padding so that we can replace the ret with a jmp. */ -#define FORCE_RET() asm volatile ("nop;nop;nop;nop"); -#else -#define FORCE_RET() asm volatile (""); -#endif +#define FORCE_RET() __asm__ __volatile__("" : : : "memory"); #ifndef OPPROTO #define OPPROTO @@ -191,11 +210,11 @@ extern int printf(const char *, ...); #define stringify(s) tostring(s) #define tostring(s) #s -#ifdef __alpha__ +#if defined(__alpha__) || defined(__s390__) /* the symbols are considered non exported so a br immediate is generated */ #define __hidden __attribute__((visibility("hidden"))) #else -#define __hidden +#define __hidden #endif #if defined(__alpha__) @@ -210,6 +229,13 @@ 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; }) +#elif defined(__s390__) +extern int __op_param1 __hidden; +extern int __op_param2 __hidden; +extern int __op_param3 __hidden; +#define PARAM1 ({ int _r; asm("bras %0,8; .long " ASM_NAME(__op_param1) "; l %0,0(%0)" : "=r"(_r) : ); _r; }) +#define PARAM2 ({ int _r; asm("bras %0,8; .long " ASM_NAME(__op_param2) "; l %0,0(%0)" : "=r"(_r) : ); _r; }) +#define PARAM3 ({ int _r; asm("bras %0,8; .long " ASM_NAME(__op_param3) "; l %0,0(%0)" : "=r"(_r) : ); _r; }) #else #if defined(__APPLE__) static int __op_param1, __op_param2, __op_param3; @@ -229,63 +255,51 @@ extern int __op_jmp0, __op_jmp1, __op_jmp2, __op_jmp3; #define ASM_NAME(x) #x #endif -#ifdef __i386__ -/* Dyngen will replace hlt instructions with a ret instruction. Inserting a - ret directly would confuse dyngen. */ -#define EXIT_TB() asm volatile ("hlt") -/* Dyngen will replace cli with 0x9e (jmp). - We generate the offset manually. */ -#if defined(__APPLE__) -/* XXX Different relocations are generated for MacOS X for Intel - (please as from cctools). */ -#define GOTO_LABEL_PARAM(n) \ - asm volatile ("cli;.long " ASM_NAME(__op_gen_label) #n) -#else -#define GOTO_LABEL_PARAM(n) \ - asm volatile ("cli;.long " ASM_NAME(__op_gen_label) #n " - 1f;1:") -#endif -#endif -#ifdef __x86_64__ -/* The same as i386. */ -#define EXIT_TB() asm volatile ("hlt") -#define GOTO_LABEL_PARAM(n) \ - asm volatile ("cli;.long " ASM_NAME(__op_gen_label) #n " - 1f;1:") -#endif -#ifdef __powerpc__ +#if defined(__i386__) +#define EXIT_TB() asm volatile ("ret") +#define GOTO_LABEL_PARAM(n) asm volatile ("jmp " ASM_NAME(__op_gen_label) #n) +#elif defined(__x86_64__) +#define EXIT_TB() asm volatile ("ret") +#define GOTO_LABEL_PARAM(n) asm volatile ("jmp " ASM_NAME(__op_gen_label) #n) +#elif defined(__powerpc__) #define EXIT_TB() asm volatile ("blr") #define GOTO_LABEL_PARAM(n) asm volatile ("b " ASM_NAME(__op_gen_label) #n) -#endif -#ifdef __s390__ +#elif defined(__s390__) #define EXIT_TB() asm volatile ("br %r14") -#define GOTO_LABEL_PARAM(n) asm volatile ("b " ASM_NAME(__op_gen_label) #n) -#endif -#ifdef __alpha__ +#define GOTO_LABEL_PARAM(n) asm volatile ("larl %r7,12; l %r7,0(%r7); br %r7; .long " ASM_NAME(__op_gen_label) #n) +#elif defined(__alpha__) #define EXIT_TB() asm volatile ("ret") -#endif -#ifdef __ia64__ +#elif defined(__ia64__) #define EXIT_TB() asm volatile ("br.ret.sptk.many b0;;") #define GOTO_LABEL_PARAM(n) asm volatile ("br.sptk.many " \ ASM_NAME(__op_gen_label) #n) -#endif -#ifdef __sparc__ +#elif defined(__sparc__) #define EXIT_TB() asm volatile ("jmpl %i0 + 8, %g0; nop") #define GOTO_LABEL_PARAM(n) asm volatile ("ba " ASM_NAME(__op_gen_label) #n ";nop") -#endif -#ifdef __arm__ +#elif defined(__arm__) #define EXIT_TB() asm volatile ("b exec_loop") #define GOTO_LABEL_PARAM(n) asm volatile ("b " ASM_NAME(__op_gen_label) #n) -#endif -#ifdef __mc68000 +#elif defined(__mc68000) #define EXIT_TB() asm volatile ("rts") +#elif defined(__mips__) +#define EXIT_TB() asm volatile ("jr $ra") +#define GOTO_LABEL_PARAM(n) asm volatile (".set noat; la $1, " ASM_NAME(__op_gen_label) #n "; jr $1; .set at") +#elif defined(__hppa__) +#define GOTO_LABEL_PARAM(n) asm volatile ("b,n " ASM_NAME(__op_gen_label) #n) +#else +#error unsupported CPU #endif -/* this definition to force inlining of all code that is used by op.c - * if we don't do that, some functions fail to properly inline with some - * GCC versions. and this results in erratic crashes that are hard to debug - * - * (that's because the non-inlined functions might clobber some "reserved" - * registers used by the translation block code - */ -#define inline __attribute__((always_inline)) __inline__ +/* The return address may point to the start of the next instruction. + Subtracting one gets us the call instruction itself. */ +#if defined(__s390__) +# define GETPC() ((void*)(((unsigned long)__builtin_return_address(0) & 0x7fffffffUL) - 1)) +#elif defined(__arm__) +/* Thumb return addresses have the low bit set, so we need to subtract two. + This is still safe in ARM mode because instructions are 4 bytes. */ +# define GETPC() ((void *)((unsigned long)__builtin_return_address(0) - 2)) +#else +# define GETPC() ((void *)((unsigned long)__builtin_return_address(0) - 1)) +#endif #endif /* !defined(__DYNGEN_EXEC_H__) */ |