xref: /qemu/include/tcg/helper-info.h (revision ed30e7b1)
10f4e14c2SRichard Henderson /*
2669dcb60SMichael Tokarev  * TCG Helper Information Structure
30f4e14c2SRichard Henderson  *
40f4e14c2SRichard Henderson  * Copyright (c) 2023 Linaro Ltd
50f4e14c2SRichard Henderson  *
60f4e14c2SRichard Henderson  * SPDX-License-Identifier: GPL-2.0-or-later
70f4e14c2SRichard Henderson  */
80f4e14c2SRichard Henderson 
90f4e14c2SRichard Henderson #ifndef TCG_HELPER_INFO_H
100f4e14c2SRichard Henderson #define TCG_HELPER_INFO_H
110f4e14c2SRichard Henderson 
120f4e14c2SRichard Henderson #ifdef CONFIG_TCG_INTERPRETER
130f4e14c2SRichard Henderson #include <ffi.h>
140f4e14c2SRichard Henderson #endif
15ed30e7b1SRichard Henderson #include "tcg-target-reg-bits.h"
16ed30e7b1SRichard Henderson 
17ed30e7b1SRichard Henderson #define MAX_CALL_IARGS  7
180f4e14c2SRichard Henderson 
190f4e14c2SRichard Henderson /*
200f4e14c2SRichard Henderson  * Describe the calling convention of a given argument type.
210f4e14c2SRichard Henderson  */
220f4e14c2SRichard Henderson typedef enum {
230f4e14c2SRichard Henderson     TCG_CALL_RET_NORMAL,         /* by registers */
240f4e14c2SRichard Henderson     TCG_CALL_RET_BY_REF,         /* for i128, by reference */
250f4e14c2SRichard Henderson     TCG_CALL_RET_BY_VEC,         /* for i128, by vector register */
260f4e14c2SRichard Henderson } TCGCallReturnKind;
270f4e14c2SRichard Henderson 
280f4e14c2SRichard Henderson typedef enum {
290f4e14c2SRichard Henderson     TCG_CALL_ARG_NORMAL,         /* by registers (continuing onto stack) */
300f4e14c2SRichard Henderson     TCG_CALL_ARG_EVEN,           /* like normal, but skipping odd slots */
310f4e14c2SRichard Henderson     TCG_CALL_ARG_EXTEND,         /* for i32, as a sign/zero-extended i64 */
320f4e14c2SRichard Henderson     TCG_CALL_ARG_EXTEND_U,       /*      ... as a zero-extended i64 */
330f4e14c2SRichard Henderson     TCG_CALL_ARG_EXTEND_S,       /*      ... as a sign-extended i64 */
340f4e14c2SRichard Henderson     TCG_CALL_ARG_BY_REF,         /* for i128, by reference, first */
350f4e14c2SRichard Henderson     TCG_CALL_ARG_BY_REF_N,       /*       ... by reference, subsequent */
360f4e14c2SRichard Henderson } TCGCallArgumentKind;
370f4e14c2SRichard Henderson 
380f4e14c2SRichard Henderson typedef struct TCGCallArgumentLoc {
390f4e14c2SRichard Henderson     TCGCallArgumentKind kind    : 8;
400f4e14c2SRichard Henderson     unsigned arg_slot           : 8;
410f4e14c2SRichard Henderson     unsigned ref_slot           : 8;
420f4e14c2SRichard Henderson     unsigned arg_idx            : 4;
430f4e14c2SRichard Henderson     unsigned tmp_subindex       : 2;
440f4e14c2SRichard Henderson } TCGCallArgumentLoc;
450f4e14c2SRichard Henderson 
46d53106c9SRichard Henderson struct TCGHelperInfo {
470f4e14c2SRichard Henderson     void *func;
480f4e14c2SRichard Henderson     const char *name;
49d53106c9SRichard Henderson 
50d53106c9SRichard Henderson     /* Used with g_once_init_enter. */
510f4e14c2SRichard Henderson #ifdef CONFIG_TCG_INTERPRETER
520f4e14c2SRichard Henderson     ffi_cif *cif;
53d53106c9SRichard Henderson #else
54d53106c9SRichard Henderson     uintptr_t init;
550f4e14c2SRichard Henderson #endif
56d53106c9SRichard Henderson 
570f4e14c2SRichard Henderson     unsigned typemask           : 32;
580f4e14c2SRichard Henderson     unsigned flags              : 8;
590f4e14c2SRichard Henderson     unsigned nr_in              : 8;
600f4e14c2SRichard Henderson     unsigned nr_out             : 8;
610f4e14c2SRichard Henderson     TCGCallReturnKind out_kind  : 8;
620f4e14c2SRichard Henderson 
630f4e14c2SRichard Henderson     /* Maximum physical arguments are constrained by TCG_TYPE_I128. */
640f4e14c2SRichard Henderson     TCGCallArgumentLoc in[MAX_CALL_IARGS * (128 / TCG_TARGET_REG_BITS)];
65d53106c9SRichard Henderson };
660f4e14c2SRichard Henderson 
670f4e14c2SRichard Henderson #endif /* TCG_HELPER_INFO_H */
68