00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #ifndef DEF_HELPER_H
00019 #define DEF_HELPER_H 1
00020
00021 #define HELPER(name) glue(helper_, name)
00022
00023 #define GET_TCGV_i32 GET_TCGV_I32
00024 #define GET_TCGV_i64 GET_TCGV_I64
00025 #define GET_TCGV_ptr GET_TCGV_PTR
00026
00027
00028 #define dh_alias_i32 i32
00029 #define dh_alias_s32 i32
00030 #define dh_alias_int i32
00031 #define dh_alias_i64 i64
00032 #define dh_alias_s64 i64
00033 #define dh_alias_f32 i32
00034 #define dh_alias_f64 i64
00035 #if TARGET_LONG_BITS == 32
00036 #define dh_alias_tl i32
00037 #else
00038 #define dh_alias_tl i64
00039 #endif
00040 #define dh_alias_ptr ptr
00041 #define dh_alias_void void
00042 #define dh_alias_env ptr
00043 #define dh_alias(t) glue(dh_alias_, t)
00044
00045 #define dh_ctype_i32 uint32_t
00046 #define dh_ctype_s32 int32_t
00047 #define dh_ctype_int int
00048 #define dh_ctype_i64 uint64_t
00049 #define dh_ctype_s64 int64_t
00050 #define dh_ctype_f32 float32
00051 #define dh_ctype_f64 float64
00052 #define dh_ctype_tl target_ulong
00053 #define dh_ctype_ptr void *
00054 #define dh_ctype_void void
00055 #define dh_ctype_env CPUState *
00056 #define dh_ctype(t) dh_ctype_##t
00057
00058
00059
00060 #define dh_retvar_decl0_void void
00061 #define dh_retvar_decl0_i32 TCGv_i32 retval
00062 #define dh_retvar_decl0_i64 TCGv_i64 retval
00063 #define dh_retvar_decl0_ptr TCGv_iptr retval
00064 #define dh_retvar_decl0(t) glue(dh_retvar_decl0_, dh_alias(t))
00065
00066 #define dh_retvar_decl_void
00067 #define dh_retvar_decl_i32 TCGv_i32 retval,
00068 #define dh_retvar_decl_i64 TCGv_i64 retval,
00069 #define dh_retvar_decl_ptr TCGv_iptr retval,
00070 #define dh_retvar_decl(t) glue(dh_retvar_decl_, dh_alias(t))
00071
00072 #define dh_retvar_void TCG_CALL_DUMMY_ARG
00073 #define dh_retvar_i32 GET_TCGV_i32(retval)
00074 #define dh_retvar_i64 GET_TCGV_i64(retval)
00075 #define dh_retvar_ptr GET_TCGV_ptr(retval)
00076 #define dh_retvar(t) glue(dh_retvar_, dh_alias(t))
00077
00078 #define dh_is_64bit_void 0
00079 #define dh_is_64bit_i32 0
00080 #define dh_is_64bit_i64 1
00081 #define dh_is_64bit_ptr (TCG_TARGET_REG_BITS == 64)
00082 #define dh_is_64bit(t) glue(dh_is_64bit_, dh_alias(t))
00083
00084 #define dh_arg(t, n) \
00085 args[n - 1] = glue(GET_TCGV_, dh_alias(t))(glue(arg, n)); \
00086 sizemask |= dh_is_64bit(t) << n
00087
00088 #define dh_arg_decl(t, n) glue(TCGv_, dh_alias(t)) glue(arg, n)
00089
00090
00091 #define DEF_HELPER_0(name, ret) \
00092 DEF_HELPER_FLAGS_0(name, 0, ret)
00093 #define DEF_HELPER_1(name, ret, t1) \
00094 DEF_HELPER_FLAGS_1(name, 0, ret, t1)
00095 #define DEF_HELPER_2(name, ret, t1, t2) \
00096 DEF_HELPER_FLAGS_2(name, 0, ret, t1, t2)
00097 #define DEF_HELPER_3(name, ret, t1, t2, t3) \
00098 DEF_HELPER_FLAGS_3(name, 0, ret, t1, t2, t3)
00099 #define DEF_HELPER_4(name, ret, t1, t2, t3, t4) \
00100 DEF_HELPER_FLAGS_4(name, 0, ret, t1, t2, t3, t4)
00101
00102 #endif
00103
00104 #ifndef GEN_HELPER
00105
00106
00107 #define DEF_HELPER_FLAGS_0(name, flags, ret) \
00108 dh_ctype(ret) HELPER(name) (void);
00109
00110 #define DEF_HELPER_FLAGS_1(name, flags, ret, t1) \
00111 dh_ctype(ret) HELPER(name) (dh_ctype(t1));
00112
00113 #define DEF_HELPER_FLAGS_2(name, flags, ret, t1, t2) \
00114 dh_ctype(ret) HELPER(name) (dh_ctype(t1), dh_ctype(t2));
00115
00116 #define DEF_HELPER_FLAGS_3(name, flags, ret, t1, t2, t3) \
00117 dh_ctype(ret) HELPER(name) (dh_ctype(t1), dh_ctype(t2), dh_ctype(t3));
00118
00119 #define DEF_HELPER_FLAGS_4(name, flags, ret, t1, t2, t3, t4) \
00120 dh_ctype(ret) HELPER(name) (dh_ctype(t1), dh_ctype(t2), dh_ctype(t3), \
00121 dh_ctype(t4));
00122
00123 #undef GEN_HELPER
00124 #define GEN_HELPER -1
00125
00126 #elif GEN_HELPER == 1
00127
00128
00129 #define DEF_HELPER_FLAGS_0(name, flags, ret) \
00130 static inline void glue(gen_helper_, name)(dh_retvar_decl0(ret)) \
00131 { \
00132 int sizemask; \
00133 sizemask = dh_is_64bit(ret); \
00134 tcg_gen_helperN(HELPER(name), flags, sizemask, dh_retvar(ret), 0, NULL); \
00135 }
00136
00137 #define DEF_HELPER_FLAGS_1(name, flags, ret, t1) \
00138 static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) dh_arg_decl(t1, 1)) \
00139 { \
00140 TCGArg args[1]; \
00141 int sizemask; \
00142 sizemask = dh_is_64bit(ret); \
00143 dh_arg(t1, 1); \
00144 tcg_gen_helperN(HELPER(name), flags, sizemask, dh_retvar(ret), 1, args); \
00145 }
00146
00147 #define DEF_HELPER_FLAGS_2(name, flags, ret, t1, t2) \
00148 static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) dh_arg_decl(t1, 1), \
00149 dh_arg_decl(t2, 2)) \
00150 { \
00151 TCGArg args[2]; \
00152 int sizemask; \
00153 sizemask = dh_is_64bit(ret); \
00154 dh_arg(t1, 1); \
00155 dh_arg(t2, 2); \
00156 tcg_gen_helperN(HELPER(name), flags, sizemask, dh_retvar(ret), 2, args); \
00157 }
00158
00159 #define DEF_HELPER_FLAGS_3(name, flags, ret, t1, t2, t3) \
00160 static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) dh_arg_decl(t1, 1), \
00161 dh_arg_decl(t2, 2), dh_arg_decl(t3, 3)) \
00162 { \
00163 TCGArg args[3]; \
00164 int sizemask; \
00165 sizemask = dh_is_64bit(ret); \
00166 dh_arg(t1, 1); \
00167 dh_arg(t2, 2); \
00168 dh_arg(t3, 3); \
00169 tcg_gen_helperN(HELPER(name), flags, sizemask, dh_retvar(ret), 3, args); \
00170 }
00171
00172 #define DEF_HELPER_FLAGS_4(name, flags, ret, t1, t2, t3, t4) \
00173 static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) dh_arg_decl(t1, 1), \
00174 dh_arg_decl(t2, 2), dh_arg_decl(t3, 3), dh_arg_decl(t4, 4)) \
00175 { \
00176 TCGArg args[4]; \
00177 int sizemask; \
00178 sizemask = dh_is_64bit(ret); \
00179 dh_arg(t1, 1); \
00180 dh_arg(t2, 2); \
00181 dh_arg(t3, 3); \
00182 dh_arg(t4, 4); \
00183 tcg_gen_helperN(HELPER(name), flags, sizemask, dh_retvar(ret), 4, args); \
00184 }
00185
00186 #undef GEN_HELPER
00187 #define GEN_HELPER -1
00188
00189 #elif GEN_HELPER == 2
00190
00191
00192 #define DEF_HELPER_FLAGS_0(name, flags, ret) \
00193 tcg_register_helper(HELPER(name), #name);
00194
00195 #define DEF_HELPER_FLAGS_1(name, flags, ret, t1) \
00196 DEF_HELPER_FLAGS_0(name, flags, ret)
00197
00198 #define DEF_HELPER_FLAGS_2(name, flags, ret, t1, t2) \
00199 DEF_HELPER_FLAGS_0(name, flags, ret)
00200
00201 #define DEF_HELPER_FLAGS_3(name, flags, ret, t1, t2, t3) \
00202 DEF_HELPER_FLAGS_0(name, flags, ret)
00203
00204 #define DEF_HELPER_FLAGS_4(name, flags, ret, t1, t2, t3, t4) \
00205 DEF_HELPER_FLAGS_0(name, flags, ret)
00206
00207 #undef GEN_HELPER
00208 #define GEN_HELPER -1
00209
00210 #elif GEN_HELPER == -1
00211
00212
00213 #undef DEF_HELPER_FLAGS_0
00214 #undef DEF_HELPER_FLAGS_1
00215 #undef DEF_HELPER_FLAGS_2
00216 #undef DEF_HELPER_FLAGS_3
00217 #undef DEF_HELPER_FLAGS_4
00218 #undef GEN_HELPER
00219
00220 #endif