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 NEED_CPU_H 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 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