/* * TCG Helper Information Structure * * Copyright (c) 2023 Linaro Ltd * * SPDX-License-Identifier: GPL-2.0-or-later */ #ifndef TCG_HELPER_INFO_H #define TCG_HELPER_INFO_H #ifdef CONFIG_TCG_INTERPRETER #include #endif #include "tcg-target-reg-bits.h" #define MAX_CALL_IARGS 7 /* * Describe the calling convention of a given argument type. */ typedef enum { TCG_CALL_RET_NORMAL, /* by registers */ TCG_CALL_RET_BY_REF, /* for i128, by reference */ TCG_CALL_RET_BY_VEC, /* for i128, by vector register */ } TCGCallReturnKind; typedef enum { TCG_CALL_ARG_NORMAL, /* by registers (continuing onto stack) */ TCG_CALL_ARG_EVEN, /* like normal, but skipping odd slots */ TCG_CALL_ARG_EXTEND, /* for i32, as a sign/zero-extended i64 */ TCG_CALL_ARG_EXTEND_U, /* ... as a zero-extended i64 */ TCG_CALL_ARG_EXTEND_S, /* ... as a sign-extended i64 */ TCG_CALL_ARG_BY_REF, /* for i128, by reference, first */ TCG_CALL_ARG_BY_REF_N, /* ... by reference, subsequent */ } TCGCallArgumentKind; typedef struct TCGCallArgumentLoc { TCGCallArgumentKind kind : 8; unsigned arg_slot : 8; unsigned ref_slot : 8; unsigned arg_idx : 4; unsigned tmp_subindex : 2; } TCGCallArgumentLoc; struct TCGHelperInfo { void *func; const char *name; /* Used with g_once_init_enter. */ #ifdef CONFIG_TCG_INTERPRETER ffi_cif *cif; #else uintptr_t init; #endif unsigned typemask : 32; unsigned flags : 8; unsigned nr_in : 8; unsigned nr_out : 8; TCGCallReturnKind out_kind : 8; /* Maximum physical arguments are constrained by TCG_TYPE_I128. */ TCGCallArgumentLoc in[MAX_CALL_IARGS * (128 / TCG_TARGET_REG_BITS)]; }; #endif /* TCG_HELPER_INFO_H */