]> git.proxmox.com Git - mirror_qemu.git/blame - include/exec/helper-head.h
exec: revert MemoryRegionCache
[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
a7812ae4
PB
21#define HELPER(name) glue(helper_, name)
22
23#define GET_TCGV_i32 GET_TCGV_I32
24#define GET_TCGV_i64 GET_TCGV_I64
25#define GET_TCGV_ptr GET_TCGV_PTR
26
27/* Some types that make sense in C, but not for TCG. */
28#define dh_alias_i32 i32
29#define dh_alias_s32 i32
30#define dh_alias_int i32
31#define dh_alias_i64 i64
32#define dh_alias_s64 i64
33#define dh_alias_f32 i32
34#define dh_alias_f64 i64
a7812ae4
PB
35#define dh_alias_ptr ptr
36#define dh_alias_void void
1367ff49 37#define dh_alias_noreturn noreturn
a7812ae4
PB
38#define dh_alias(t) glue(dh_alias_, t)
39
40#define dh_ctype_i32 uint32_t
41#define dh_ctype_s32 int32_t
42#define dh_ctype_int int
43#define dh_ctype_i64 uint64_t
44#define dh_ctype_s64 int64_t
45#define dh_ctype_f32 float32
46#define dh_ctype_f64 float64
a7812ae4
PB
47#define dh_ctype_ptr void *
48#define dh_ctype_void void
1367ff49 49#define dh_ctype_noreturn void QEMU_NORETURN
a7812ae4
PB
50#define dh_ctype(t) dh_ctype_##t
51
bdd90227
PB
52#ifdef NEED_CPU_H
53# ifdef TARGET_LONG_BITS
54# if TARGET_LONG_BITS == 32
55# define dh_alias_tl i32
56# else
57# define dh_alias_tl i64
58# endif
59# endif
60# define dh_alias_env ptr
61# define dh_ctype_tl target_ulong
62# define dh_ctype_env CPUArchState *
63#endif
64
a7812ae4
PB
65/* We can't use glue() here because it falls foul of C preprocessor
66 recursive expansion rules. */
67#define dh_retvar_decl0_void void
1367ff49 68#define dh_retvar_decl0_noreturn void
a7812ae4
PB
69#define dh_retvar_decl0_i32 TCGv_i32 retval
70#define dh_retvar_decl0_i64 TCGv_i64 retval
9c9c310a 71#define dh_retvar_decl0_ptr TCGv_ptr retval
a7812ae4
PB
72#define dh_retvar_decl0(t) glue(dh_retvar_decl0_, dh_alias(t))
73
74#define dh_retvar_decl_void
1367ff49 75#define dh_retvar_decl_noreturn
a7812ae4
PB
76#define dh_retvar_decl_i32 TCGv_i32 retval,
77#define dh_retvar_decl_i64 TCGv_i64 retval,
9c9c310a 78#define dh_retvar_decl_ptr TCGv_ptr retval,
a7812ae4
PB
79#define dh_retvar_decl(t) glue(dh_retvar_decl_, dh_alias(t))
80
81#define dh_retvar_void TCG_CALL_DUMMY_ARG
1367ff49 82#define dh_retvar_noreturn TCG_CALL_DUMMY_ARG
a7812ae4
PB
83#define dh_retvar_i32 GET_TCGV_i32(retval)
84#define dh_retvar_i64 GET_TCGV_i64(retval)
85#define dh_retvar_ptr GET_TCGV_ptr(retval)
86#define dh_retvar(t) glue(dh_retvar_, dh_alias(t))
87
88#define dh_is_64bit_void 0
1367ff49 89#define dh_is_64bit_noreturn 0
a7812ae4
PB
90#define dh_is_64bit_i32 0
91#define dh_is_64bit_i64 1
71b92699 92#define dh_is_64bit_ptr (sizeof(void *) == 8)
a7812ae4
PB
93#define dh_is_64bit(t) glue(dh_is_64bit_, dh_alias(t))
94
2bece2c8 95#define dh_is_signed_void 0
1367ff49 96#define dh_is_signed_noreturn 0
2bece2c8
RH
97#define dh_is_signed_i32 0
98#define dh_is_signed_s32 1
99#define dh_is_signed_i64 0
100#define dh_is_signed_s64 1
101#define dh_is_signed_f32 0
102#define dh_is_signed_f64 0
103#define dh_is_signed_tl 0
104#define dh_is_signed_int 1
105/* ??? This is highly specific to the host cpu. There are even special
106 extension instructions that may be required, e.g. ia64's addp4. But
107 for now we don't support any 64-bit targets with 32-bit pointers. */
108#define dh_is_signed_ptr 0
109#define dh_is_signed_env dh_is_signed_ptr
110#define dh_is_signed(t) dh_is_signed_##t
111
112#define dh_sizemask(t, n) \
a5ed2de1 113 ((dh_is_64bit(t) << (n*2)) | (dh_is_signed(t) << (n*2+1)))
2bece2c8 114
a7812ae4 115#define dh_arg(t, n) \
011209e1 116 glue(GET_TCGV_, dh_alias(t))(glue(arg, n))
a7812ae4
PB
117
118#define dh_arg_decl(t, n) glue(TCGv_, dh_alias(t)) glue(arg, n)
119
a7812ae4
PB
120#define DEF_HELPER_0(name, ret) \
121 DEF_HELPER_FLAGS_0(name, 0, ret)
122#define DEF_HELPER_1(name, ret, t1) \
123 DEF_HELPER_FLAGS_1(name, 0, ret, t1)
124#define DEF_HELPER_2(name, ret, t1, t2) \
125 DEF_HELPER_FLAGS_2(name, 0, ret, t1, t2)
126#define DEF_HELPER_3(name, ret, t1, t2, t3) \
127 DEF_HELPER_FLAGS_3(name, 0, ret, t1, t2, t3)
128#define DEF_HELPER_4(name, ret, t1, t2, t3, t4) \
129 DEF_HELPER_FLAGS_4(name, 0, ret, t1, t2, t3, t4)
57d585f7
BS
130#define DEF_HELPER_5(name, ret, t1, t2, t3, t4, t5) \
131 DEF_HELPER_FLAGS_5(name, 0, ret, t1, t2, t3, t4, t5)
a7812ae4 132
3cebc3f1
SW
133/* MAX_OPC_PARAM_IARGS must be set to n if last entry is DEF_HELPER_FLAGS_n. */
134
121d0712 135#endif /* EXEC_HELPER_HEAD_H */