qemu

FORK: QEMU emulator
git clone https://git.neptards.moe/neptards/qemu.git
Log | Files | Refs | Submodules | LICENSE

helper-head.h (4710B)


      1 /* Helper file for declaring TCG helper functions.
      2    Used by other helper files.
      3 
      4    Targets should use DEF_HELPER_N and DEF_HELPER_FLAGS_N to declare helper
      5    functions.  Names should be specified without the helper_ prefix, and
      6    the return and argument types specified.  3 basic types are understood
      7    (i32, i64 and ptr).  Additional aliases are provided for convenience and
      8    to match the types used by the C helper implementation.
      9 
     10    The target helper.h should be included in all files that use/define
     11    helper functions.  THis will ensure that function prototypes are
     12    consistent.  In addition it should be included an extra two times for
     13    helper.c, defining:
     14     GEN_HELPER 1 to produce op generation functions (gen_helper_*)
     15     GEN_HELPER 2 to do runtime registration helper functions.
     16  */
     17 
     18 #ifndef EXEC_HELPER_HEAD_H
     19 #define EXEC_HELPER_HEAD_H
     20 
     21 #define HELPER(name) glue(helper_, name)
     22 
     23 /* Some types that make sense in C, but not for TCG.  */
     24 #define dh_alias_i32 i32
     25 #define dh_alias_s32 i32
     26 #define dh_alias_int i32
     27 #define dh_alias_i64 i64
     28 #define dh_alias_s64 i64
     29 #define dh_alias_f16 i32
     30 #define dh_alias_f32 i32
     31 #define dh_alias_f64 i64
     32 #define dh_alias_ptr ptr
     33 #define dh_alias_cptr ptr
     34 #define dh_alias_void void
     35 #define dh_alias_noreturn noreturn
     36 #define dh_alias(t) glue(dh_alias_, t)
     37 
     38 #define dh_ctype_i32 uint32_t
     39 #define dh_ctype_s32 int32_t
     40 #define dh_ctype_int int
     41 #define dh_ctype_i64 uint64_t
     42 #define dh_ctype_s64 int64_t
     43 #define dh_ctype_f16 uint32_t
     44 #define dh_ctype_f32 float32
     45 #define dh_ctype_f64 float64
     46 #define dh_ctype_ptr void *
     47 #define dh_ctype_cptr const void *
     48 #define dh_ctype_void void
     49 #define dh_ctype_noreturn G_NORETURN void
     50 #define dh_ctype(t) dh_ctype_##t
     51 
     52 #ifdef NEED_CPU_H
     53 # ifdef TARGET_LONG_BITS
     54 #  if TARGET_LONG_BITS == 32
     55 #   define dh_alias_tl i32
     56 #   define dh_typecode_tl dh_typecode_i32
     57 #  else
     58 #   define dh_alias_tl i64
     59 #   define dh_typecode_tl dh_typecode_i64
     60 #  endif
     61 # endif
     62 # define dh_ctype_tl target_ulong
     63 # define dh_alias_env ptr
     64 # define dh_ctype_env CPUArchState *
     65 # define dh_typecode_env dh_typecode_ptr
     66 #endif
     67 
     68 /* We can't use glue() here because it falls foul of C preprocessor
     69    recursive expansion rules.  */
     70 #define dh_retvar_decl0_void void
     71 #define dh_retvar_decl0_noreturn void
     72 #define dh_retvar_decl0_i32 TCGv_i32 retval
     73 #define dh_retvar_decl0_i64 TCGv_i64 retval
     74 #define dh_retvar_decl0_ptr TCGv_ptr retval
     75 #define dh_retvar_decl0(t) glue(dh_retvar_decl0_, dh_alias(t))
     76 
     77 #define dh_retvar_decl_void
     78 #define dh_retvar_decl_noreturn
     79 #define dh_retvar_decl_i32 TCGv_i32 retval,
     80 #define dh_retvar_decl_i64 TCGv_i64 retval,
     81 #define dh_retvar_decl_ptr TCGv_ptr retval,
     82 #define dh_retvar_decl(t) glue(dh_retvar_decl_, dh_alias(t))
     83 
     84 #define dh_retvar_void NULL
     85 #define dh_retvar_noreturn NULL
     86 #define dh_retvar_i32 tcgv_i32_temp(retval)
     87 #define dh_retvar_i64 tcgv_i64_temp(retval)
     88 #define dh_retvar_ptr tcgv_ptr_temp(retval)
     89 #define dh_retvar(t) glue(dh_retvar_, dh_alias(t))
     90 
     91 #define dh_typecode_void 0
     92 #define dh_typecode_noreturn 0
     93 #define dh_typecode_i32 2
     94 #define dh_typecode_s32 3
     95 #define dh_typecode_i64 4
     96 #define dh_typecode_s64 5
     97 #define dh_typecode_ptr 6
     98 #define dh_typecode_int dh_typecode_s32
     99 #define dh_typecode_f16 dh_typecode_i32
    100 #define dh_typecode_f32 dh_typecode_i32
    101 #define dh_typecode_f64 dh_typecode_i64
    102 #define dh_typecode_cptr dh_typecode_ptr
    103 #define dh_typecode(t) dh_typecode_##t
    104 
    105 #define dh_callflag_i32  0
    106 #define dh_callflag_i64  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_OPC_PARAM_IARGS must be set to n if last entry is DEF_HELPER_FLAGS_n. */
    137 
    138 #endif /* EXEC_HELPER_HEAD_H */