]> git.proxmox.com Git - mirror_qemu.git/blame - include/exec/helper-head.h
Merge tag 'pull-tcg-20230516-3' of https://gitlab.com/rth7680/qemu into staging
[mirror_qemu.git] / include / exec / helper-head.h
CommitLineData
a7812ae4 1/* Helper file for declaring TCG helper functions.
2ef6175a 2 Used by other helper files.
a7812ae4
PB
3
4 Targets should use DEF_HELPER_N and DEF_HELPER_FLAGS_N to declare helper
5 functions. Names should be specified without the helper_ prefix, and
6 the return and argument types specified. 3 basic types are understood
7 (i32, i64 and ptr). Additional aliases are provided for convenience and
8 to match the types used by the C helper implementation.
9
10 The target helper.h should be included in all files that use/define
11 helper functions. THis will ensure that function prototypes are
12 consistent. In addition it should be included an extra two times for
13 helper.c, defining:
14 GEN_HELPER 1 to produce op generation functions (gen_helper_*)
15 GEN_HELPER 2 to do runtime registration helper functions.
16 */
17
121d0712
MA
18#ifndef EXEC_HELPER_HEAD_H
19#define EXEC_HELPER_HEAD_H
944eea96 20
0c4d7ddb
PMD
21#include "fpu/softfloat-types.h"
22
a7812ae4
PB
23#define HELPER(name) glue(helper_, name)
24
a7812ae4
PB
25/* Some types that make sense in C, but not for TCG. */
26#define dh_alias_i32 i32
27#define dh_alias_s32 i32
28#define dh_alias_int i32
29#define dh_alias_i64 i64
30#define dh_alias_s64 i64
ecbea3ec 31#define dh_alias_i128 i128
35737497 32#define dh_alias_f16 i32
a7812ae4
PB
33#define dh_alias_f32 i32
34#define dh_alias_f64 i64
a7812ae4 35#define dh_alias_ptr ptr
8c6edfdd 36#define dh_alias_cptr ptr
a7812ae4 37#define dh_alias_void void
1367ff49 38#define dh_alias_noreturn noreturn
a7812ae4
PB
39#define dh_alias(t) glue(dh_alias_, t)
40
41#define dh_ctype_i32 uint32_t
42#define dh_ctype_s32 int32_t
43#define dh_ctype_int int
44#define dh_ctype_i64 uint64_t
45#define dh_ctype_s64 int64_t
ecbea3ec 46#define dh_ctype_i128 Int128
6c2be133 47#define dh_ctype_f16 uint32_t
a7812ae4
PB
48#define dh_ctype_f32 float32
49#define dh_ctype_f64 float64
a7812ae4 50#define dh_ctype_ptr void *
8c6edfdd 51#define dh_ctype_cptr const void *
a7812ae4 52#define dh_ctype_void void
8905770b 53#define dh_ctype_noreturn G_NORETURN void
a7812ae4
PB
54#define dh_ctype(t) dh_ctype_##t
55
bdd90227
PB
56#ifdef NEED_CPU_H
57# ifdef TARGET_LONG_BITS
58# if TARGET_LONG_BITS == 32
59# define dh_alias_tl i32
8929906e 60# define dh_typecode_tl dh_typecode_i32
bdd90227
PB
61# else
62# define dh_alias_tl i64
8929906e 63# define dh_typecode_tl dh_typecode_i64
bdd90227
PB
64# endif
65# endif
bdd90227 66# define dh_ctype_tl target_ulong
8929906e 67# define dh_alias_env ptr
bdd90227 68# define dh_ctype_env CPUArchState *
8929906e 69# define dh_typecode_env dh_typecode_ptr
bdd90227
PB
70#endif
71
a7812ae4
PB
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
1367ff49 75#define dh_retvar_decl0_noreturn void
a7812ae4
PB
76#define dh_retvar_decl0_i32 TCGv_i32 retval
77#define dh_retvar_decl0_i64 TCGv_i64 retval
ecbea3ec 78#define dh_retval_decl0_i128 TCGv_i128 retval
9c9c310a 79#define dh_retvar_decl0_ptr TCGv_ptr retval
a7812ae4
PB
80#define dh_retvar_decl0(t) glue(dh_retvar_decl0_, dh_alias(t))
81
82#define dh_retvar_decl_void
1367ff49 83#define dh_retvar_decl_noreturn
a7812ae4
PB
84#define dh_retvar_decl_i32 TCGv_i32 retval,
85#define dh_retvar_decl_i64 TCGv_i64 retval,
ecbea3ec 86#define dh_retvar_decl_i128 TCGv_i128 retval,
9c9c310a 87#define dh_retvar_decl_ptr TCGv_ptr retval,
a7812ae4
PB
88#define dh_retvar_decl(t) glue(dh_retvar_decl_, dh_alias(t))
89
ae8b75dc
RH
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)
ecbea3ec 94#define dh_retvar_i128 tcgv_i128_temp(retval)
ae8b75dc 95#define dh_retvar_ptr tcgv_ptr_temp(retval)
a7812ae4
PB
96#define dh_retvar(t) glue(dh_retvar_, dh_alias(t))
97
7319d83a
RH
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
ecbea3ec 105#define dh_typecode_i128 7
8929906e
RH
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(t) dh_typecode_##t
2bece2c8 112
15d74092 113#define dh_callflag_i32 0
15d74092 114#define dh_callflag_i64 0
ecbea3ec 115#define dh_callflag_i128 0
15d74092
RH
116#define dh_callflag_ptr 0
117#define dh_callflag_void 0
118#define dh_callflag_noreturn TCG_CALL_NO_RETURN
119#define dh_callflag(t) glue(dh_callflag_, dh_alias(t))
120
7319d83a 121#define dh_typemask(t, n) (dh_typecode(t) << (n * 3))
2bece2c8 122
a7812ae4 123#define dh_arg(t, n) \
ae8b75dc 124 glue(glue(tcgv_, dh_alias(t)), _temp)(glue(arg, n))
a7812ae4
PB
125
126#define dh_arg_decl(t, n) glue(TCGv_, dh_alias(t)) glue(arg, n)
127
a7812ae4
PB
128#define DEF_HELPER_0(name, ret) \
129 DEF_HELPER_FLAGS_0(name, 0, ret)
130#define DEF_HELPER_1(name, ret, t1) \
131 DEF_HELPER_FLAGS_1(name, 0, ret, t1)
132#define DEF_HELPER_2(name, ret, t1, t2) \
133 DEF_HELPER_FLAGS_2(name, 0, ret, t1, t2)
134#define DEF_HELPER_3(name, ret, t1, t2, t3) \
135 DEF_HELPER_FLAGS_3(name, 0, ret, t1, t2, t3)
136#define DEF_HELPER_4(name, ret, t1, t2, t3, t4) \
137 DEF_HELPER_FLAGS_4(name, 0, ret, t1, t2, t3, t4)
57d585f7
BS
138#define DEF_HELPER_5(name, ret, t1, t2, t3, t4, t5) \
139 DEF_HELPER_FLAGS_5(name, 0, ret, t1, t2, t3, t4, t5)
1df3caa9
RH
140#define DEF_HELPER_6(name, ret, t1, t2, t3, t4, t5, t6) \
141 DEF_HELPER_FLAGS_6(name, 0, ret, t1, t2, t3, t4, t5, t6)
e6cadf49
TS
142#define DEF_HELPER_7(name, ret, t1, t2, t3, t4, t5, t6, t7) \
143 DEF_HELPER_FLAGS_7(name, 0, ret, t1, t2, t3, t4, t5, t6, t7)
a7812ae4 144
39004a71
RH
145/* MAX_CALL_IARGS must be set to n if last entry is DEF_HELPER_FLAGS_n. */
146
121d0712 147#endif /* EXEC_HELPER_HEAD_H */