1/* 2 * Helper file for declaring TCG helper functions. 3 * Used by other helper files. 4 */ 5 6#ifndef EXEC_HELPER_HEAD_H 7#define EXEC_HELPER_HEAD_H 8 9#include "fpu/softfloat-types.h" 10 11#define HELPER(name) glue(helper_, name) 12 13/* Some types that make sense in C, but not for TCG. */ 14#define dh_alias_i32 i32 15#define dh_alias_s32 i32 16#define dh_alias_int i32 17#define dh_alias_i64 i64 18#define dh_alias_s64 i64 19#define dh_alias_i128 i128 20#define dh_alias_f16 i32 21#define dh_alias_f32 i32 22#define dh_alias_f64 i64 23#define dh_alias_ptr ptr 24#define dh_alias_cptr ptr 25#define dh_alias_env ptr 26#define dh_alias_fpst ptr 27#define dh_alias_void void 28#define dh_alias_noreturn noreturn 29#define dh_alias(t) glue(dh_alias_, t) 30 31#define dh_ctype_i32 uint32_t 32#define dh_ctype_s32 int32_t 33#define dh_ctype_int int 34#define dh_ctype_i64 uint64_t 35#define dh_ctype_s64 int64_t 36#define dh_ctype_i128 Int128 37#define dh_ctype_f16 uint32_t 38#define dh_ctype_f32 float32 39#define dh_ctype_f64 float64 40#define dh_ctype_ptr void * 41#define dh_ctype_cptr const void * 42#define dh_ctype_env CPUArchState * 43#define dh_ctype_fpst float_status * 44#define dh_ctype_void void 45#define dh_ctype_noreturn G_NORETURN void 46#define dh_ctype(t) dh_ctype_##t 47 48#ifdef COMPILING_PER_TARGET 49# ifdef TARGET_LONG_BITS 50# if TARGET_LONG_BITS == 32 51# define dh_alias_tl i32 52# define dh_typecode_tl dh_typecode_i32 53# else 54# define dh_alias_tl i64 55# define dh_typecode_tl dh_typecode_i64 56# endif 57# endif 58# define dh_ctype_tl target_ulong 59#endif /* COMPILING_PER_TARGET */ 60 61#if __SIZEOF_POINTER__ == 4 62# define dh_alias_vaddr i32 63# define dh_typecode_vaddr dh_typecode_i32 64#elif __SIZEOF_POINTER__ == 8 65# define dh_alias_vaddr i64 66# define dh_typecode_vaddr dh_typecode_i64 67#else 68# error "sizeof pointer is different from {4,8}" 69#endif /* __SIZEOF_POINTER__ */ 70# define dh_ctype_vaddr uintptr_t 71 72/* We can't use glue() here because it falls foul of C preprocessor 73 recursive expansion rules. */ 74#define dh_retvar_decl0_void void 75#define dh_retvar_decl0_noreturn void 76#define dh_retvar_decl0_i32 TCGv_i32 retval 77#define dh_retvar_decl0_i64 TCGv_i64 retval 78#define dh_retval_decl0_i128 TCGv_i128 retval 79#define dh_retvar_decl0_ptr TCGv_ptr retval 80#define dh_retvar_decl0(t) glue(dh_retvar_decl0_, dh_alias(t)) 81 82#define dh_retvar_decl_void 83#define dh_retvar_decl_noreturn 84#define dh_retvar_decl_i32 TCGv_i32 retval, 85#define dh_retvar_decl_i64 TCGv_i64 retval, 86#define dh_retvar_decl_i128 TCGv_i128 retval, 87#define dh_retvar_decl_ptr TCGv_ptr retval, 88#define dh_retvar_decl(t) glue(dh_retvar_decl_, dh_alias(t)) 89 90#define dh_retvar_void NULL 91#define dh_retvar_noreturn NULL 92#define dh_retvar_i32 tcgv_i32_temp(retval) 93#define dh_retvar_i64 tcgv_i64_temp(retval) 94#define dh_retvar_i128 tcgv_i128_temp(retval) 95#define dh_retvar_ptr tcgv_ptr_temp(retval) 96#define dh_retvar(t) glue(dh_retvar_, dh_alias(t)) 97 98#define dh_typecode_void 0 99#define dh_typecode_noreturn 0 100#define dh_typecode_i32 2 101#define dh_typecode_s32 3 102#define dh_typecode_i64 4 103#define dh_typecode_s64 5 104#define dh_typecode_ptr 6 105#define dh_typecode_i128 7 106#define dh_typecode_int dh_typecode_s32 107#define dh_typecode_f16 dh_typecode_i32 108#define dh_typecode_f32 dh_typecode_i32 109#define dh_typecode_f64 dh_typecode_i64 110#define dh_typecode_cptr dh_typecode_ptr 111#define dh_typecode_env dh_typecode_ptr 112#define dh_typecode_fpst dh_typecode_ptr 113#define dh_typecode(t) dh_typecode_##t 114 115#define dh_callflag_i32 0 116#define dh_callflag_i64 0 117#define dh_callflag_i128 0 118#define dh_callflag_ptr 0 119#define dh_callflag_void 0 120#define dh_callflag_noreturn TCG_CALL_NO_RETURN 121#define dh_callflag(t) glue(dh_callflag_, dh_alias(t)) 122 123#define dh_typemask(t, n) (dh_typecode(t) << (n * 3)) 124 125#define dh_arg(t, n) \ 126 glue(glue(tcgv_, dh_alias(t)), _temp)(glue(arg, n)) 127 128#define dh_arg_decl(t, n) glue(TCGv_, dh_alias(t)) glue(arg, n) 129 130#define DEF_HELPER_0(name, ret) \ 131 DEF_HELPER_FLAGS_0(name, 0, ret) 132#define DEF_HELPER_1(name, ret, t1) \ 133 DEF_HELPER_FLAGS_1(name, 0, ret, t1) 134#define DEF_HELPER_2(name, ret, t1, t2) \ 135 DEF_HELPER_FLAGS_2(name, 0, ret, t1, t2) 136#define DEF_HELPER_3(name, ret, t1, t2, t3) \ 137 DEF_HELPER_FLAGS_3(name, 0, ret, t1, t2, t3) 138#define DEF_HELPER_4(name, ret, t1, t2, t3, t4) \ 139 DEF_HELPER_FLAGS_4(name, 0, ret, t1, t2, t3, t4) 140#define DEF_HELPER_5(name, ret, t1, t2, t3, t4, t5) \ 141 DEF_HELPER_FLAGS_5(name, 0, ret, t1, t2, t3, t4, t5) 142#define DEF_HELPER_6(name, ret, t1, t2, t3, t4, t5, t6) \ 143 DEF_HELPER_FLAGS_6(name, 0, ret, t1, t2, t3, t4, t5, t6) 144#define DEF_HELPER_7(name, ret, t1, t2, t3, t4, t5, t6, t7) \ 145 DEF_HELPER_FLAGS_7(name, 0, ret, t1, t2, t3, t4, t5, t6, t7) 146 147/* MAX_CALL_IARGS must be set to n if last entry is DEF_HELPER_FLAGS_n. */ 148 149#endif /* EXEC_HELPER_HEAD_H */ 150