1 /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 /* 3 * Helper file for declaring TCG helper functions. 4 * This one expands generation functions for tcg opcodes. 5 * Define HELPER_H for the header file to be expanded, 6 * and static inline to change from global file scope. 7 */ 8 9 #ifndef HELPER_GEN_H 10 #define HELPER_GEN_H 11 12 #include "tcg/tcg.h" 13 #include "tcg/helper-info.h" 14 #include "exec/helper-head.h" 15 16 #define DEF_HELPER_FLAGS_0(name, flags, ret) \ 17 extern TCGHelperInfo glue(helper_info_, name); \ 18 static inline void glue(gen_helper_, name)(dh_retvar_decl0(ret)) \ 19 { \ 20 tcg_gen_callN(&glue(helper_info_, name), dh_retvar(ret), 0, NULL); \ 21 } 22 23 #define DEF_HELPER_FLAGS_1(name, flags, ret, t1) \ 24 extern TCGHelperInfo glue(helper_info_, name); \ 25 static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \ 26 dh_arg_decl(t1, 1)) \ 27 { \ 28 TCGTemp *args[1] = { dh_arg(t1, 1) }; \ 29 tcg_gen_callN(&glue(helper_info_, name), dh_retvar(ret), 1, args); \ 30 } 31 32 #define DEF_HELPER_FLAGS_2(name, flags, ret, t1, t2) \ 33 extern TCGHelperInfo glue(helper_info_, name); \ 34 static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \ 35 dh_arg_decl(t1, 1), dh_arg_decl(t2, 2)) \ 36 { \ 37 TCGTemp *args[2] = { dh_arg(t1, 1), dh_arg(t2, 2) }; \ 38 tcg_gen_callN(&glue(helper_info_, name), dh_retvar(ret), 2, args); \ 39 } 40 41 #define DEF_HELPER_FLAGS_3(name, flags, ret, t1, t2, t3) \ 42 extern TCGHelperInfo glue(helper_info_, name); \ 43 static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \ 44 dh_arg_decl(t1, 1), dh_arg_decl(t2, 2), dh_arg_decl(t3, 3)) \ 45 { \ 46 TCGTemp *args[3] = { dh_arg(t1, 1), dh_arg(t2, 2), dh_arg(t3, 3) }; \ 47 tcg_gen_callN(&glue(helper_info_, name), dh_retvar(ret), 3, args); \ 48 } 49 50 #define DEF_HELPER_FLAGS_4(name, flags, ret, t1, t2, t3, t4) \ 51 extern TCGHelperInfo glue(helper_info_, name); \ 52 static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \ 53 dh_arg_decl(t1, 1), dh_arg_decl(t2, 2), \ 54 dh_arg_decl(t3, 3), dh_arg_decl(t4, 4)) \ 55 { \ 56 TCGTemp *args[4] = { dh_arg(t1, 1), dh_arg(t2, 2), \ 57 dh_arg(t3, 3), dh_arg(t4, 4) }; \ 58 tcg_gen_callN(&glue(helper_info_, name), dh_retvar(ret), 4, args); \ 59 } 60 61 #define DEF_HELPER_FLAGS_5(name, flags, ret, t1, t2, t3, t4, t5) \ 62 extern TCGHelperInfo glue(helper_info_, name); \ 63 static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \ 64 dh_arg_decl(t1, 1), dh_arg_decl(t2, 2), dh_arg_decl(t3, 3), \ 65 dh_arg_decl(t4, 4), dh_arg_decl(t5, 5)) \ 66 { \ 67 TCGTemp *args[5] = { dh_arg(t1, 1), dh_arg(t2, 2), dh_arg(t3, 3), \ 68 dh_arg(t4, 4), dh_arg(t5, 5) }; \ 69 tcg_gen_callN(&glue(helper_info_, name), dh_retvar(ret), 5, args); \ 70 } 71 72 #define DEF_HELPER_FLAGS_6(name, flags, ret, t1, t2, t3, t4, t5, t6) \ 73 extern TCGHelperInfo glue(helper_info_, name); \ 74 static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \ 75 dh_arg_decl(t1, 1), dh_arg_decl(t2, 2), dh_arg_decl(t3, 3), \ 76 dh_arg_decl(t4, 4), dh_arg_decl(t5, 5), dh_arg_decl(t6, 6)) \ 77 { \ 78 TCGTemp *args[6] = { dh_arg(t1, 1), dh_arg(t2, 2), dh_arg(t3, 3), \ 79 dh_arg(t4, 4), dh_arg(t5, 5), dh_arg(t6, 6) }; \ 80 tcg_gen_callN(&glue(helper_info_, name), dh_retvar(ret), 6, args); \ 81 } 82 83 #define DEF_HELPER_FLAGS_7(name, flags, ret, t1, t2, t3, t4, t5, t6, t7)\ 84 extern TCGHelperInfo glue(helper_info_, name); \ 85 static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \ 86 dh_arg_decl(t1, 1), dh_arg_decl(t2, 2), dh_arg_decl(t3, 3), \ 87 dh_arg_decl(t4, 4), dh_arg_decl(t5, 5), dh_arg_decl(t6, 6), \ 88 dh_arg_decl(t7, 7)) \ 89 { \ 90 TCGTemp *args[7] = { dh_arg(t1, 1), dh_arg(t2, 2), dh_arg(t3, 3), \ 91 dh_arg(t4, 4), dh_arg(t5, 5), dh_arg(t6, 6), \ 92 dh_arg(t7, 7) }; \ 93 tcg_gen_callN(&glue(helper_info_, name), dh_retvar(ret), 7, args); \ 94 } 95 96 #include "helper.h" 97 #include "accel/tcg/tcg-runtime.h" 98 #include "accel/tcg/plugin-helpers.h" 99 100 #undef DEF_HELPER_FLAGS_0 101 #undef DEF_HELPER_FLAGS_1 102 #undef DEF_HELPER_FLAGS_2 103 #undef DEF_HELPER_FLAGS_3 104 #undef DEF_HELPER_FLAGS_4 105 #undef DEF_HELPER_FLAGS_5 106 #undef DEF_HELPER_FLAGS_6 107 #undef DEF_HELPER_FLAGS_7 108 109 #endif /* HELPER_GEN_H */ 110