1*d53106c9SRichard Henderson /* SPDX-License-Identifier: GPL-2.0-or-later */ 2*d53106c9SRichard Henderson /* 3*d53106c9SRichard Henderson * Helper file for declaring TCG helper functions. 4*d53106c9SRichard Henderson * This one expands generation functions for tcg opcodes. 5*d53106c9SRichard Henderson * Define HELPER_H for the header file to be expanded, 6*d53106c9SRichard Henderson * and static inline to change from global file scope. 7*d53106c9SRichard Henderson */ 82ef6175aSRichard Henderson 92ef6175aSRichard Henderson #ifndef HELPER_GEN_H 10175de524SMarkus Armbruster #define HELPER_GEN_H 112ef6175aSRichard Henderson 12*d53106c9SRichard Henderson #include "tcg/tcg.h" 13*d53106c9SRichard Henderson #include "tcg/helper-info.h" 14a9c94277SMarkus Armbruster #include "exec/helper-head.h" 152ef6175aSRichard Henderson 162ef6175aSRichard Henderson #define DEF_HELPER_FLAGS_0(name, flags, ret) \ 17*d53106c9SRichard Henderson extern TCGHelperInfo glue(helper_info_, name); \ 182ef6175aSRichard Henderson static inline void glue(gen_helper_, name)(dh_retvar_decl0(ret)) \ 192ef6175aSRichard Henderson { \ 20*d53106c9SRichard Henderson tcg_gen_callN(&glue(helper_info_, name), dh_retvar(ret), 0, NULL); \ 212ef6175aSRichard Henderson } 222ef6175aSRichard Henderson 232ef6175aSRichard Henderson #define DEF_HELPER_FLAGS_1(name, flags, ret, t1) \ 24*d53106c9SRichard Henderson extern TCGHelperInfo glue(helper_info_, name); \ 25011209e1SRichard Henderson static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \ 26011209e1SRichard Henderson dh_arg_decl(t1, 1)) \ 272ef6175aSRichard Henderson { \ 28ae8b75dcSRichard Henderson TCGTemp *args[1] = { dh_arg(t1, 1) }; \ 29*d53106c9SRichard Henderson tcg_gen_callN(&glue(helper_info_, name), dh_retvar(ret), 1, args); \ 302ef6175aSRichard Henderson } 312ef6175aSRichard Henderson 322ef6175aSRichard Henderson #define DEF_HELPER_FLAGS_2(name, flags, ret, t1, t2) \ 33*d53106c9SRichard Henderson extern TCGHelperInfo glue(helper_info_, name); \ 34011209e1SRichard Henderson static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \ 35011209e1SRichard Henderson dh_arg_decl(t1, 1), dh_arg_decl(t2, 2)) \ 362ef6175aSRichard Henderson { \ 37ae8b75dcSRichard Henderson TCGTemp *args[2] = { dh_arg(t1, 1), dh_arg(t2, 2) }; \ 38*d53106c9SRichard Henderson tcg_gen_callN(&glue(helper_info_, name), dh_retvar(ret), 2, args); \ 392ef6175aSRichard Henderson } 402ef6175aSRichard Henderson 412ef6175aSRichard Henderson #define DEF_HELPER_FLAGS_3(name, flags, ret, t1, t2, t3) \ 42*d53106c9SRichard Henderson extern TCGHelperInfo glue(helper_info_, name); \ 43011209e1SRichard Henderson static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \ 44011209e1SRichard Henderson dh_arg_decl(t1, 1), dh_arg_decl(t2, 2), dh_arg_decl(t3, 3)) \ 452ef6175aSRichard Henderson { \ 46ae8b75dcSRichard Henderson TCGTemp *args[3] = { dh_arg(t1, 1), dh_arg(t2, 2), dh_arg(t3, 3) }; \ 47*d53106c9SRichard Henderson tcg_gen_callN(&glue(helper_info_, name), dh_retvar(ret), 3, args); \ 482ef6175aSRichard Henderson } 492ef6175aSRichard Henderson 502ef6175aSRichard Henderson #define DEF_HELPER_FLAGS_4(name, flags, ret, t1, t2, t3, t4) \ 51*d53106c9SRichard Henderson extern TCGHelperInfo glue(helper_info_, name); \ 52011209e1SRichard Henderson static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \ 53011209e1SRichard Henderson dh_arg_decl(t1, 1), dh_arg_decl(t2, 2), \ 54011209e1SRichard Henderson dh_arg_decl(t3, 3), dh_arg_decl(t4, 4)) \ 552ef6175aSRichard Henderson { \ 56ae8b75dcSRichard Henderson TCGTemp *args[4] = { dh_arg(t1, 1), dh_arg(t2, 2), \ 57011209e1SRichard Henderson dh_arg(t3, 3), dh_arg(t4, 4) }; \ 58*d53106c9SRichard Henderson tcg_gen_callN(&glue(helper_info_, name), dh_retvar(ret), 4, args); \ 592ef6175aSRichard Henderson } 602ef6175aSRichard Henderson 612ef6175aSRichard Henderson #define DEF_HELPER_FLAGS_5(name, flags, ret, t1, t2, t3, t4, t5) \ 62*d53106c9SRichard Henderson extern TCGHelperInfo glue(helper_info_, name); \ 632ef6175aSRichard Henderson static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \ 642ef6175aSRichard Henderson dh_arg_decl(t1, 1), dh_arg_decl(t2, 2), dh_arg_decl(t3, 3), \ 652ef6175aSRichard Henderson dh_arg_decl(t4, 4), dh_arg_decl(t5, 5)) \ 662ef6175aSRichard Henderson { \ 67ae8b75dcSRichard Henderson TCGTemp *args[5] = { dh_arg(t1, 1), dh_arg(t2, 2), dh_arg(t3, 3), \ 68011209e1SRichard Henderson dh_arg(t4, 4), dh_arg(t5, 5) }; \ 69*d53106c9SRichard Henderson tcg_gen_callN(&glue(helper_info_, name), dh_retvar(ret), 5, args); \ 702ef6175aSRichard Henderson } 712ef6175aSRichard Henderson 721df3caa9SRichard Henderson #define DEF_HELPER_FLAGS_6(name, flags, ret, t1, t2, t3, t4, t5, t6) \ 73*d53106c9SRichard Henderson extern TCGHelperInfo glue(helper_info_, name); \ 741df3caa9SRichard Henderson static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \ 751df3caa9SRichard Henderson dh_arg_decl(t1, 1), dh_arg_decl(t2, 2), dh_arg_decl(t3, 3), \ 761df3caa9SRichard Henderson dh_arg_decl(t4, 4), dh_arg_decl(t5, 5), dh_arg_decl(t6, 6)) \ 771df3caa9SRichard Henderson { \ 781df3caa9SRichard Henderson TCGTemp *args[6] = { dh_arg(t1, 1), dh_arg(t2, 2), dh_arg(t3, 3), \ 791df3caa9SRichard Henderson dh_arg(t4, 4), dh_arg(t5, 5), dh_arg(t6, 6) }; \ 80*d53106c9SRichard Henderson tcg_gen_callN(&glue(helper_info_, name), dh_retvar(ret), 6, args); \ 811df3caa9SRichard Henderson } 821df3caa9SRichard Henderson 83e6cadf49STaylor Simpson #define DEF_HELPER_FLAGS_7(name, flags, ret, t1, t2, t3, t4, t5, t6, t7)\ 84*d53106c9SRichard Henderson extern TCGHelperInfo glue(helper_info_, name); \ 85e6cadf49STaylor Simpson static inline void glue(gen_helper_, name)(dh_retvar_decl(ret) \ 86e6cadf49STaylor Simpson dh_arg_decl(t1, 1), dh_arg_decl(t2, 2), dh_arg_decl(t3, 3), \ 87e6cadf49STaylor Simpson dh_arg_decl(t4, 4), dh_arg_decl(t5, 5), dh_arg_decl(t6, 6), \ 88e6cadf49STaylor Simpson dh_arg_decl(t7, 7)) \ 89e6cadf49STaylor Simpson { \ 90e6cadf49STaylor Simpson TCGTemp *args[7] = { dh_arg(t1, 1), dh_arg(t2, 2), dh_arg(t3, 3), \ 91e6cadf49STaylor Simpson dh_arg(t4, 4), dh_arg(t5, 5), dh_arg(t6, 6), \ 92e6cadf49STaylor Simpson dh_arg(t7, 7) }; \ 93*d53106c9SRichard Henderson tcg_gen_callN(&glue(helper_info_, name), dh_retvar(ret), 7, args); \ 94e6cadf49STaylor Simpson } 95e6cadf49STaylor Simpson 962ef6175aSRichard Henderson #include "helper.h" 97db647703SPhilippe Mathieu-Daudé #include "accel/tcg/tcg-runtime.h" 98db647703SPhilippe Mathieu-Daudé #include "accel/tcg/plugin-helpers.h" 992ef6175aSRichard Henderson 1002ef6175aSRichard Henderson #undef DEF_HELPER_FLAGS_0 1012ef6175aSRichard Henderson #undef DEF_HELPER_FLAGS_1 1022ef6175aSRichard Henderson #undef DEF_HELPER_FLAGS_2 1032ef6175aSRichard Henderson #undef DEF_HELPER_FLAGS_3 1042ef6175aSRichard Henderson #undef DEF_HELPER_FLAGS_4 1052ef6175aSRichard Henderson #undef DEF_HELPER_FLAGS_5 1061df3caa9SRichard Henderson #undef DEF_HELPER_FLAGS_6 107e6cadf49STaylor Simpson #undef DEF_HELPER_FLAGS_7 1082ef6175aSRichard Henderson 1092ef6175aSRichard Henderson #endif /* HELPER_GEN_H */ 110