Просмотр исходного кода

Enable quick aot entry when GC is enabled (#3015)

- Set gc func type's quick_aot_entry
- Call quick_aot_entry when hw bound check is disabled
- Declare detailed aot func's prototype inside the quick aot entry
- Remove ret_type in the quick aot entry
- Update docker image
Wenyong Huang 2 лет назад
Родитель
Сommit
4f0551ac25

+ 2 - 2
.github/workflows/spec_test_on_nuttx.yml

@@ -34,13 +34,13 @@ jobs:
     with:
     with:
       os: "ubuntu-22.04"
       os: "ubuntu-22.04"
       arch: "ARM RISCV AArch64"
       arch: "ARM RISCV AArch64"
-      container_image: ghcr.io/no1wudi/nuttx/apache-nuttx-ci-linux:latest
+      container_image: ghcr.io/no1wudi/nuttx/apache-nuttx-ci-linux@sha256:8c4e00b607d4d6d66ba8f51c4544819a616eac69d3a2ac669e2af2150e2eb0f9
 
 
   spec_test_on_qemu:
   spec_test_on_qemu:
     runs-on: ubuntu-latest
     runs-on: ubuntu-latest
     needs: [build_llvm_libraries]
     needs: [build_llvm_libraries]
     container:
     container:
-      image: ghcr.io/no1wudi/nuttx/apache-nuttx-ci-linux:latest
+      image: ghcr.io/no1wudi/nuttx/apache-nuttx-ci-linux@sha256:8c4e00b607d4d6d66ba8f51c4544819a616eac69d3a2ac669e2af2150e2eb0f9
     strategy:
     strategy:
       matrix:
       matrix:
         target_config: [
         target_config: [

+ 5 - 0
core/iwasm/aot/aot_loader.c

@@ -1677,6 +1677,11 @@ load_types(const uint8 **p_buf, const uint8 *buf_end, AOTModule *module,
             func_type->param_cell_num = param_cell_num;
             func_type->param_cell_num = param_cell_num;
             func_type->ret_cell_num = ret_cell_num;
             func_type->ret_cell_num = ret_cell_num;
 
 
+#if WASM_ENABLE_QUICK_AOT_ENTRY != 0
+            func_type->quick_aot_entry =
+                wasm_native_lookup_quick_aot_entry(func_type);
+#endif
+
             LOG_VERBOSE("type %u: func, param count: %d, result count: %d, "
             LOG_VERBOSE("type %u: func, param count: %d, result count: %d, "
                         "ref type map count: %d",
                         "ref type map count: %d",
                         i, param_count, result_count, ref_type_map_count);
                         i, param_count, result_count, ref_type_map_count);

+ 24 - 9
core/iwasm/aot/aot_runtime.c

@@ -2049,14 +2049,10 @@ invoke_native_with_hw_bound_check(WASMExecEnv *exec_env, void *func_ptr,
 #if WASM_ENABLE_QUICK_AOT_ENTRY != 0
 #if WASM_ENABLE_QUICK_AOT_ENTRY != 0
         /* Quick call if the quick aot entry is registered */
         /* Quick call if the quick aot entry is registered */
         if (!signature && func_type->quick_aot_entry) {
         if (!signature && func_type->quick_aot_entry) {
-            void (*invoke_native)(
-                void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-                uint32 *argv_ret) = func_type->quick_aot_entry;
-            invoke_native(func_ptr,
-                          func_type->result_count > 0
-                              ? func_type->types[func_type->param_count]
-                              : VALUE_TYPE_VOID,
-                          exec_env, argv, argv_ret);
+            void (*invoke_native)(void *func_ptr, void *exec_env, uint32 *argv,
+                                  uint32 *argv_ret) =
+                func_type->quick_aot_entry;
+            invoke_native(func_ptr, exec_env, argv, argv_ret);
             ret = !aot_copy_exception(module_inst, NULL);
             ret = !aot_copy_exception(module_inst, NULL);
         }
         }
         else
         else
@@ -2095,7 +2091,26 @@ invoke_native_with_hw_bound_check(WASMExecEnv *exec_env, void *func_ptr,
 }
 }
 #define invoke_native_internal invoke_native_with_hw_bound_check
 #define invoke_native_internal invoke_native_with_hw_bound_check
 #else /* else of OS_ENABLE_HW_BOUND_CHECK */
 #else /* else of OS_ENABLE_HW_BOUND_CHECK */
-#define invoke_native_internal wasm_runtime_invoke_native
+static inline bool
+invoke_native_internal(WASMExecEnv *exec_env, void *func_ptr,
+                       const WASMFuncType *func_type, const char *signature,
+                       void *attachment, uint32 *argv, uint32 argc,
+                       uint32 *argv_ret)
+{
+#if WASM_ENABLE_QUICK_AOT_ENTRY != 0
+    /* Quick call if the quick aot entry is registered */
+    if (!signature && func_type->quick_aot_entry) {
+        AOTModuleInstance *module_inst =
+            (AOTModuleInstance *)exec_env->module_inst;
+        void (*invoke_native)(void *func_ptr, void *exec_env, uint32 *argv,
+                              uint32 *argv_ret) = func_type->quick_aot_entry;
+        invoke_native(func_ptr, exec_env, argv, argv_ret);
+        return !aot_copy_exception(module_inst, NULL);
+    }
+#endif
+    return wasm_runtime_invoke_native(exec_env, func_ptr, func_type, signature,
+                                      attachment, argv, argc, argv_ret);
+}
 #endif /* end of OS_ENABLE_HW_BOUND_CHECK */
 #endif /* end of OS_ENABLE_HW_BOUND_CHECK */
 
 
 #ifdef AOT_STACK_FRAME_DEBUG
 #ifdef AOT_STACK_FRAME_DEBUG

+ 387 - 446
core/iwasm/common/wasm_native.c

@@ -629,819 +629,760 @@ wasm_native_destroy()
 
 
 #if WASM_ENABLE_QUICK_AOT_ENTRY != 0
 #if WASM_ENABLE_QUICK_AOT_ENTRY != 0
 static void
 static void
-invoke_no_args_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-                 uint32 *argv_ret)
+invoke_no_args_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
+    void (*native_code)(WASMExecEnv *) = func_ptr;
     native_code(exec_env);
     native_code(exec_env);
 }
 }
 static void
 static void
-invoke_no_args_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-                 uint32 *argv_ret)
+invoke_no_args_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
+    int32 (*native_code)(WASMExecEnv *) = func_ptr;
     argv_ret[0] = native_code(exec_env);
     argv_ret[0] = native_code(exec_env);
 }
 }
 static void
 static void
