xref: /qemu/include/tcg/helper-info.h (revision 0f4e14c2)
1*0f4e14c2SRichard Henderson /*
2*0f4e14c2SRichard Henderson  * TCG Helper Infomation Structure
3*0f4e14c2SRichard Henderson  *
4*0f4e14c2SRichard Henderson  * Copyright (c) 2023 Linaro Ltd
5*0f4e14c2SRichard Henderson  *
6*0f4e14c2SRichard Henderson  * SPDX-License-Identifier: GPL-2.0-or-later
7*0f4e14c2SRichard Henderson  */
8*0f4e14c2SRichard Henderson 
9*0f4e14c2SRichard Henderson #ifndef TCG_HELPER_INFO_H
10*0f4e14c2SRichard Henderson #define TCG_HELPER_INFO_H
11*0f4e14c2SRichard Henderson 
12*0f4e14c2SRichard Henderson #ifdef CONFIG_TCG_INTERPRETER
13*0f4e14c2SRichard Henderson #include <ffi.h>
14*0f4e14c2SRichard Henderson #endif
15*0f4e14c2SRichard Henderson 
16*0f4e14c2SRichard Henderson /*
17*0f4e14c2SRichard Henderson  * Describe the calling convention of a given argument type.
18*0f4e14c2SRichard Henderson  */
19*0f4e14c2SRichard Henderson typedef enum {
20*0f4e14c2SRichard Henderson     TCG_CALL_RET_NORMAL,         /* by registers */
21*0f4e14c2SRichard Henderson     TCG_CALL_RET_BY_REF,         /* for i128, by reference */
22*0f4e14c2SRichard Henderson     TCG_CALL_RET_BY_VEC,         /* for i128, by vector register */
23*0f4e14c2SRichard Henderson } TCGCallReturnKind;
24*0f4e14c2SRichard Henderson 
25*0f4e14c2SRichard Henderson typedef enum {
26*0f4e14c2SRichard Henderson     TCG_CALL_ARG_NORMAL,         /* by registers (continuing onto stack) */
27*0f4e14c2SRichard Henderson     TCG_CALL_ARG_EVEN,           /* like normal, but skipping odd slots */
28*0f4e14c2SRichard Henderson     TCG_CALL_ARG_EXTEND,         /* for i32, as a sign/zero-extended i64 */
29*0f4e14c2SRichard Henderson     TCG_CALL_ARG_EXTEND_U,       /*      ... as a zero-extended i64 */
30*0f4e14c2SRichard Henderson     TCG_CALL_ARG_EXTEND_S,       /*      ... as a sign-extended i64 */
31*0f4e14c2SRichard Henderson     TCG_CALL_ARG_BY_REF,         /* for i128, by reference, first */
32*0f4e14c2SRichard Henderson     TCG_CALL_ARG_BY_REF_N,       /*       ... by reference, subsequent */
33*0f4e14c2SRichard Henderson } TCGCallArgumentKind;
34*0f4e14c2SRichard Henderson 
35*0f4e14c2SRichard Henderson typedef struct TCGCallArgumentLoc {
36*0f4e14c2SRichard Henderson     TCGCallArgumentKind kind    : 8;
37*0f4e14c2SRichard Henderson     unsigned arg_slot           : 8;
38*0f4e14c2SRichard Henderson     unsigned ref_slot           : 8;
39*0f4e14c2SRichard Henderson     unsigned arg_idx            : 4;
40*0f4e14c2SRichard Henderson     unsigned tmp_subindex       : 2;
41*0f4e14c2SRichard Henderson } TCGCallArgumentLoc;
42*0f4e14c2SRichard Henderson 
43*0f4e14c2SRichard Henderson typedef struct TCGHelperInfo {
44*0f4e14c2SRichard Henderson     void *func;
45*0f4e14c2SRichard Henderson     const char *name;
46*0f4e14c2SRichard Henderson #ifdef CONFIG_TCG_INTERPRETER
47*0f4e14c2SRichard Henderson     ffi_cif *cif;
48*0f4e14c2SRichard Henderson #endif
49*0f4e14c2SRichard Henderson     unsigned typemask           : 32;
50*0f4e14c2SRichard Henderson     unsigned flags              : 8;
51*0f4e14c2SRichard Henderson     unsigned nr_in              : 8;
52*0f4e14c2SRichard Henderson     unsigned nr_out             : 8;
53*0f4e14c2SRichard Henderson     TCGCallReturnKind out_kind  : 8;
54*0f4e14c2SRichard Henderson 
55*0f4e14c2SRichard Henderson     /* Maximum physical arguments are constrained by TCG_TYPE_I128. */
56*0f4e14c2SRichard Henderson     TCGCallArgumentLoc in[MAX_CALL_IARGS * (128 / TCG_TARGET_REG_BITS)];
57*0f4e14c2SRichard Henderson } TCGHelperInfo;
58*0f4e14c2SRichard Henderson 
59*0f4e14c2SRichard Henderson #endif /* TCG_HELPER_INFO_H */
60