tests: virtio-9p: code refactoring
[qemu.git] / include / exec / helper-head.h
1 /* Helper file for declaring TCG helper functions.
2 Used by other helper files.
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
18 #ifndef EXEC_HELPER_HEAD_H
19 #define EXEC_HELPER_HEAD_H
20
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
35 #define dh_alias_ptr ptr
36 #define dh_alias_void void
37 #define dh_alias_noreturn noreturn
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
47 #define dh_ctype_ptr void *
48 #define dh_ctype_void void
49 #define dh_ctype_noreturn void QEMU_NORETURN
50 #define dh_ctype(t) dh_ctype_##t
51
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
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
68 #define dh_retvar_decl0_noreturn void
69 #define dh_retvar_decl0_i32 TCGv_i32 retval
70 #define dh_retvar_decl0_i64 TCGv_i64 retval
71 #define dh_retvar_decl0_ptr TCGv_ptr retval
72 #define dh_retvar_decl0(t) glue(dh_retvar_decl0_, dh_alias(t))
73
74 #define dh_retvar_decl_void
75 #define dh_retvar_decl_noreturn
76 #define dh_retvar_decl_i32 TCGv_i32 retval,
77 #define dh_retvar_decl_i64 TCGv_i64 retval,
78 #define dh_retvar_decl_ptr TCGv_ptr retval,
79 #define dh_retvar_decl(t) glue(dh_retvar_decl_, dh_alias(t))
80
81 #define dh_retvar_void TCG_CALL_DUMMY_ARG
82 #define dh_retvar_noreturn TCG_CALL_DUMMY_ARG
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
89 #define dh_is_64bit_noreturn 0
90 #define dh_is_64bit_i32 0
91 #define dh_is_64bit_i64 1
92 #define dh_is_64bit_ptr (sizeof(void *) == 8)
93 #define dh_is_64bit(t) glue(dh_is_64bit_, dh_alias(t))
94
95 #define dh_is_signed_void 0
96 #define dh_is_signed_noreturn 0
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) \
113 ((dh_is_64bit(t) << (n*2)) | (dh_is_signed(t) << (n*2+1)))
114
115 #define dh_arg(t, n) \
116 glue(GET_TCGV_, dh_alias(t))(glue(arg, n))
117
118 #define dh_arg_decl(t, n) glue(TCGv_, dh_alias(t)) glue(arg, n)
119
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)
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)
132
133 /* MAX_OPC_PARAM_IARGS must be set to n if last entry is DEF_HELPER_FLAGS_n. */
134
135 #endif /* EXEC_HELPER_HEAD_H */