-invoke_no_args_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-                 uint32 *argv_ret)
+invoke_no_args_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret = native_code(exec_env);
+    int64 (*native_code)(WASMExecEnv *) = func_ptr;
+    int64 ret = native_code(exec_env);
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_i_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-           uint32 *argv_ret)
+invoke_i_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
+    void (*native_code)(WASMExecEnv *, int32) = func_ptr;
     native_code(exec_env, argv[0]);
     native_code(exec_env, argv[0]);
 }
 }
 static void
 static void
-invoke_i_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-           uint32 *argv_ret)
+invoke_i_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
+    int32 (*native_code)(WASMExecEnv *, int32) = func_ptr;
     argv_ret[0] = native_code(exec_env, argv[0]);
     argv_ret[0] = native_code(exec_env, argv[0]);
 }
 }
 static void
 static void
-invoke_i_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-           uint32 *argv_ret)
+invoke_i_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret = native_code(exec_env, argv[0]);
+    int64 (*native_code)(WASMExecEnv *, int32) = func_ptr;
+    int64 ret = native_code(exec_env, argv[0]);
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_I_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-           uint32 *argv_ret)
+invoke_I_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
-    native_code(exec_env, GET_I64_FROM_ADDR(argv));
+    void (*native_code)(WASMExecEnv *, int64) = func_ptr;
+    native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv));
 }
 }
 static void
 static void
-invoke_I_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-           uint32 *argv_ret)
+invoke_I_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
-    argv_ret[0] = native_code(exec_env, GET_I64_FROM_ADDR(argv));
+    int32 (*native_code)(WASMExecEnv *, int64) = func_ptr;
+    argv_ret[0] = native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv));
 }
 }
 static void
 static void
-invoke_I_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-           uint32 *argv_ret)
+invoke_I_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret = native_code(exec_env, GET_I64_FROM_ADDR(argv));
+    int64 (*native_code)(WASMExecEnv *, int64) = func_ptr;
+    int64 ret = native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv));
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_ii_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-            uint32 *argv_ret)
+invoke_ii_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
+    void (*native_code)(WASMExecEnv *, int32, int32) = func_ptr;
     native_code(exec_env, argv[0], argv[1]);
     native_code(exec_env, argv[0], argv[1]);
 }
 }
 static void
 static void
-invoke_ii_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-            uint32 *argv_ret)
+invoke_ii_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
+    int32 (*native_code)(WASMExecEnv *, int32, int32) = func_ptr;
     argv_ret[0] = native_code(exec_env, argv[0], argv[1]);
     argv_ret[0] = native_code(exec_env, argv[0], argv[1]);
 }
 }
 static void
 static void
-invoke_ii_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-            uint32 *argv_ret)
+invoke_ii_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret = native_code(exec_env, argv[0], argv[1]);
+    int64 (*native_code)(WASMExecEnv *, int32, int32) = func_ptr;
+    int64 ret = native_code(exec_env, argv[0], argv[1]);
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_iI_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-            uint32 *argv_ret)
+invoke_iI_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
-    native_code(exec_env, argv[0], GET_I64_FROM_ADDR(argv + 1));
+    void (*native_code)(WASMExecEnv *, int32, int64) = func_ptr;
+    native_code(exec_env, argv[0], GET_I64_FROM_ADDR((uint32 *)argv + 1));
 }
 }
 static void
 static void
-invoke_iI_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-            uint32 *argv_ret)
+invoke_iI_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
-    argv_ret[0] = native_code(exec_env, argv[0], GET_I64_FROM_ADDR(argv + 1));
+    int32 (*native_code)(WASMExecEnv *, int32, int64) = func_ptr;
+    argv_ret[0] =
+        native_code(exec_env, argv[0], GET_I64_FROM_ADDR((uint32 *)argv + 1));
 }
 }
 static void
 static void
-invoke_iI_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-            uint32 *argv_ret)
+invoke_iI_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret = native_code(exec_env, argv[0], GET_I64_FROM_ADDR(argv + 1));
+    int64 (*native_code)(WASMExecEnv *, int32, int64) = func_ptr;
+    int64 ret =
+        native_code(exec_env, argv[0], GET_I64_FROM_ADDR((uint32 *)argv + 1));
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_Ii_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-            uint32 *argv_ret)
+invoke_Ii_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
-    native_code(exec_env, GET_I64_FROM_ADDR(argv), argv[2]);
+    void (*native_code)(WASMExecEnv *, int64, int32) = func_ptr;
+    native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv), argv[2]);
 }
 }
 static void
 static void
-invoke_Ii_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-            uint32 *argv_ret)
+invoke_Ii_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
-    argv_ret[0] = native_code(exec_env, GET_I64_FROM_ADDR(argv), argv[2]);
+    int32 (*native_code)(WASMExecEnv *, int64, int32) = func_ptr;
+    argv_ret[0] =
+        native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv), argv[2]);
 }
 }
 static void
 static void
-invoke_Ii_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-            uint32 *argv_ret)
+invoke_Ii_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret = native_code(exec_env, GET_I64_FROM_ADDR(argv), argv[2]);
+    int64 (*native_code)(WASMExecEnv *, int64, int32) = func_ptr;
+    int64 ret =
+        native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv), argv[2]);
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_II_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-            uint32 *argv_ret)
+invoke_II_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
-    native_code(exec_env, GET_I64_FROM_ADDR(argv), GET_I64_FROM_ADDR(argv + 2));
+    void (*native_code)(WASMExecEnv *, int64, int64) = func_ptr;
+    native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv),
+                GET_I64_FROM_ADDR((uint32 *)argv + 2));
 }
 }
 static void
 static void
-invoke_II_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-            uint32 *argv_ret)
+invoke_II_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
-    argv_ret[0] = native_code(exec_env, GET_I64_FROM_ADDR(argv),
-                              GET_I64_FROM_ADDR(argv + 2));
+    int32 (*native_code)(WASMExecEnv *, int64, int64) = func_ptr;
+    argv_ret[0] = native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv),
+                              GET_I64_FROM_ADDR((uint32 *)argv + 2));
 }
 }
 static void
 static void
-invoke_II_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-            uint32 *argv_ret)
+invoke_II_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret = native_code(exec_env, GET_I64_FROM_ADDR(argv),
-                             GET_I64_FROM_ADDR(argv + 2));
+    int64 (*native_code)(WASMExecEnv *, int64, int64) = func_ptr;
+    int64 ret = native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv),
+                            GET_I64_FROM_ADDR((uint32 *)argv + 2));
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_iii_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-             uint32 *argv_ret)
+invoke_iii_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
+    void (*native_code)(WASMExecEnv *, int32, int32, int32) = func_ptr;
     native_code(exec_env, argv[0], argv[1], argv[2]);
     native_code(exec_env, argv[0], argv[1], argv[2]);
 }
 }
 static void
 static void
