VirtualBox

source: vbox/trunk/src/recompiler/def-helper.h@ 37689

Last change on this file since 37689 was 37689, checked in by vboxsync, 13 years ago

recompiler: Merged in changes from 0.13.0.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 7.6 KB
Line 
1/* Helper file for declaring TCG helper functions.
2 Should be included at the start and end of target-foo/helper.h.
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 DEF_HELPER_H
19#define DEF_HELPER_H 1
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#if TARGET_LONG_BITS == 32
36#define dh_alias_tl i32
37#else
38#define dh_alias_tl i64
39#endif
40#define dh_alias_ptr ptr
41#define dh_alias_void void
42#define dh_alias_env ptr
43#ifdef VBOX
44# if ARCH_BITS == 32
45# define dh_alias_RTCCUINTREG i32
46# define dh_alias_RTCCINTREG i32
47# else
48# define dh_alias_RTCCUINTREG i64
49# define dh_alias_RTCCINTREG i64
50# endif
51#endif
52#define dh_alias(t) glue(dh_alias_, t)
53
54#define dh_ctype_i32 uint32_t
55#define dh_ctype_s32 int32_t
56#define dh_ctype_int int
57#define dh_ctype_i64 uint64_t
58#define dh_ctype_s64 int64_t
59#define dh_ctype_f32 float32
60#define dh_ctype_f64 float64
61#define dh_ctype_tl target_ulong
62#define dh_ctype_ptr void *
63#define dh_ctype_void void
64#define dh_ctype_env CPUState *
65#ifdef VBOX
66# if ARCH_BITS == 32
67# define dh_ctype_RTCCUINTREG uint32_t
68# define dh_ctype_RTCCINTREG int32_t
69# else
70# define dh_ctype_RTCCUINTREG uint64_t
71# define dh_ctype_RTCCINTREG int64_t
72# endif
73#endif
74#define dh_ctype(t) dh_ctype_##t
75
76/* We can't use glue() here because it falls foul of C preprocessor
77 recursive expansion rules. */
78#define dh_retvar_decl0_void void
79#define dh_retvar_decl0_i32 TCGv_i32 retval
80#define dh_retvar_decl0_i64 TCGv_i64 retval
81#define dh_retvar_decl0_ptr TCGv_ptr retval
82#define dh_retvar_decl0(t) glue(dh_retvar_decl0_, dh_alias(t))
83
84#define dh_retvar_decl_void
85#define dh_retvar_decl_i32 TCGv_i32 retval,
86#define dh_retvar_decl_i64 TCGv_i64 retval,
87#define dh_retvar_decl_ptr TCGv_ptr retval,
88#define dh_retvar_decl(t) glue(dh_retvar_decl_, dh_alias(t))
89
90#define dh_retvar_void TCG_CALL_DUMMY_ARG
91#define dh_retvar_i32 GET_TCGV_i32(retval)
92#define dh_retvar_i64 GET_TCGV_i64(retval)
93#define dh_retvar_ptr GET_TCGV_ptr(retval)
94#define dh_retvar(t) glue(dh_retvar_, dh_alias(t))
95
96#define dh_is_64bit_void 0
97#define dh_is_64bit_i32 0
98#define dh_is_64bit_i64 1
99#define dh_is_64bit_ptr (TCG_TARGET_REG_BITS == 64)
100#define dh_is_64bit(t) glue(dh_is_64bit_, dh_alias(t))
101
102#define dh_is_signed_void 0
103#define dh_is_signed_i32 0
104#define dh_is_signed_s32 1
105#define dh_is_signed_i64 0
106#define dh_is_signed_s64 1
107#define dh_is_signed_f32 0
108#define dh_is_signed_f64 0
109#define dh_is_signed_tl 0
110#define dh_is_signed_int 1
111/* ??? This is highly specific to the host cpu. There are even special
112 extension instructions that may be required, e.g. ia64's addp4. But
113 for now we don't support any 64-bit targets with 32-bit pointers. */
114#define dh_is_signed_ptr 0
115#define dh_is_signed_env dh_is_signed_ptr
116#define dh_is_signed(t) dh_is_signed_##t
117
118#define dh_sizemask(t, n) \
119 sizemask |= dh_is_64bit(t) << (n*2); \
120 sizemask |= dh_is_signed(t) << (n*2+1)
121
122#define dh_arg(t, n) \
123 args[n - 1] = glue(GET_TCGV_, dh_alias(t))(glue(arg, n)); \
124 dh_sizemask(t, n)
125
126#define dh_arg_decl(t, n) glue(TCGv_, dh_alias(t)) glue(arg, n)
127
128
129#define DEF_HELPER_0(name, ret) \
130 DEF_HELPER_FLAGS_0(name, 0, ret)
131#define DEF_HELPER_1(name, ret, t1) \
132 DEF_HELPER_FLAGS_1(name, 0, ret, t1)
133#define DEF_HELPER_2(name, ret, t1, t2) \
134 DEF_HELPER_FLAGS_2(name, 0, ret, t1, t2)
135#define DEF_HELPER_3(name, ret, t1, t2, t3) \
136 DEF_HELPER_FLAGS_3(name, 0, ret, t1, t2, t3)
137#define DEF_HELPER_4(name, ret, t1, t2, t3, t4) \
138 DEF_HELPER_FLAGS_4(name, 0, ret, t1, t2, t3, t4)
139
140#endif /* DEF_HELPER_H */
141
142#ifndef GEN_HELPER
143/* Function prototypes. */
144
145#define DEF_HELPER_FLAGS_0(name, flags, ret) \
146dh_ctype(ret) HELPER(name) (void);
147
148#define DEF_HELPER_FLAGS_1(name, flags, ret, t1) \
149dh_ctype(ret) HELPER(name) (dh_ctype(t1));
150
151#define DEF_HELPER_FLAGS_2(name, flags, ret, t1, t2) \
152dh_ctype(ret) HELPER(name) (dh_ctype(t1), dh_ctype(t2));
153
154#define DEF_HELPER_FLAGS_3(name, flags, ret, t1, t2, t3) \
155dh_ctype(ret) HELPER(name) (dh_ctype(t1), dh_ctype(t2), dh_ctype(t3));
156
157#define DEF_HELPER_FLAGS_4(name, flags, ret, t1, t2, t3, t4) \
158dh_ctype(ret) HELPER(name) (dh_ctype(t1), dh_ctype(t2), dh_ctype(t3), \
159 dh_ctype(t4));
160
161#undef GEN_HELPER
162#define GEN_HELPER -1
163
164#elif GEN_HELPER == 1
165/* Gen functions. */
166
167#define DEF_HELPER_FLAGS_0(name, flags, ret) \
168static inline void glue(gen_helper_, name)(dh_retvar_decl0(ret)) \
169{ \
170 int sizemask; \
171 sizemask = dh_is_64bit(ret); \
172 tcg_gen_helperN(HELPER(name), flags, sizemask, dh_retvar(ret), 0, NULL); \
173}
174
175#define DEF_HELPER_FLAGS_1(name, flags, ret, t1) \
176static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) dh_arg_decl(t1, 1)) \
177{ \
178 TCGArg args[1]; \
179 int sizemask = 0; \
180 dh_sizemask(ret, 0); \
181 dh_arg(t1, 1); \
182 tcg_gen_helperN(HELPER(name), flags, sizemask, dh_retvar(ret), 1, args); \
183}
184
185#define DEF_HELPER_FLAGS_2(name, flags, ret, t1, t2) \
186static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) dh_arg_decl(t1, 1), \
187 dh_arg_decl(t2, 2)) \
188{ \
189 TCGArg args[2]; \
190 int sizemask = 0; \
191 dh_sizemask(ret, 0); \
192 dh_arg(t1, 1); \
193 dh_arg(t2, 2); \
194 tcg_gen_helperN(HELPER(name), flags, sizemask, dh_retvar(ret), 2, args); \
195}
196
197#define DEF_HELPER_FLAGS_3(name, flags, ret, t1, t2, t3) \
198static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) dh_arg_decl(t1, 1), \
199 dh_arg_decl(t2, 2), dh_arg_decl(t3, 3)) \
200{ \
201 TCGArg args[3]; \
202 int sizemask = 0; \
203 dh_sizemask(ret, 0); \
204 dh_arg(t1, 1); \
205 dh_arg(t2, 2); \
206 dh_arg(t3, 3); \
207 tcg_gen_helperN(HELPER(name), flags, sizemask, dh_retvar(ret), 3, args); \
208}
209
210#define DEF_HELPER_FLAGS_4(name, flags, ret, t1, t2, t3, t4) \
211static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) dh_arg_decl(t1, 1), \
212 dh_arg_decl(t2, 2), dh_arg_decl(t3, 3), dh_arg_decl(t4, 4)) \
213{ \
214 TCGArg args[4]; \
215 int sizemask = 0; \
216 dh_sizemask(ret, 0); \
217 dh_arg(t1, 1); \
218 dh_arg(t2, 2); \
219 dh_arg(t3, 3); \
220 dh_arg(t4, 4); \
221 tcg_gen_helperN(HELPER(name), flags, sizemask, dh_retvar(ret), 4, args); \
222}
223
224#undef GEN_HELPER
225#define GEN_HELPER -1
226
227#elif GEN_HELPER == 2
228/* Register helpers. */
229
230#define DEF_HELPER_FLAGS_0(name, flags, ret) \
231tcg_register_helper(HELPER(name), #name);
232
233#define DEF_HELPER_FLAGS_1(name, flags, ret, t1) \
234DEF_HELPER_FLAGS_0(name, flags, ret)
235
236#define DEF_HELPER_FLAGS_2(name, flags, ret, t1, t2) \
237DEF_HELPER_FLAGS_0(name, flags, ret)
238
239#define DEF_HELPER_FLAGS_3(name, flags, ret, t1, t2, t3) \
240DEF_HELPER_FLAGS_0(name, flags, ret)
241
242#define DEF_HELPER_FLAGS_4(name, flags, ret, t1, t2, t3, t4) \
243DEF_HELPER_FLAGS_0(name, flags, ret)
244
245#undef GEN_HELPER
246#define GEN_HELPER -1
247
248#elif GEN_HELPER == -1
249/* Undefine macros. */
250
251#undef DEF_HELPER_FLAGS_0
252#undef DEF_HELPER_FLAGS_1
253#undef DEF_HELPER_FLAGS_2
254#undef DEF_HELPER_FLAGS_3
255#undef DEF_HELPER_FLAGS_4
256#undef GEN_HELPER
257
258#endif
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette