symbian-qemu-0.9.1-12/qemu-symbian-svp/tcg/sparc/tcg-target.h
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 /*
       
     2  * Tiny Code Generator for QEMU
       
     3  *
       
     4  * Copyright (c) 2008 Fabrice Bellard
       
     5  *
       
     6  * Permission is hereby granted, free of charge, to any person obtaining a copy
       
     7  * of this software and associated documentation files (the "Software"), to deal
       
     8  * in the Software without restriction, including without limitation the rights
       
     9  * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
       
    10  * copies of the Software, and to permit persons to whom the Software is
       
    11  * furnished to do so, subject to the following conditions:
       
    12  *
       
    13  * The above copyright notice and this permission notice shall be included in
       
    14  * all copies or substantial portions of the Software.
       
    15  *
       
    16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
       
    17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
       
    18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
       
    19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
       
    20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
       
    21  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
       
    22  * THE SOFTWARE.
       
    23  */
       
    24 #define TCG_TARGET_SPARC 1
       
    25 
       
    26 #if defined(__sparc_v9__) && !defined(__sparc_v8plus__)
       
    27 #define TCG_TARGET_REG_BITS 64
       
    28 #else
       
    29 #define TCG_TARGET_REG_BITS 32
       
    30 #endif
       
    31 
       
    32 #define TCG_TARGET_WORDS_BIGENDIAN
       
    33 
       
    34 #define TCG_TARGET_NB_REGS 32
       
    35 
       
    36 enum {
       
    37     TCG_REG_G0 = 0,
       
    38     TCG_REG_G1,
       
    39     TCG_REG_G2,
       
    40     TCG_REG_G3,
       
    41     TCG_REG_G4,
       
    42     TCG_REG_G5,
       
    43     TCG_REG_G6,
       
    44     TCG_REG_G7,
       
    45     TCG_REG_O0,
       
    46     TCG_REG_O1,
       
    47     TCG_REG_O2,
       
    48     TCG_REG_O3,
       
    49     TCG_REG_O4,
       
    50     TCG_REG_O5,
       
    51     TCG_REG_O6,
       
    52     TCG_REG_O7,
       
    53     TCG_REG_L0,
       
    54     TCG_REG_L1,
       
    55     TCG_REG_L2,
       
    56     TCG_REG_L3,
       
    57     TCG_REG_L4,
       
    58     TCG_REG_L5,
       
    59     TCG_REG_L6,
       
    60     TCG_REG_L7,
       
    61     TCG_REG_I0,
       
    62     TCG_REG_I1,
       
    63     TCG_REG_I2,
       
    64     TCG_REG_I3,
       
    65     TCG_REG_I4,
       
    66     TCG_REG_I5,
       
    67     TCG_REG_I6,
       
    68     TCG_REG_I7,
       
    69 };
       
    70 
       
    71 #define TCG_CT_CONST_S11 0x100
       
    72 #define TCG_CT_CONST_S13 0x200
       
    73 
       
    74 /* used for function call generation */
       
    75 #define TCG_REG_CALL_STACK TCG_REG_I6
       
    76 #ifdef __arch64__
       
    77 // Reserve space for AREG0
       
    78 #define TCG_TARGET_STACK_MINFRAME (176 + 2 * (int)sizeof(long))
       
    79 #define TCG_TARGET_CALL_STACK_OFFSET (2047 + TCG_TARGET_STACK_MINFRAME)
       
    80 #define TCG_TARGET_STACK_ALIGN 16
       
    81 #else
       
    82 // AREG0 + one word for alignment
       
    83 #define TCG_TARGET_STACK_MINFRAME (92 + (2 + 1) * (int)sizeof(long))
       
    84 #define TCG_TARGET_CALL_STACK_OFFSET TCG_TARGET_STACK_MINFRAME
       
    85 #define TCG_TARGET_STACK_ALIGN 8
       
    86 #endif
       
    87 
       
    88 /* optional instructions */
       
    89 //#define TCG_TARGET_HAS_bswap_i32
       
    90 //#define TCG_TARGET_HAS_bswap_i64
       
    91 //#define TCG_TARGET_HAS_neg_i32
       
    92 //#define TCG_TARGET_HAS_neg_i64
       
    93 
       
    94 
       
    95 /* Note: must be synced with dyngen-exec.h and Makefile.target */
       
    96 #ifdef HOST_SOLARIS
       
    97 #define TCG_AREG0 TCG_REG_G2
       
    98 #define TCG_AREG1 TCG_REG_G3
       
    99 #define TCG_AREG2 TCG_REG_G4
       
   100 #define TCG_AREG3 TCG_REG_G5
       
   101 #define TCG_AREG4 TCG_REG_G6
       
   102 #elif defined(__sparc_v9__)
       
   103 #define TCG_AREG0 TCG_REG_G5
       
   104 #define TCG_AREG1 TCG_REG_G6
       
   105 #define TCG_AREG2 TCG_REG_G7
       
   106 #else
       
   107 #define TCG_AREG0 TCG_REG_G6
       
   108 #define TCG_AREG1 TCG_REG_G1
       
   109 #define TCG_AREG2 TCG_REG_G2
       
   110 #define TCG_AREG3 TCG_REG_G3
       
   111 #endif
       
   112 
       
   113 static inline void flush_icache_range(unsigned long start, unsigned long stop)
       
   114 {
       
   115     unsigned long p;
       
   116 
       
   117     p = start & ~(8UL - 1UL);
       
   118     stop = (stop + (8UL - 1UL)) & ~(8UL - 1UL);
       
   119 
       
   120     for (; p < stop; p += 8)
       
   121         __asm__ __volatile__("flush\t%0" : : "r" (p));
       
   122 }