-invoke_iii_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-             uint32 *argv_ret)
+invoke_iii_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
+    int32 (*native_code)(WASMExecEnv *, int32, int32, int32) = func_ptr;
     argv_ret[0] = native_code(exec_env, argv[0], argv[1], argv[2]);
     argv_ret[0] = native_code(exec_env, argv[0], argv[1], argv[2]);
 }
 }
 static void
 static void
-invoke_iii_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-             uint32 *argv_ret)
+invoke_iii_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret = native_code(exec_env, argv[0], argv[1], argv[2]);
+    int64 (*native_code)(WASMExecEnv *, int32, int32, int32) = func_ptr;
+    int64 ret = native_code(exec_env, argv[0], argv[1], argv[2]);
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_iiI_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-             uint32 *argv_ret)
+invoke_iiI_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
-    native_code(exec_env, argv[0], argv[1], GET_I64_FROM_ADDR(argv + 2));
+    void (*native_code)(WASMExecEnv *, int32, int32, int64) = func_ptr;
+    native_code(exec_env, argv[0], argv[1],
+                GET_I64_FROM_ADDR((uint32 *)argv + 2));
 }
 }
 static void
 static void
-invoke_iiI_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-             uint32 *argv_ret)
+invoke_iiI_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
-    argv_ret[0] =
-        native_code(exec_env, argv[0], argv[1], GET_I64_FROM_ADDR(argv + 2));
+    int32 (*native_code)(WASMExecEnv *, int32, int32, int64) = func_ptr;
+    argv_ret[0] = native_code(exec_env, argv[0], argv[1],
+                              GET_I64_FROM_ADDR((uint32 *)argv + 2));
 }
 }
 static void
 static void
-invoke_iiI_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-             uint32 *argv_ret)
+invoke_iiI_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret =
-        native_code(exec_env, argv[0], argv[1], GET_I64_FROM_ADDR(argv + 2));
+    int64 (*native_code)(WASMExecEnv *, int32, int32, int64) = func_ptr;
+    int64 ret = native_code(exec_env, argv[0], argv[1],
+                            GET_I64_FROM_ADDR((uint32 *)argv + 2));
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_iIi_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-             uint32 *argv_ret)
+invoke_iIi_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
-    native_code(exec_env, argv[0], GET_I64_FROM_ADDR(argv + 1), argv[3]);
+    void (*native_code)(WASMExecEnv *, int32, int64, int32) = func_ptr;
+    native_code(exec_env, argv[0], GET_I64_FROM_ADDR((uint32 *)argv + 1),
+                argv[3]);
 }
 }
 static void
 static void
-invoke_iIi_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-             uint32 *argv_ret)
+invoke_iIi_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
-    argv_ret[0] =
-        native_code(exec_env, argv[0], GET_I64_FROM_ADDR(argv + 1), argv[3]);
+    int32 (*native_code)(WASMExecEnv *, int32, int64, int32) = func_ptr;
+    argv_ret[0] = native_code(exec_env, argv[0],
+                              GET_I64_FROM_ADDR((uint32 *)argv + 1), argv[3]);
 }
 }
 static void
 static void
-invoke_iIi_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-             uint32 *argv_ret)
+invoke_iIi_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret =
-        native_code(exec_env, argv[0], GET_I64_FROM_ADDR(argv + 1), argv[3]);
+    int64 (*native_code)(WASMExecEnv *, int32, int64, int32) = func_ptr;
+    int64 ret = native_code(exec_env, argv[0],
+                            GET_I64_FROM_ADDR((uint32 *)argv + 1), argv[3]);
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_iII_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-             uint32 *argv_ret)
+invoke_iII_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
-    native_code(exec_env, argv[0], GET_I64_FROM_ADDR(argv + 1),
-                GET_I64_FROM_ADDR(argv + 3));
+    void (*native_code)(WASMExecEnv *, int32, int64, int64) = func_ptr;
+    native_code(exec_env, argv[0], GET_I64_FROM_ADDR((uint32 *)argv + 1),
+                GET_I64_FROM_ADDR((uint32 *)argv + 3));
 }
 }
 static void
 static void
-invoke_iII_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-             uint32 *argv_ret)
+invoke_iII_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
-    argv_ret[0] = native_code(exec_env, argv[0], GET_I64_FROM_ADDR(argv + 1),
-                              GET_I64_FROM_ADDR(argv + 3));
+    int32 (*native_code)(WASMExecEnv *, int32, int64, int64) = func_ptr;
+    argv_ret[0] =
+        native_code(exec_env, argv[0], GET_I64_FROM_ADDR((uint32 *)argv + 1),
+                    GET_I64_FROM_ADDR((uint32 *)argv + 3));
 }
 }
 static void
 static void
-invoke_iII_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-             uint32 *argv_ret)
+invoke_iII_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret = native_code(exec_env, argv[0], GET_I64_FROM_ADDR(argv + 1),
-                             GET_I64_FROM_ADDR(argv + 3));
+    int64 (*native_code)(WASMExecEnv *, int32, int64, int64) = func_ptr;
+    int64 ret =
+        native_code(exec_env, argv[0], GET_I64_FROM_ADDR((uint32 *)argv + 1),
+                    GET_I64_FROM_ADDR((uint32 *)argv + 3));
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_Iii_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-             uint32 *argv_ret)
+invoke_Iii_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
-    native_code(exec_env, GET_I64_FROM_ADDR(argv), argv[2], argv[3]);
+    void (*native_code)(WASMExecEnv *, int64, int32, int32) = func_ptr;
+    native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv), argv[2], argv[3]);
 }
 }
 static void
 static void
-invoke_Iii_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-             uint32 *argv_ret)
+invoke_Iii_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
-    argv_ret[0] =
-        native_code(exec_env, GET_I64_FROM_ADDR(argv), argv[2], argv[3]);
+    int32 (*native_code)(WASMExecEnv *, int64, int32, int32) = func_ptr;
+    argv_ret[0] = native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv),
+                              argv[2], argv[3]);
 }
 }
 static void
 static void
-invoke_Iii_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-             uint32 *argv_ret)
+invoke_Iii_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret =
-        native_code(exec_env, GET_I64_FROM_ADDR(argv), argv[2], argv[3]);
+    int64 (*native_code)(WASMExecEnv *, int64, int32, int32) = func_ptr;
+    int64 ret = native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv),
+                            argv[2], argv[3]);
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_IiI_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-             uint32 *argv_ret)
+invoke_IiI_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
-    native_code(exec_env, GET_I64_FROM_ADDR(argv), argv[2],
-                GET_I64_FROM_ADDR(argv + 3));
+    void (*native_code)(WASMExecEnv *, int64, int32, int64) = func_ptr;
+    native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv), argv[2],
+                GET_I64_FROM_ADDR((uint32 *)argv + 3));
 }
 }
 static void
 static void
