xref: /openbmc/qemu/include/exec/helper-head.h.inc (revision 83aaec1d5a49f158abaa31797a0f976b3c07e5ca)
1/*
2 * Helper file for declaring TCG helper functions.
3 * Used by other helper files.
4 */
5
6#ifndef EXEC_HELPER_HEAD_H
7#define EXEC_HELPER_HEAD_H
8
9#include "fpu/softfloat-types.h"
10
11#define HELPER(name) glue(helper_, name)
12
13/* Some types that make sense in C, but not for TCG.  */
14#define dh_alias_i32 i32
15#define dh_alias_s32 i32
16#define dh_alias_int i32
17#define dh_alias_i64 i64
18#define dh_alias_s64 i64
19#define dh_alias_i128 i128
20#define dh_alias_f16 i32
21#define dh_alias_f32 i32
22#define dh_alias_f64 i64
23#define dh_alias_ptr ptr
24#define dh_alias_cptr ptr
25#define dh_alias_env ptr
26#define dh_alias_fpst ptr
27#define dh_alias_void void
28#define dh_alias_noreturn noreturn
29#define dh_alias(t) glue(dh_alias_, t)
30
31#define dh_ctype_i32 uint32_t
32#define dh_ctype_s32 int32_t
33#define dh_ctype_int int
34#define dh_ctype_i64 uint64_t
35#define dh_ctype_s64 int64_t
36#define dh_ctype_i128 Int128
37#define dh_ctype_f16 uint32_t
38#define dh_ctype_f32 float32
39#define dh_ctype_f64 float64
40#define dh_ctype_ptr void *
41#define dh_ctype_cptr const void *
42#define dh_ctype_env CPUArchState *
43#define dh_ctype_fpst float_status *
44#define dh_ctype_void void
45#define dh_ctype_noreturn G_NORETURN void
46#define dh_ctype(t) dh_ctype_##t
47
48#ifdef COMPILING_PER_TARGET
49# ifdef TARGET_LONG_BITS
50#  if TARGET_LONG_BITS == 32
51#   define dh_alias_tl i32
52#   define dh_typecode_tl dh_typecode_i32
53#  else
54#   define dh_alias_tl i64
55#   define dh_typecode_tl dh_typecode_i64
56#  endif
57# endif
58# define dh_ctype_tl target_ulong
59#endif /* COMPILING_PER_TARGET */
60
61/* We can't use glue() here because it falls foul of C preprocessor
62   recursive expansion rules.  */
63#define dh_retvar_decl0_void void
64#define dh_retvar_decl0_noreturn void
65#define dh_retvar_decl0_i32 TCGv_i32 retval
66#define dh_retvar_decl0_i64 TCGv_i64 retval
67#define dh_retval_decl0_i128 TCGv_i128 retval
68#define dh_retvar_decl0_ptr TCGv_ptr retval
69#define dh_retvar_decl0(t) glue(dh_retvar_decl0_, dh_alias(t))
70
71#define dh_retvar_decl_void
72#define dh_retvar_decl_noreturn
73#define dh_retvar_decl_i32 TCGv_i32 retval,
74#define dh_retvar_decl_i64 TCGv_i64 retval,
75#define dh_retvar_decl_i128 TCGv_i128 retval,
76#define dh_retvar_decl_ptr TCGv_ptr retval,
77#define dh_retvar_decl(t) glue(dh_retvar_decl_, dh_alias(t))
78
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_i128 tcgv_i128_temp(retval)
84#define dh_retvar_ptr tcgv_ptr_temp(retval)
85#define dh_retvar(t) glue(dh_retvar_, dh_alias(t))
86
87#define dh_typecode_void 0
88#define dh_typecode_noreturn 0
89#define dh_typecode_i32 2
90#define dh_typecode_s32 3
91#define dh_typecode_i64 4
92#define dh_typecode_s64 5
93#define dh_typecode_ptr 6
94#define dh_typecode_i128 7
95#define dh_typecode_int dh_typecode_s32
96#define dh_typecode_f16 dh_typecode_i32
97#define dh_typecode_f32 dh_typecode_i32
98#define dh_typecode_f64 dh_typecode_i64
99#define dh_typecode_cptr dh_typecode_ptr
100#define dh_typecode_env dh_typecode_ptr
101#define dh_typecode_fpst dh_typecode_ptr
102#define dh_typecode(t) dh_typecode_##t
103
104#define dh_callflag_i32  0
105#define dh_callflag_i64  0
106#define dh_callflag_i128 0
107#define dh_callflag_ptr  0
108#define dh_callflag_void 0
109#define dh_callflag_noreturn TCG_CALL_NO_RETURN
110#define dh_callflag(t) glue(dh_callflag_, dh_alias(t))
111
112#define dh_typemask(t, n)  (dh_typecode(t) << (n * 3))
113
114#define dh_arg(t, n) \
115  glue(glue(tcgv_, dh_alias(t)), _temp)(glue(arg, n))
116
117#define dh_arg_decl(t, n) glue(TCGv_, dh_alias(t)) glue(arg, n)
118
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)
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)
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)
133#define DEF_HELPER_7(name, ret, t1, t2, t3, t4, t5, t6, t7) \
134    DEF_HELPER_FLAGS_7(name, 0, ret, t1, t2, t3, t4, t5, t6, t7)
135
136/* MAX_CALL_IARGS must be set to n if last entry is DEF_HELPER_FLAGS_n. */
137
138#endif /* EXEC_HELPER_HEAD_H */
139