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_void void 27#define dh_alias_noreturn noreturn 28#define dh_alias(t) glue(dh_alias_, t) 29 30#define dh_ctype_i32 uint32_t 31#define dh_ctype_s32 int32_t 32#define dh_ctype_int int 33#define dh_ctype_i64 uint64_t 34#define dh_ctype_s64 int64_t 35#define dh_ctype_i128 Int128 36#define dh_ctype_f16 uint32_t 37#define dh_ctype_f32 float32 38#define dh_ctype_f64 float64 39#define dh_ctype_ptr void * 40#define dh_ctype_cptr const void * 41#define dh_ctype_env CPUArchState * 42#define dh_ctype_void void 43#define dh_ctype_noreturn G_NORETURN void 44#define dh_ctype(t) dh_ctype_##t 45 46#ifdef COMPILING_PER_TARGET 47# ifdef TARGET_LONG_BITS 48# if TARGET_LONG_BITS == 32 49# define dh_alias_tl i32 50# define dh_typecode_tl dh_typecode_i32 51# else 52# define dh_alias_tl i64 53# define dh_typecode_tl dh_typecode_i64 54# endif 55# endif 56# define dh_ctype_tl target_ulong 57#endif /* COMPILING_PER_TARGET */ 58 59/* We can't use glue() here because it falls foul of C preprocessor 60 recursive expansion rules. */ 61#define dh_retvar_decl0_void void 62#define dh_retvar_decl0_noreturn void 63#define dh_retvar_decl0_i32 TCGv_i32 retval 64#define dh_retvar_decl0_i64 TCGv_i64 retval 65#define dh_retval_decl0_i128 TCGv_i128 retval 66#define dh_retvar_decl0_ptr TCGv_ptr retval 67#define dh_retvar_decl0(t) glue(dh_retvar_decl0_, dh_alias(t)) 68 69#define dh_retvar_decl_void 70#define dh_retvar_decl_noreturn 71#define dh_retvar_decl_i32 TCGv_i32 retval, 72#define dh_retvar_decl_i64 TCGv_i64 retval, 73#define dh_retvar_decl_i128 TCGv_i128 retval, 74#define dh_retvar_decl_ptr TCGv_ptr retval, 75#define dh_retvar_decl(t) glue(dh_retvar_decl_, dh_alias(t)) 76 77#define dh_retvar_void NULL 78#define dh_retvar_noreturn NULL 79#define dh_retvar_i32 tcgv_i32_temp(retval) 80#define dh_retvar_i64 tcgv_i64_temp(retval) 81#define dh_retvar_i128 tcgv_i128_temp(retval) 82#define dh_retvar_ptr tcgv_ptr_temp(retval) 83#define dh_retvar(t) glue(dh_retvar_, dh_alias(t)) 84 85#define dh_typecode_void 0 86#define dh_typecode_noreturn 0 87#define dh_typecode_i32 2 88#define dh_typecode_s32 3 89#define dh_typecode_i64 4 90#define dh_typecode_s64 5 91#define dh_typecode_ptr 6 92#define dh_typecode_i128 7 93#define dh_typecode_int dh_typecode_s32 94#define dh_typecode_f16 dh_typecode_i32 95#define dh_typecode_f32 dh_typecode_i32 96#define dh_typecode_f64 dh_typecode_i64 97#define dh_typecode_cptr dh_typecode_ptr 98#define dh_typecode_env dh_typecode_ptr 99#define dh_typecode(t) dh_typecode_##t 100 101#define dh_callflag_i32 0 102#define dh_callflag_i64 0 103#define dh_callflag_i128 0 104#define dh_callflag_ptr 0 105#define dh_callflag_void 0 106#define dh_callflag_noreturn TCG_CALL_NO_RETURN 107#define dh_callflag(t) glue(dh_callflag_, dh_alias(t)) 108 109#define dh_typemask(t, n) (dh_typecode(t) << (n * 3)) 110 111#define dh_arg(t, n) \ 112 glue(glue(tcgv_, dh_alias(t)), _temp)(glue(arg, n)) 113 114#define dh_arg_decl(t, n) glue(TCGv_, dh_alias(t)) glue(arg, n) 115 116#define DEF_HELPER_0(name, ret) \ 117 DEF_HELPER_FLAGS_0(name, 0, ret) 118#define DEF_HELPER_1(name, ret, t1) \ 119 DEF_HELPER_FLAGS_1(name, 0, ret, t1) 120#define DEF_HELPER_2(name, ret, t1, t2) \ 121 DEF_HELPER_FLAGS_2(name, 0, ret, t1, t2) 122#define DEF_HELPER_3(name, ret, t1, t2, t3) \ 123 DEF_HELPER_FLAGS_3(name, 0, ret, t1, t2, t3) 124#define DEF_HELPER_4(name, ret, t1, t2, t3, t4) \ 125 DEF_HELPER_FLAGS_4(name, 0, ret, t1, t2, t3, t4) 126#define DEF_HELPER_5(name, ret, t1, t2, t3, t4, t5) \ 127 DEF_HELPER_FLAGS_5(name, 0, ret, t1, t2, t3, t4, t5) 128#define DEF_HELPER_6(name, ret, t1, t2, t3, t4, t5, t6) \ 129 DEF_HELPER_FLAGS_6(name, 0, ret, t1, t2, t3, t4, t5, t6) 130#define DEF_HELPER_7(name, ret, t1, t2, t3, t4, t5, t6, t7) \ 131 DEF_HELPER_FLAGS_7(name, 0, ret, t1, t2, t3, t4, t5, t6, t7) 132 133/* MAX_CALL_IARGS must be set to n if last entry is DEF_HELPER_FLAGS_n. */ 134 135#endif /* EXEC_HELPER_HEAD_H */ 136