-invoke_IiI_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-             uint32 *argv_ret)
+invoke_IiI_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
-    argv_ret[0] = native_code(exec_env, GET_I64_FROM_ADDR(argv), argv[2],
-                              GET_I64_FROM_ADDR(argv + 3));
+    int32 (*native_code)(WASMExecEnv *, int64, int32, int64) = func_ptr;
+    argv_ret[0] = native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv),
+                              argv[2], GET_I64_FROM_ADDR((uint32 *)argv + 3));
 }
 }
 static void
 static void
-invoke_IiI_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-             uint32 *argv_ret)
+invoke_IiI_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret = native_code(exec_env, GET_I64_FROM_ADDR(argv), argv[2],
-                             GET_I64_FROM_ADDR(argv + 3));
+    int64 (*native_code)(WASMExecEnv *, int64, int32, int64) = func_ptr;
+    int64 ret = native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv),
+                            argv[2], GET_I64_FROM_ADDR((uint32 *)argv + 3));
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_IIi_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-             uint32 *argv_ret)
+invoke_IIi_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
-    native_code(exec_env, GET_I64_FROM_ADDR(argv), GET_I64_FROM_ADDR(argv + 2),
-                argv[4]);
+    void (*native_code)(WASMExecEnv *, int64, int64, int32) = func_ptr;
+    native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv),
+                GET_I64_FROM_ADDR((uint32 *)argv + 2), argv[4]);
 }
 }
 static void
 static void
-invoke_IIi_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-             uint32 *argv_ret)
+invoke_IIi_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
-    argv_ret[0] = native_code(exec_env, GET_I64_FROM_ADDR(argv),
-                              GET_I64_FROM_ADDR(argv + 2), argv[4]);
+    int32 (*native_code)(WASMExecEnv *, int64, int64, int32) = func_ptr;
+    argv_ret[0] = native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv),
+                              GET_I64_FROM_ADDR((uint32 *)argv + 2), argv[4]);
 }
 }
 static void
 static void
-invoke_IIi_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-             uint32 *argv_ret)
+invoke_IIi_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret = native_code(exec_env, GET_I64_FROM_ADDR(argv),
-                             GET_I64_FROM_ADDR(argv + 2), argv[4]);
+    int64 (*native_code)(WASMExecEnv *, int64, int64, int32) = func_ptr;
+    int64 ret = native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv),
+                            GET_I64_FROM_ADDR((uint32 *)argv + 2), argv[4]);
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_III_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-             uint32 *argv_ret)
+invoke_III_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
-    native_code(exec_env, GET_I64_FROM_ADDR(argv), GET_I64_FROM_ADDR(argv + 2),
-                GET_I64_FROM_ADDR(argv + 4));
+    void (*native_code)(WASMExecEnv *, int64, int64, int64) = func_ptr;
+    native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv),
+                GET_I64_FROM_ADDR((uint32 *)argv + 2),
+                GET_I64_FROM_ADDR((uint32 *)argv + 4));
 }
 }
 static void
 static void
-invoke_III_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-             uint32 *argv_ret)
+invoke_III_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
-    argv_ret[0] =
-        native_code(exec_env, GET_I64_FROM_ADDR(argv),
-                    GET_I64_FROM_ADDR(argv + 2), GET_I64_FROM_ADDR(argv + 4));
+    int32 (*native_code)(WASMExecEnv *, int64, int64, int64) = func_ptr;
+    argv_ret[0] = native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv),
+                              GET_I64_FROM_ADDR((uint32 *)argv + 2),
+                              GET_I64_FROM_ADDR((uint32 *)argv + 4));
 }
 }
 static void
 static void
-invoke_III_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-             uint32 *argv_ret)
+invoke_III_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret =
-        native_code(exec_env, GET_I64_FROM_ADDR(argv),
-                    GET_I64_FROM_ADDR(argv + 2), GET_I64_FROM_ADDR(argv + 4));
+    int64 (*native_code)(WASMExecEnv *, int64, int64, int64) = func_ptr;
+    int64 ret = native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv),
+                            GET_I64_FROM_ADDR((uint32 *)argv + 2),
+                            GET_I64_FROM_ADDR((uint32 *)argv + 4));
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_iiii_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_iiii_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
+    void (*native_code)(WASMExecEnv *, int32, int32, int32, int32) = func_ptr;
     native_code(exec_env, argv[0], argv[1], argv[2], argv[3]);
     native_code(exec_env, argv[0], argv[1], argv[2], argv[3]);
 }
 }
 static void
 static void
-invoke_iiii_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_iiii_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
+    int32 (*native_code)(WASMExecEnv *, int32, int32, int32, int32) = func_ptr;
     argv_ret[0] = native_code(exec_env, argv[0], argv[1], argv[2], argv[3]);
     argv_ret[0] = native_code(exec_env, argv[0], argv[1], argv[2], argv[3]);
 }
 }
 static void
 static void
-invoke_iiii_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_iiii_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret = native_code(exec_env, argv[0], argv[1], argv[2], argv[3]);
+    int64 (*native_code)(WASMExecEnv *, int32, int32, int32, int32) = func_ptr;
+    int64 ret = native_code(exec_env, argv[0], argv[1], argv[2], argv[3]);
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_iiiI_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_iiiI_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
+    void (*native_code)(WASMExecEnv *, int32, int32, int32, int64) = func_ptr;
     native_code(exec_env, argv[0], argv[1], argv[2],
     native_code(exec_env, argv[0], argv[1], argv[2],
-                GET_I64_FROM_ADDR(argv + 3));
+                GET_I64_FROM_ADDR((uint32 *)argv + 3));
 }
 }
 static void
 static void
-invoke_iiiI_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_iiiI_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
+    int32 (*native_code)(WASMExecEnv *, int32, int32, int32, int64) = func_ptr;
     argv_ret[0] = native_code(exec_env, argv[0], argv[1], argv[2],
     argv_ret[0] = native_code(exec_env, argv[0], argv[1], argv[2],
-                              GET_I64_FROM_ADDR(argv + 3));
+                              GET_I64_FROM_ADDR((uint32 *)argv + 3));
 }
 }
 static void
 static void
