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/* We can't use glue() here because it falls foul of C preprocessor 62 recursive expansion rules. */ 63#define dh_retvar_decl0_void void 64#define dh_retvar_decl0_noreturn void 65#define dh_retvar_decl0_i32 TCGv_i32 retval 66#define dh_retvar_decl0_i64 TCGv_i64 retval 67#define dh_retval_decl0_i128 TCGv_i128 retval 68#define dh_retvar_decl0_ptr TCGv_ptr retval 69#define dh_retvar_decl0(t) glue(dh_retvar_decl0_, dh_alias(t)) 70 71#define dh_retvar_decl_void 72#define dh_retvar_decl_noreturn 73#define dh_retvar_decl_i32 TCGv_i32 retval, 74#define dh_retvar_decl_i64 TCGv_i64 retval, 75#define dh_retvar_decl_i128 TCGv_i128 retval, 76#define dh_retvar_decl_ptr TCGv_ptr retval, 77#define dh_retvar_decl(t) glue(dh_retvar_decl_, dh_alias(t)) 78 79#define dh_retvar_void NULL 80#define dh_retvar_noreturn NULL 81#define dh_retvar_i32 tcgv_i32_temp(retval) 82#define dh_retvar_i64 tcgv_i64_temp(retval) 83#define dh_retvar_i128 tcgv_i128_temp(retval) 84#define dh_retvar_ptr tcgv_ptr_temp(retval) 85#define dh_retvar(t) glue(dh_retvar_, dh_alias(t)) 86 87#define dh_typecode_void 0 88#define dh_typecode_noreturn 0 89#define dh_typecode_i32 2 90#define dh_typecode_s32 3 91#define dh_typecode_i64 4 92#define dh_typecode_s64 5 93#define dh_typecode_ptr 6 94#define dh_typecode_i128 7 95#define dh_typecode_int dh_typecode_s32 96#define dh_typecode_f16 dh_typecode_i32 97#define dh_typecode_f32 dh_typecode_i32 98#define dh_typecode_f64 dh_typecode_i64 99#define dh_typecode_cptr dh_typecode_ptr 100#define dh_typecode_env dh_typecode_ptr 101#define dh_typecode_fpst dh_typecode_ptr 102#define dh_typecode(t) dh_typecode_##t 103 104#define dh_callflag_i32 0 105#define dh_callflag_i64 0 106#define dh_callflag_i128 0 107#define dh_callflag_ptr 0 108#define dh_callflag_void 0 109#define dh_callflag_noreturn TCG_CALL_NO_RETURN 110#define dh_callflag(t) glue(dh_callflag_, dh_alias(t)) 111 112#define dh_typemask(t, n) (dh_typecode(t) << (n * 3)) 113 114#define dh_arg(t, n) \ 115 glue(glue(tcgv_, dh_alias(t)), _temp)(glue(arg, n)) 116 117#define dh_arg_decl(t, n) glue(TCGv_, dh_alias(t)) glue(arg, n) 118 119#define DEF_HELPER_0(name, ret) \ 120 DEF_HELPER_FLAGS_0(name, 0, ret) 121#define DEF_HELPER_1(name, ret, t1) \ 122 DEF_HELPER_FLAGS_1(name, 0, ret, t1) 123#define DEF_HELPER_2(name, ret, t1, t2) \ 124 DEF_HELPER_FLAGS_2(name, 0, ret, t1, t2) 125#define DEF_HELPER_3(name, ret, t1, t2, t3) \ 126 DEF_HELPER_FLAGS_3(name, 0, ret, t1, t2, t3) 127#define DEF_HELPER_4(name, ret, t1, t2, t3, t4) \ 128 DEF_HELPER_FLAGS_4(name, 0, ret, t1, t2, t3, t4) 129#define DEF_HELPER_5(name, ret, t1, t2, t3, t4, t5) \ 130 DEF_HELPER_FLAGS_5(name, 0, ret, t1, t2, t3, t4, t5) 131#define DEF_HELPER_6(name, ret, t1, t2, t3, t4, t5, t6) \ 132 DEF_HELPER_FLAGS_6(name, 0, ret, t1, t2, t3, t4, t5, t6) 133#define DEF_HELPER_7(name, ret, t1, t2, t3, t4, t5, t6, t7) \ 134 DEF_HELPER_FLAGS_7(name, 0, ret, t1, t2, t3, t4, t5, t6, t7) 135 136/* MAX_CALL_IARGS must be set to n if last entry is DEF_HELPER_FLAGS_n. */ 137 138#endif /* EXEC_HELPER_HEAD_H */ 139