symbian-qemu-0.9.1-12/qemu-symbian-svp/dyngen-exec.h
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     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 #if !defined(__DYNGEN_EXEC_H__)
       
    21 #define __DYNGEN_EXEC_H__
       
    22 
       
    23 /* prevent Solaris from trying to typedef FILE in gcc's
       
    24    include/floatingpoint.h which will conflict with the
       
    25    definition down below */
       
    26 #ifdef __sun__
       
    27 #define _FILEDEFED
       
    28 #endif
       
    29 
       
    30 /* NOTE: standard headers should be used with special care at this
       
    31    point because host CPU registers are used as global variables. Some
       
    32    host headers do not allow that. */
       
    33 #include <stddef.h>
       
    34 
       
    35 #ifdef __OpenBSD__
       
    36 #include <sys/types.h>
       
    37 #else
       
    38 typedef unsigned char uint8_t;
       
    39 typedef unsigned short uint16_t;
       
    40 typedef unsigned int uint32_t;
       
    41 // Linux/Sparc64 defines uint64_t
       
    42 #if !(defined (__sparc_v9__) && defined(__linux__)) && !(defined(__APPLE__) && defined(__x86_64__))
       
    43 /* XXX may be done for all 64 bits targets ? */
       
    44 #if defined (__x86_64__) || defined(__ia64) || defined(__s390x__) || defined(__alpha__) || defined(__powerpc64__)
       
    45 typedef unsigned long uint64_t;
       
    46 #else
       
    47 typedef unsigned long long uint64_t;
       
    48 #endif
       
    49 #endif
       
    50 
       
    51 /* if Solaris/__sun__, don't typedef int8_t, as it will be typedef'd
       
    52    prior to this and will cause an error in compliation, conflicting
       
    53    with /usr/include/sys/int_types.h, line 75 */
       
    54 #ifndef __sun__
       
    55 typedef signed char int8_t;
       
    56 #endif
       
    57 typedef signed short int16_t;
       
    58 typedef signed int int32_t;
       
    59 // Linux/Sparc64 defines int64_t
       
    60 #if !(defined (__sparc_v9__) && defined(__linux__)) && !(defined(__APPLE__) && defined(__x86_64__))
       
    61 #if defined (__x86_64__) || defined(__ia64) || defined(__s390x__) || defined(__alpha__) || defined(__powerpc64__)
       
    62 typedef signed long int64_t;
       
    63 #else
       
    64 typedef signed long long int64_t;
       
    65 #endif
       
    66 #endif
       
    67 #endif
       
    68 
       
    69 /* XXX: This may be wrong for 64-bit ILP32 hosts.  */
       
    70 typedef void * host_reg_t;
       
    71 
       
    72 #define INT8_MIN		(-128)
       
    73 #define INT16_MIN		(-32767-1)
       
    74 #define INT32_MIN		(-2147483647-1)
       
    75 #define INT64_MIN		(-(int64_t)(9223372036854775807)-1)
       
    76 #define INT8_MAX		(127)
       
    77 #define INT16_MAX		(32767)
       
    78 #define INT32_MAX		(2147483647)
       
    79 #define INT64_MAX		((int64_t)(9223372036854775807))
       
    80 #define UINT8_MAX		(255)
       
    81 #define UINT16_MAX		(65535)
       
    82 #define UINT32_MAX		(4294967295U)
       
    83 #define UINT64_MAX		((uint64_t)(18446744073709551615))
       
    84 
       
    85 #ifdef _BSD
       
    86 typedef struct __sFILE FILE;
       
    87 #else
       
    88 typedef struct FILE FILE;
       
    89 #endif
       
    90 extern int fprintf(FILE *, const char *, ...);
       
    91 extern int fputs(const char *, FILE *);
       
    92 extern int printf(const char *, ...);
       
    93 #undef NULL
       
    94 #define NULL 0
       
    95 
       
    96 #if defined(__i386__)
       
    97 #define AREG0 "ebp"
       
    98 #define AREG1 "ebx"
       
    99 #define AREG2 "esi"
       
   100 #define AREG3 "edi"
       
   101 #elif defined(__x86_64__)
       
   102 #define AREG0 "r14"
       
   103 #define AREG1 "r15"
       
   104 #define AREG2 "r12"
       
   105 #define AREG3 "r13"
       
   106 //#define AREG4 "rbp"
       
   107 //#define AREG5 "rbx"
       
   108 #elif defined(__powerpc__)
       
   109 #define AREG0 "r27"
       
   110 #define AREG1 "r24"
       
   111 #define AREG2 "r25"
       
   112 #define AREG3 "r26"
       
   113 /* XXX: suppress this hack */
       
   114 #if defined(CONFIG_USER_ONLY)
       
   115 #define AREG4 "r16"
       
   116 #define AREG5 "r17"
       
   117 #define AREG6 "r18"
       
   118 #define AREG7 "r19"
       
   119 #define AREG8 "r20"
       
   120 #define AREG9 "r21"
       
   121 #define AREG10 "r22"
       
   122 #define AREG11 "r23"
       
   123 #endif
       
   124 #elif defined(__arm__)
       
   125 #define AREG0 "r7"
       
   126 #define AREG1 "r4"
       
   127 #define AREG2 "r5"
       
   128 #define AREG3 "r6"
       
   129 #elif defined(__hppa__)
       
   130 #define AREG0 "r17"
       
   131 #define AREG1 "r14"
       
   132 #define AREG2 "r15"
       
   133 #define AREG3 "r16"
       
   134 #elif defined(__mips__)
       
   135 #define AREG0 "fp"
       
   136 #define AREG1 "s0"
       
   137 #define AREG2 "s1"
       
   138 #define AREG3 "s2"
       
   139 #define AREG4 "s3"
       
   140 #define AREG5 "s4"
       
   141 #define AREG6 "s5"
       
   142 #define AREG7 "s6"
       
   143 #define AREG8 "s7"
       
   144 #elif defined(__sparc__)
       
   145 #ifdef HOST_SOLARIS
       
   146 #define AREG0 "g2"
       
   147 #define AREG1 "g3"
       
   148 #define AREG2 "g4"
       
   149 #define AREG3 "g5"
       
   150 #define AREG4 "g6"
       
   151 #else
       
   152 #ifdef __sparc_v9__
       
   153 #define AREG0 "g5"
       
   154 #define AREG1 "g6"
       
   155 #define AREG2 "g7"
       
   156 #else
       
   157 #define AREG0 "g6"
       
   158 #define AREG1 "g1"
       
   159 #define AREG2 "g2"
       
   160 #define AREG3 "g3"
       
   161 #define AREG4 "l0"
       
   162 #define AREG5 "l1"
       
   163 #define AREG6 "l2"
       
   164 #define AREG7 "l3"
       
   165 #define AREG8 "l4"
       
   166 #define AREG9 "l5"
       
   167 #define AREG10 "l6"
       
   168 #define AREG11 "l7"
       
   169 #endif
       
   170 #endif
       
   171 #elif defined(__s390__)
       
   172 #define AREG0 "r10"
       
   173 #define AREG1 "r7"
       
   174 #define AREG2 "r8"
       
   175 #define AREG3 "r9"
       
   176 #elif defined(__alpha__)
       
   177 /* Note $15 is the frame pointer, so anything in op-i386.c that would
       
   178    require a frame pointer, like alloca, would probably loose.  */
       
   179 #define AREG0 "$15"
       
   180 #define AREG1 "$9"
       
   181 #define AREG2 "$10"
       
   182 #define AREG3 "$11"
       
   183 #define AREG4 "$12"
       
   184 #define AREG5 "$13"
       
   185 #define AREG6 "$14"
       
   186 #elif defined(__mc68000)
       
   187 #define AREG0 "%a5"
       
   188 #define AREG1 "%a4"
       
   189 #define AREG2 "%d7"
       
   190 #define AREG3 "%d6"
       
   191 #define AREG4 "%d5"
       
   192 #elif defined(__ia64__)
       
   193 #define AREG0 "r7"
       
   194 #define AREG1 "r4"
       
   195 #define AREG2 "r5"
       
   196 #define AREG3 "r6"
       
   197 #else
       
   198 #error unsupported CPU
       
   199 #endif
       
   200 
       
   201 #define xglue(x, y) x ## y
       
   202 #define glue(x, y) xglue(x, y)
       
   203 #define stringify(s)	tostring(s)
       
   204 #define tostring(s)	#s
       
   205 
       
   206 #if defined(__alpha__) || defined(__s390__)
       
   207 /* the symbols are considered non exported so a br immediate is generated */
       
   208 #define __hidden __attribute__((visibility("hidden")))
       
   209 #else
       
   210 #define __hidden
       
   211 #endif
       
   212 
       
   213 /* The return address may point to the start of the next instruction.
       
   214    Subtracting one gets us the call instruction itself.  */
       
   215 #if defined(__s390__)
       
   216 # define GETPC() ((void*)(((unsigned long)__builtin_return_address(0) & 0x7fffffffUL) - 1))
       
   217 #elif defined(__arm__)
       
   218 /* Thumb return addresses have the low bit set, so we need to subtract two.
       
   219    This is still safe in ARM mode because instructions are 4 bytes.  */
       
   220 # define GETPC() ((void *)((unsigned long)__builtin_return_address(0) - 2))
       
   221 #else
       
   222 # define GETPC() ((void *)((unsigned long)__builtin_return_address(0) - 1))
       
   223 #endif
       
   224 
       
   225 #endif /* !defined(__DYNGEN_EXEC_H__) */