-invoke_iiiI_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_iiiI_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret = native_code(exec_env, argv[0], argv[1], argv[2],
-                             GET_I64_FROM_ADDR(argv + 3));
+    int64 (*native_code)(WASMExecEnv *, int32, int32, int32, int64) = func_ptr;
+    int64 ret = native_code(exec_env, argv[0], argv[1], argv[2],
+                            GET_I64_FROM_ADDR((uint32 *)argv + 3));
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_iiIi_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_iiIi_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
-    native_code(exec_env, argv[0], argv[1], GET_I64_FROM_ADDR(argv + 2),
-                argv[4]);
+    void (*native_code)(WASMExecEnv *, int32, int32, int64, int32) = func_ptr;
+    native_code(exec_env, argv[0], argv[1],
+                GET_I64_FROM_ADDR((uint32 *)argv + 2), argv[4]);
 }
 }
 static void
 static void
-invoke_iiIi_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_iiIi_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
+    int32 (*native_code)(WASMExecEnv *, int32, int32, int64, int32) = func_ptr;
     argv_ret[0] = native_code(exec_env, argv[0], argv[1],
     argv_ret[0] = native_code(exec_env, argv[0], argv[1],
-                              GET_I64_FROM_ADDR(argv + 2), argv[4]);
+                              GET_I64_FROM_ADDR((uint32 *)argv + 2), argv[4]);
 }
 }
 static void
 static void
-invoke_iiIi_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_iiIi_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret = native_code(exec_env, argv[0], argv[1],
-                             GET_I64_FROM_ADDR(argv + 2), argv[4]);
+    int64 (*native_code)(WASMExecEnv *, int32, int32, int64, int32) = func_ptr;
+    int64 ret = native_code(exec_env, argv[0], argv[1],
+                            GET_I64_FROM_ADDR((uint32 *)argv + 2), argv[4]);
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_iiII_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_iiII_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
-    native_code(exec_env, argv[0], argv[1], GET_I64_FROM_ADDR(argv + 2),
-                GET_I64_FROM_ADDR(argv + 4));
+    void (*native_code)(WASMExecEnv *, int32, int32, int64, int64) = func_ptr;
+    native_code(exec_env, argv[0], argv[1],
+                GET_I64_FROM_ADDR((uint32 *)argv + 2),
+                GET_I64_FROM_ADDR((uint32 *)argv + 4));
 }
 }
 static void
 static void
-invoke_iiII_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_iiII_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
-    argv_ret[0] =
-        native_code(exec_env, argv[0], argv[1], GET_I64_FROM_ADDR(argv + 2),
-                    GET_I64_FROM_ADDR(argv + 4));
+    int32 (*native_code)(WASMExecEnv *, int32, int32, int64, int64) = func_ptr;
+    argv_ret[0] = native_code(exec_env, argv[0], argv[1],
+                              GET_I64_FROM_ADDR((uint32 *)argv + 2),
+                              GET_I64_FROM_ADDR((uint32 *)argv + 4));
 }
 }
 static void
 static void
-invoke_iiII_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_iiII_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret =
-        native_code(exec_env, argv[0], argv[1], GET_I64_FROM_ADDR(argv + 2),
-                    GET_I64_FROM_ADDR(argv + 4));
+    int64 (*native_code)(WASMExecEnv *, int32, int32, int64, int64) = func_ptr;
+    int64 ret = native_code(exec_env, argv[0], argv[1],
+                            GET_I64_FROM_ADDR((uint32 *)argv + 2),
+                            GET_I64_FROM_ADDR((uint32 *)argv + 4));
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_iIii_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_iIii_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
-    native_code(exec_env, argv[0], GET_I64_FROM_ADDR(argv + 1), argv[3],
-                argv[4]);
+    void (*native_code)(WASMExecEnv *, int32, int64, int32, int32) = func_ptr;
+    native_code(exec_env, argv[0], GET_I64_FROM_ADDR((uint32 *)argv + 1),
+                argv[3], argv[4]);
 }
 }
 static void
 static void
-invoke_iIii_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_iIii_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
-    argv_ret[0] = native_code(exec_env, argv[0], GET_I64_FROM_ADDR(argv + 1),
-                              argv[3], argv[4]);
+    int32 (*native_code)(WASMExecEnv *, int32, int64, int32, int32) = func_ptr;
+    argv_ret[0] =
+        native_code(exec_env, argv[0], GET_I64_FROM_ADDR((uint32 *)argv + 1),
+                    argv[3], argv[4]);
 }
 }
 static void
 static void
-invoke_iIii_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_iIii_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret = native_code(exec_env, argv[0], GET_I64_FROM_ADDR(argv + 1),
-                             argv[3], argv[4]);
+    int64 (*native_code)(WASMExecEnv *, int32, int64, int32, int32) = func_ptr;
+    int64 ret =
+        native_code(exec_env, argv[0], GET_I64_FROM_ADDR((uint32 *)argv + 1),
+                    argv[3], argv[4]);
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_iIiI_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_iIiI_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
-    native_code(exec_env, argv[0], GET_I64_FROM_ADDR(argv + 1), argv[3],
-                GET_I64_FROM_ADDR(argv + 4));
+    void (*native_code)(WASMExecEnv *, int32, int64, int32, int64) = func_ptr;
+    native_code(exec_env, argv[0], GET_I64_FROM_ADDR((uint32 *)argv + 1),
+                argv[3], GET_I64_FROM_ADDR((uint32 *)argv + 4));
 }
 }
 static void
 static void
-invoke_iIiI_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_iIiI_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
-    argv_ret[0] = native_code(exec_env, argv[0], GET_I64_FROM_ADDR(argv + 1),
-                              argv[3], GET_I64_FROM_ADDR(argv + 4));
+    int32 (*native_code)(WASMExecEnv *, int32, int64, int32, int64) = func_ptr;
+    argv_ret[0] =
+        native_code(exec_env, argv[0], GET_I64_FROM_ADDR((uint32 *)argv + 1),
+                    argv[3], GET_I64_FROM_ADDR((uint32 *)argv + 4));
 }
 }
 static void
 static void
-invoke_iIiI_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_iIiI_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret = native_code(exec_env, argv[0], GET_I64_FROM_ADDR(argv + 1),
-                             argv[3], GET_I64_FROM_ADDR(argv + 4));
+    int64 (*native_code)(WASMExecEnv *, int32, int64, int32, int64) = func_ptr;
+    int64 ret =
+        native_code(exec_env, argv[0], GET_I64_FROM_ADDR((uint32 *)argv + 1),
+                    argv[3], GET_I64_FROM_ADDR((uint32 *)argv + 4));
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_iIIi_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_iIIi_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
-    native_code(exec_env, argv[0], GET_I64_FROM_ADDR(argv + 1),
-                GET_I64_FROM_ADDR(argv + 3), argv[5]);
+    void (*native_code)(WASMExecEnv *, int32, int64, int64, int32) = func_ptr;
+    native_code(exec_env, argv[0], GET_I64_FROM_ADDR((uint32 *)argv + 1),
+                GET_I64_FROM_ADDR((uint32 *)argv + 3), argv[5]);
 }
 }
 static void
 static void
