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