1 /* Helper file for declaring TCG helper functions. 2 Used by other helper files. 3 4 Targets should use DEF_HELPER_N and DEF_HELPER_FLAGS_N to declare helper 5 functions. Names should be specified without the helper_ prefix, and 6 the return and argument types specified. 3 basic types are understood 7 (i32, i64 and ptr). Additional aliases are provided for convenience and 8 to match the types used by the C helper implementation. 9 10 The target helper.h should be included in all files that use/define 11 helper functions. THis will ensure that function prototypes are 12 consistent. In addition it should be included an extra two times for 13 helper.c, defining: 14 GEN_HELPER 1 to produce op generation functions (gen_helper_*) 15 GEN_HELPER 2 to do runtime registration helper functions. 16 */ 17 18 #ifndef EXEC_HELPER_HEAD_H 19 #define EXEC_HELPER_HEAD_H 20 21 #define HELPER(name) glue(helper_, name) 22 23 /* Some types that make sense in C, but not for TCG. */ 24 #define dh_alias_i32 i32 25 #define dh_alias_s32 i32 26 #define dh_alias_int i32 27 #define dh_alias_i64 i64 28 #define dh_alias_s64 i64 29 #define dh_alias_f16 i32 30 #define dh_alias_f32 i32 31 #define dh_alias_f64 i64 32 #define dh_alias_ptr ptr 33 #define dh_alias_cptr ptr 34 #define dh_alias_void void 35 #define dh_alias_noreturn noreturn 36 #define dh_alias(t) glue(dh_alias_, t) 37 38 #define dh_ctype_i32 uint32_t 39 #define dh_ctype_s32 int32_t 40 #define dh_ctype_int int 41 #define dh_ctype_i64 uint64_t 42 #define dh_ctype_s64 int64_t 43 #define dh_ctype_f16 uint32_t 44 #define dh_ctype_f32 float32 45 #define dh_ctype_f64 float64 46 #define dh_ctype_ptr void * 47 #define dh_ctype_cptr const void * 48 #define dh_ctype_void void 49 #define dh_ctype_noreturn void QEMU_NORETURN 50 #define dh_ctype(t) dh_ctype_##t 51 52 #ifdef NEED_CPU_H 53 # ifdef TARGET_LONG_BITS 54 # if TARGET_LONG_BITS == 32 55 # define dh_alias_tl i32 56 # else 57 # define dh_alias_tl i64 58 # endif 59 # endif 60 # define dh_alias_env ptr 61 # define dh_ctype_tl target_ulong 62 # define dh_ctype_env CPUArchState * 63 #endif 64 65 /* We can't use glue() here because it falls foul of C preprocessor 66 recursive expansion rules. */ 67 #define dh_retvar_decl0_void void 68 #define dh_retvar_decl0_noreturn void 69 #define dh_retvar_decl0_i32 TCGv_i32 retval 70 #define dh_retvar_decl0_i64 TCGv_i64 retval 71 #define dh_retvar_decl0_ptr TCGv_ptr retval 72 #define dh_retvar_decl0(t) glue(dh_retvar_decl0_, dh_alias(t)) 73 74 #define dh_retvar_decl_void 75 #define dh_retvar_decl_noreturn 76 #define dh_retvar_decl_i32 TCGv_i32 retval, 77 #define dh_retvar_decl_i64 TCGv_i64 retval, 78 #define dh_retvar_decl_ptr TCGv_ptr retval, 79 #define dh_retvar_decl(t) glue(dh_retvar_decl_, dh_alias(t)) 80 81 #define dh_retvar_void NULL 82 #define dh_retvar_noreturn NULL 83 #define dh_retvar_i32 tcgv_i32_temp(retval) 84 #define dh_retvar_i64 tcgv_i64_temp(retval) 85 #define dh_retvar_ptr tcgv_ptr_temp(retval) 86 #define dh_retvar(t) glue(dh_retvar_, dh_alias(t)) 87 88 #define dh_is_64bit_void 0 89 #define dh_is_64bit_noreturn 0 90 #define dh_is_64bit_i32 0 91 #define dh_is_64bit_i64 1 92 #define dh_is_64bit_ptr (sizeof(void *) == 8) 93 #define dh_is_64bit_cptr dh_is_64bit_ptr 94 #define dh_is_64bit(t) glue(dh_is_64bit_, dh_alias(t)) 95 96 #define dh_is_signed_void 0 97 #define dh_is_signed_noreturn 0 98 #define dh_is_signed_i32 0 99 #define dh_is_signed_s32 1 100 #define dh_is_signed_i64 0 101 #define dh_is_signed_s64 1 102 #define dh_is_signed_f16 0 103 #define dh_is_signed_f32 0 104 #define dh_is_signed_f64 0 105 #define dh_is_signed_tl 0 106 #define dh_is_signed_int 1 107 /* ??? This is highly specific to the host cpu. There are even special 108 extension instructions that may be required, e.g. ia64's addp4. But 109 for now we don't support any 64-bit targets with 32-bit pointers. */ 110 #define dh_is_signed_ptr 0 111 #define dh_is_signed_cptr dh_is_signed_ptr 112 #define dh_is_signed_env dh_is_signed_ptr 113 #define dh_is_signed(t) dh_is_signed_##t 114 115 #define dh_callflag_i32 0 116 #define dh_callflag_s32 0 117 #define dh_callflag_int 0 118 #define dh_callflag_i64 0 119 #define dh_callflag_s64 0 120 #define dh_callflag_f16 0 121 #define dh_callflag_f32 0 122 #define dh_callflag_f64 0 123 #define dh_callflag_ptr 0 124 #define dh_callflag_cptr dh_callflag_ptr 125 #define dh_callflag_void 0 126 #define dh_callflag_noreturn TCG_CALL_NO_RETURN 127 #define dh_callflag(t) glue(dh_callflag_, dh_alias(t)) 128 129 #define dh_sizemask(t, n) \ 130 ((dh_is_64bit(t) << (n*2)) | (dh_is_signed(t) << (n*2+1))) 131 132 #define dh_arg(t, n) \ 133 glue(glue(tcgv_, dh_alias(t)), _temp)(glue(arg, n)) 134 135 #define dh_arg_decl(t, n) glue(TCGv_, dh_alias(t)) glue(arg, n) 136 137 #define DEF_HELPER_0(name, ret) \ 138 DEF_HELPER_FLAGS_0(name, 0, ret) 139 #define DEF_HELPER_1(name, ret, t1) \ 140 DEF_HELPER_FLAGS_1(name, 0, ret, t1) 141 #define DEF_HELPER_2(name, ret, t1, t2) \ 142 DEF_HELPER_FLAGS_2(name, 0, ret, t1, t2) 143 #define DEF_HELPER_3(name, ret, t1, t2, t3) \ 144 DEF_HELPER_FLAGS_3(name, 0, ret, t1, t2, t3) 145 #define DEF_HELPER_4(name, ret, t1, t2, t3, t4) \ 146 DEF_HELPER_FLAGS_4(name, 0, ret, t1, t2, t3, t4) 147 #define DEF_HELPER_5(name, ret, t1, t2, t3, t4, t5) \ 148 DEF_HELPER_FLAGS_5(name, 0, ret, t1, t2, t3, t4, t5) 149 #define DEF_HELPER_6(name, ret, t1, t2, t3, t4, t5, t6) \ 150 DEF_HELPER_FLAGS_6(name, 0, ret, t1, t2, t3, t4, t5, t6) 151 152 /* MAX_OPC_PARAM_IARGS must be set to n if last entry is DEF_HELPER_FLAGS_n. */ 153 154 #endif /* EXEC_HELPER_HEAD_H */ 155