-invoke_iIIi_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_iIIi_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
-    argv_ret[0] = native_code(exec_env, argv[0], GET_I64_FROM_ADDR(argv + 1),
-                              GET_I64_FROM_ADDR(argv + 3), argv[5]);
+    int32 (*native_code)(WASMExecEnv *, int32, int64, int64, int32) = func_ptr;
+    argv_ret[0] =
+        native_code(exec_env, argv[0], GET_I64_FROM_ADDR((uint32 *)argv + 1),
+                    GET_I64_FROM_ADDR((uint32 *)argv + 3), argv[5]);
 }
 }
 static void
 static void
-invoke_iIIi_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_iIIi_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret = native_code(exec_env, argv[0], GET_I64_FROM_ADDR(argv + 1),
-                             GET_I64_FROM_ADDR(argv + 3), argv[5]);
+    int64 (*native_code)(WASMExecEnv *, int32, int64, int64, int32) = func_ptr;
+    int64 ret =
+        native_code(exec_env, argv[0], GET_I64_FROM_ADDR((uint32 *)argv + 1),
+                    GET_I64_FROM_ADDR((uint32 *)argv + 3), argv[5]);
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_iIII_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_iIII_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
-    native_code(exec_env, argv[0], GET_I64_FROM_ADDR(argv + 1),
-                GET_I64_FROM_ADDR(argv + 3), GET_I64_FROM_ADDR(argv + 5));
+    void (*native_code)(WASMExecEnv *, int32, int64, int64, int64) = func_ptr;
+    native_code(exec_env, argv[0], GET_I64_FROM_ADDR((uint32 *)argv + 1),
+                GET_I64_FROM_ADDR((uint32 *)argv + 3),
+                GET_I64_FROM_ADDR((uint32 *)argv + 5));
 }
 }
 static void
 static void
-invoke_iIII_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_iIII_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
+    int32 (*native_code)(WASMExecEnv *, int32, int64, int64, int64) = func_ptr;
     argv_ret[0] =
     argv_ret[0] =
-        native_code(exec_env, argv[0], GET_I64_FROM_ADDR(argv + 1),
-                    GET_I64_FROM_ADDR(argv + 3), GET_I64_FROM_ADDR(argv + 5));
+        native_code(exec_env, argv[0], GET_I64_FROM_ADDR((uint32 *)argv + 1),
+                    GET_I64_FROM_ADDR((uint32 *)argv + 3),
+                    GET_I64_FROM_ADDR((uint32 *)argv + 5));
 }
 }
 static void
 static void
-invoke_iIII_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_iIII_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret =
-        native_code(exec_env, argv[0], GET_I64_FROM_ADDR(argv + 1),
-                    GET_I64_FROM_ADDR(argv + 3), GET_I64_FROM_ADDR(argv + 5));
+    int64 (*native_code)(WASMExecEnv *, int32, int64, int64, int64) = func_ptr;
+    int64 ret =
+        native_code(exec_env, argv[0], GET_I64_FROM_ADDR((uint32 *)argv + 1),
+                    GET_I64_FROM_ADDR((uint32 *)argv + 3),
+                    GET_I64_FROM_ADDR((uint32 *)argv + 5));
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_Iiii_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_Iiii_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
-    native_code(exec_env, GET_I64_FROM_ADDR(argv), argv[2], argv[3], argv[4]);
+    void (*native_code)(WASMExecEnv *, int64, int32, int32, int32) = func_ptr;
+    native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv), argv[2], argv[3],
+                argv[4]);
 }
 }
 static void
 static void
-invoke_Iiii_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_Iiii_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
-    argv_ret[0] = native_code(exec_env, GET_I64_FROM_ADDR(argv), argv[2],
-                              argv[3], argv[4]);
+    int32 (*native_code)(WASMExecEnv *, int64, int32, int32, int32) = func_ptr;
+    argv_ret[0] = native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv),
+                              argv[2], argv[3], argv[4]);
 }
 }
 static void
 static void
-invoke_Iiii_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_Iiii_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret = native_code(exec_env, GET_I64_FROM_ADDR(argv), argv[2],
-                             argv[3], argv[4]);
+    int64 (*native_code)(WASMExecEnv *, int64, int32, int32, int32) = func_ptr;
+    int64 ret = native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv),
+                            argv[2], argv[3], argv[4]);
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_IiiI_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_IiiI_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
-    native_code(exec_env, GET_I64_FROM_ADDR(argv), argv[2], argv[3],
-                GET_I64_FROM_ADDR(argv + 4));
+    void (*native_code)(WASMExecEnv *, int64, int32, int32, int64) = func_ptr;
+    native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv), argv[2], argv[3],
+                GET_I64_FROM_ADDR((uint32 *)argv + 4));
 }
 }
 
 
 static void
 static void
-invoke_IiiI_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_IiiI_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
-    argv_ret[0] = native_code(exec_env, GET_I64_FROM_ADDR(argv), argv[2],
-                              argv[3], GET_I64_FROM_ADDR(argv + 4));
+    int32 (*native_code)(WASMExecEnv *, int64, int32, int32, int64) = func_ptr;
+    argv_ret[0] =
+        native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv), argv[2],
+                    argv[3], GET_I64_FROM_ADDR((uint32 *)argv + 4));
 }
 }
 
 
 static void
 static void
-invoke_IiiI_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_IiiI_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret = native_code(exec_env, GET_I64_FROM_ADDR(argv), argv[2],
-                             argv[3], GET_I64_FROM_ADDR(argv + 4));
+    int64 (*native_code)(WASMExecEnv *, int64, int32, int32, int64) = func_ptr;
+    int64 ret =
+        native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv), argv[2],
+                    argv[3], GET_I64_FROM_ADDR((uint32 *)argv + 4));
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_IiIi_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_IiIi_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
-    native_code(exec_env, GET_I64_FROM_ADDR(argv), argv[2],
-                GET_I64_FROM_ADDR(argv + 3), argv[5]);
+    void (*native_code)(WASMExecEnv *, int64, int32, int64, int32) = func_ptr;
+    native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv), argv[2],
+                GET_I64_FROM_ADDR((uint32 *)argv + 3), argv[5]);
 }
 }
 static void
 static void
-invoke_IiIi_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_IiIi_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
-    argv_ret[0] = native_code(exec_env, GET_I64_FROM_ADDR(argv), argv[2],
-                              GET_I64_FROM_ADDR(argv + 3), argv[5]);
+    int32 (*native_code)(WASMExecEnv *, int64, int32, int64, int32) = func_ptr;
+    argv_ret[0] =
+        native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv), argv[2],
+                    GET_I64_FROM_ADDR((uint32 *)argv + 3), argv[5]);
 }
 }
 static void
 static void
