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 15*ed30e7b1SRichard Henderson #include "tcg-target-reg-bits.h" 16*ed30e7b1SRichard Henderson 17*ed30e7b1SRichard 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