1 /* 2 * Internal declarations for 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 25 #ifndef TCG_INTERNAL_H 26 #define TCG_INTERNAL_H 27 28 #include "tcg/helper-info.h" 29 30 #define TCG_HIGHWATER 1024 31 32 extern TCGContext tcg_init_ctx; 33 extern TCGContext **tcg_ctxs; 34 extern unsigned int tcg_cur_ctxs; 35 extern unsigned int tcg_max_ctxs; 36 37 void tcg_region_init(size_t tb_size, int splitwx, unsigned max_cpus); 38 bool tcg_region_alloc(TCGContext *s); 39 void tcg_region_initial_alloc(TCGContext *s); 40 void tcg_region_prologue_set(TCGContext *s); 41 42 static inline void *tcg_call_func(TCGOp *op) 43 { 44 return (void *)(uintptr_t)op->args[TCGOP_CALLO(op) + TCGOP_CALLI(op)]; 45 } 46 47 static inline const TCGHelperInfo *tcg_call_info(TCGOp *op) 48 { 49 return (void *)(uintptr_t)op->args[TCGOP_CALLO(op) + TCGOP_CALLI(op) + 1]; 50 } 51 52 static inline unsigned tcg_call_flags(TCGOp *op) 53 { 54 return tcg_call_info(op)->flags; 55 } 56 57 #if TCG_TARGET_REG_BITS == 32 58 static inline TCGv_i32 TCGV_LOW(TCGv_i64 t) 59 { 60 return temp_tcgv_i32(tcgv_i64_temp(t) + HOST_BIG_ENDIAN); 61 } 62 static inline TCGv_i32 TCGV_HIGH(TCGv_i64 t) 63 { 64 return temp_tcgv_i32(tcgv_i64_temp(t) + !HOST_BIG_ENDIAN); 65 } 66 #else 67 TCGv_i32 TCGV_LOW(TCGv_i64) QEMU_ERROR("32-bit code path is reachable"); 68 TCGv_i32 TCGV_HIGH(TCGv_i64) QEMU_ERROR("32-bit code path is reachable"); 69 #endif 70 71 static inline TCGv_i64 TCGV128_LOW(TCGv_i128 t) 72 { 73 /* For 32-bit, offset by 2, which may then have TCGV_{LOW,HIGH} applied. */ 74 int o = HOST_BIG_ENDIAN ? 64 / TCG_TARGET_REG_BITS : 0; 75 return temp_tcgv_i64(tcgv_i128_temp(t) + o); 76 } 77 78 static inline TCGv_i64 TCGV128_HIGH(TCGv_i128 t) 79 { 80 int o = HOST_BIG_ENDIAN ? 0 : 64 / TCG_TARGET_REG_BITS; 81 return temp_tcgv_i64(tcgv_i128_temp(t) + o); 82 } 83 84 bool tcg_target_has_memory_bswap(MemOp memop); 85 86 TCGTemp *tcg_temp_new_internal(TCGType type, TCGTempKind kind); 87 88 /* 89 * Locate or create a read-only temporary that is a constant. 90 * This kind of temporary need not be freed, but for convenience 91 * will be silently ignored by tcg_temp_free_*. 92 */ 93 TCGTemp *tcg_constant_internal(TCGType type, int64_t val); 94 95 void tcg_gen_op1(TCGOpcode, TCGArg); 96 void tcg_gen_op2(TCGOpcode, TCGArg, TCGArg); 97 void tcg_gen_op3(TCGOpcode, TCGArg, TCGArg, TCGArg); 98 void tcg_gen_op4(TCGOpcode, TCGArg, TCGArg, TCGArg, TCGArg); 99 void tcg_gen_op5(TCGOpcode, TCGArg, TCGArg, TCGArg, TCGArg, TCGArg); 100 void tcg_gen_op6(TCGOpcode, TCGArg, TCGArg, TCGArg, TCGArg, TCGArg, TCGArg); 101 102 void vec_gen_2(TCGOpcode, TCGType, unsigned, TCGArg, TCGArg); 103 void vec_gen_3(TCGOpcode, TCGType, unsigned, TCGArg, TCGArg, TCGArg); 104 void vec_gen_4(TCGOpcode, TCGType, unsigned, TCGArg, TCGArg, TCGArg, TCGArg); 105 106 #endif /* TCG_INTERNAL_H */ 107