-invoke_IiIi_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_IiIi_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret = native_code(exec_env, GET_I64_FROM_ADDR(argv), argv[2],
-                             GET_I64_FROM_ADDR(argv + 3), argv[5]);
+    int64 (*native_code)(WASMExecEnv *, int64, int32, int64, int32) = func_ptr;
+    int64 ret =
+        native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv), argv[2],
+                    GET_I64_FROM_ADDR((uint32 *)argv + 3), argv[5]);
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_IiII_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_IiII_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
-    native_code(exec_env, GET_I64_FROM_ADDR(argv), argv[2],
-                GET_I64_FROM_ADDR(argv + 3), GET_I64_FROM_ADDR(argv + 5));
+    void (*native_code)(WASMExecEnv *, int64, int32, int64, int64) = func_ptr;
+    native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv), argv[2],
+                GET_I64_FROM_ADDR((uint32 *)argv + 3),
+                GET_I64_FROM_ADDR((uint32 *)argv + 5));
 }
 }
 static void
 static void
-invoke_IiII_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_IiII_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
-    argv_ret[0] =
-        native_code(exec_env, GET_I64_FROM_ADDR(argv), argv[2],
-                    GET_I64_FROM_ADDR(argv + 3), GET_I64_FROM_ADDR(argv + 5));
+    int32 (*native_code)(WASMExecEnv *, int64, int32, int64, int64) = func_ptr;
+    argv_ret[0] = native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv),
+                              argv[2], GET_I64_FROM_ADDR((uint32 *)argv + 3),
+                              GET_I64_FROM_ADDR((uint32 *)argv + 5));
 }
 }
 static void
 static void
-invoke_IiII_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_IiII_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret =
-        native_code(exec_env, GET_I64_FROM_ADDR(argv), argv[2],
-                    GET_I64_FROM_ADDR(argv + 3), GET_I64_FROM_ADDR(argv + 5));
+    int64 (*native_code)(WASMExecEnv *, int64, int32, int64, int64) = func_ptr;
+    int64 ret = native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv),
+                            argv[2], GET_I64_FROM_ADDR((uint32 *)argv + 3),
+                            GET_I64_FROM_ADDR((uint32 *)argv + 5));
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_IIii_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_IIii_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
-    native_code(exec_env, GET_I64_FROM_ADDR(argv), GET_I64_FROM_ADDR(argv + 2),
-                argv[4], argv[5]);
+    void (*native_code)(WASMExecEnv *, int64, int64, int32, int32) = func_ptr;
+    native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv),
+                GET_I64_FROM_ADDR((uint32 *)argv + 2), argv[4], argv[5]);
 }
 }
 static void
 static void
-invoke_IIii_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_IIii_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
-    argv_ret[0] = native_code(exec_env, GET_I64_FROM_ADDR(argv),
-                              GET_I64_FROM_ADDR(argv + 2), argv[4], argv[5]);
+    int32 (*native_code)(WASMExecEnv *, int64, int64, int32, int32) = func_ptr;
+    argv_ret[0] =
+        native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv),
+                    GET_I64_FROM_ADDR((uint32 *)argv + 2), argv[4], argv[5]);
 }
 }
 static void
 static void
-invoke_IIii_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_IIii_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret = native_code(exec_env, GET_I64_FROM_ADDR(argv),
-                             GET_I64_FROM_ADDR(argv + 2), argv[4], argv[5]);
+    int64 (*native_code)(WASMExecEnv *, int64, int64, int32, int32) = func_ptr;
+    int64 ret =
+        native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv),
+                    GET_I64_FROM_ADDR((uint32 *)argv + 2), argv[4], argv[5]);
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_IIiI_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_IIiI_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
-    native_code(exec_env, GET_I64_FROM_ADDR(argv), GET_I64_FROM_ADDR(argv + 2),
-                argv[4], GET_I64_FROM_ADDR(argv + 5));
+    void (*native_code)(WASMExecEnv *, int64, int64, int32, int64) = func_ptr;
+    native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv),
+                GET_I64_FROM_ADDR((uint32 *)argv + 2), argv[4],
+                GET_I64_FROM_ADDR((uint32 *)argv + 5));
 }
 }
 static void
 static void
-invoke_IIiI_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_IIiI_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
-    argv_ret[0] = native_code(exec_env, GET_I64_FROM_ADDR(argv),
-                              GET_I64_FROM_ADDR(argv + 2), argv[4],
-                              GET_I64_FROM_ADDR(argv + 5));
+    int32 (*native_code)(WASMExecEnv *, int64, int64, int32, int64) = func_ptr;
+    argv_ret[0] = native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv),
+                              GET_I64_FROM_ADDR((uint32 *)argv + 2), argv[4],
+                              GET_I64_FROM_ADDR((uint32 *)argv + 5));
 }
 }
 static void
 static void
-invoke_IIiI_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_IIiI_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret = native_code(exec_env, GET_I64_FROM_ADDR(argv),
-                             GET_I64_FROM_ADDR(argv + 2), argv[4],
-                             GET_I64_FROM_ADDR(argv + 5));
+    int64 (*native_code)(WASMExecEnv *, int64, int64, int32, int64) = func_ptr;
+    int64 ret = native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv),
+                            GET_I64_FROM_ADDR((uint32 *)argv + 2), argv[4],
+                            GET_I64_FROM_ADDR((uint32 *)argv + 5));
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_IIIi_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_IIIi_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
-    native_code(exec_env, GET_I64_FROM_ADDR(argv), GET_I64_FROM_ADDR(argv + 2),
-                GET_I64_FROM_ADDR(argv + 4), argv[6]);
+    void (*native_code)(WASMExecEnv *, int64, int64, int64, int32) = func_ptr;
+    native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv),
+                GET_I64_FROM_ADDR((uint32 *)argv + 2),
+                GET_I64_FROM_ADDR((uint32 *)argv + 4), argv[6]);
 }
 }
 static void
 static void
-invoke_IIIi_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_IIIi_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
-    argv_ret[0] = native_code(exec_env, GET_I64_FROM_ADDR(argv),
-                              GET_I64_FROM_ADDR(argv + 2),
-                              GET_I64_FROM_ADDR(argv + 4), argv[6]);
+    int32 (*native_code)(WASMExecEnv *, int64, int64, int64, int32) = func_ptr;
+    argv_ret[0] = native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv),
+                              GET_I64_FROM_ADDR((uint32 *)argv + 2),
+                              GET_I64_FROM_ADDR((uint32 *)argv + 4), argv[6]);
 }
 }
 static void
 static void
-invoke_IIIi_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_IIIi_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret = native_code(exec_env, GET_I64_FROM_ADDR(argv),
-                             GET_I64_FROM_ADDR(argv + 2),
-                             GET_I64_FROM_ADDR(argv + 4), argv[6]);
+    int64 (*native_code)(WASMExecEnv *, int64, int64, int64, int32) = func_ptr;
+    int64 ret = native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv),
+                            GET_I64_FROM_ADDR((uint32 *)argv + 2),
+                            GET_I64_FROM_ADDR((uint32 *)argv + 4), argv[6]);
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_IIII_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_IIII_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
-    native_code(exec_env, GET_I64_FROM_ADDR(argv), GET_I64_FROM_ADDR(argv + 2),
-                GET_I64_FROM_ADDR(argv + 4), GET_I64_FROM_ADDR(argv + 6));
+    void (*native_code)(WASMExecEnv *, int64, int64, int64, int64) = func_ptr;
+    native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv),
+                GET_I64_FROM_ADDR((uint32 *)argv + 2),
+                GET_I64_FROM_ADDR((uint32 *)argv + 4),
+                GET_I64_FROM_ADDR((uint32 *)argv + 6));
 }
 }
 static void
 static void
-invoke_IIII_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_IIII_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
-    argv_ret[0] = native_code(
-        exec_env, GET_I64_FROM_ADDR(argv), GET_I64_FROM_ADDR(argv + 2),
-        GET_I64_FROM_ADDR(argv + 4), GET_I64_FROM_ADDR(argv + 6));
+    int32 (*native_code)(WASMExecEnv *, int64, int64, int64, int64) = func_ptr;
+    argv_ret[0] = native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv),
+                              GET_I64_FROM_ADDR((uint32 *)argv + 2),
+                              GET_I64_FROM_ADDR((uint32 *)argv + 4),
+                              GET_I64_FROM_ADDR((uint32 *)argv + 6));
 }
 }
 static void
 static void
-invoke_IIII_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-              uint32 *argv_ret)
+invoke_IIII_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret = native_code(
-        exec_env, GET_I64_FROM_ADDR(argv), GET_I64_FROM_ADDR(argv + 2),
-        GET_I64_FROM_ADDR(argv + 4), GET_I64_FROM_ADDR(argv + 6));
+    int64 (*native_code)(WASMExecEnv *, int64, int64, int64, int64) = func_ptr;
+    int64 ret = native_code(exec_env, GET_I64_FROM_ADDR((uint32 *)argv),
+                            GET_I64_FROM_ADDR((uint32 *)argv + 2),
+                            GET_I64_FROM_ADDR((uint32 *)argv + 4),
+                            GET_I64_FROM_ADDR((uint32 *)argv + 6));
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }
 
 
 static void
 static void
-invoke_iiiii_v(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-               uint32 *argv_ret)
+invoke_iiiii_v(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    void (*native_code)() = func_ptr;
+    void (*native_code)(WASMExecEnv *, int32, int32, int32, int32, int32) =
+        func_ptr;
     native_code(exec_env, argv[0], argv[1], argv[2], argv[3], argv[4]);
     native_code(exec_env, argv[0], argv[1], argv[2], argv[3], argv[4]);
 }
 }
 static void
 static void
-invoke_iiiii_i(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-               uint32 *argv_ret)
+invoke_iiiii_i(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint32 (*native_code)() = func_ptr;
+    int32 (*native_code)(WASMExecEnv *, int32, int32, int32, int32, int32) =
+        func_ptr;
     argv_ret[0] =
     argv_ret[0] =
         native_code(exec_env, argv[0], argv[1], argv[2], argv[3], argv[4]);
         native_code(exec_env, argv[0], argv[1], argv[2], argv[3], argv[4]);
 }
 }
 static void
 static void
-invoke_iiiii_I(void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-               uint32 *argv_ret)
+invoke_iiiii_I(void *func_ptr, void *exec_env, int32 *argv, int32 *argv_ret)
 {
 {
-    uint64 (*native_code)() = func_ptr;
-    uint64 ret =
+    int64 (*native_code)(WASMExecEnv *, int32, int32, int32, int32, int32) =
+        func_ptr;
+    int64 ret =
         native_code(exec_env, argv[0], argv[1], argv[2], argv[3], argv[4]);
         native_code(exec_env, argv[0], argv[1], argv[2], argv[3], argv[4]);
     PUT_I64_TO_ADDR(argv_ret, ret);
     PUT_I64_TO_ADDR(argv_ret, ret);
 }
 }

+ 5 - 8
core/iwasm/interpreter/wasm_interp_classic.c

@@ -6361,14 +6361,11 @@ llvm_jit_call_func_bytecode(WASMModuleInstance *module_inst,
 #if WASM_ENABLE_QUICK_AOT_ENTRY != 0
 #if WASM_ENABLE_QUICK_AOT_ENTRY != 0
         /* Quick call if the quick jit entry is registered */
         /* Quick call if the quick jit entry is registered */
         if (func_type->quick_aot_entry) {
         if (func_type->quick_aot_entry) {
-            void (*invoke_native)(
-                void *func_ptr, uint8 ret_type, void *exec_env, uint32 *argv,
-                uint32 *argv_ret) = func_type->quick_aot_entry;
-            invoke_native(module_inst->func_ptrs[func_idx],
-                          func_type->result_count > 0
-                              ? func_type->types[func_type->param_count]
-                              : VALUE_TYPE_VOID,
-                          exec_env, argv, argv);
+            void (*invoke_native)(void *func_ptr, void *exec_env, uint32 *argv,
+                                  uint32 *argv_ret) =
+                func_type->quick_aot_entry;
+            invoke_native(module_inst->func_ptrs[func_idx], exec_env, argv,
+                          argv);
             ret = !wasm_copy_exception(module_inst, NULL);
             ret = !wasm_copy_exception(module_inst, NULL);
         }
         }
         else
         else

+ 4 - 0
core/iwasm/interpreter/wasm_loader.c

@@ -1615,6 +1615,10 @@ resolve_func_type(const uint8 **p_buf, const uint8 *buf_end, WASMModule *module,
     type->param_cell_num = (uint16)param_cell_num;
     type->param_cell_num = (uint16)param_cell_num;
     type->ret_cell_num = (uint16)ret_cell_num;
     type->ret_cell_num = (uint16)ret_cell_num;
 
 
+#if WASM_ENABLE_QUICK_AOT_ENTRY != 0
+    type->quick_aot_entry = wasm_native_lookup_quick_aot_entry(type);
+#endif
+
     /* Calculate the minimal type index of the type equal to this type */
     /* Calculate the minimal type index of the type equal to this type */
     type->min_type_idx_normalized = type_idx;
     type->min_type_idx_normalized = type_idx;
     for (i = 0; i < type_idx; i++) {
     for (i = 0; i < type_idx; i++) {