@@ -6127,13 +6127,69 @@ wasm_runtime_invoke_native(WASMExecEnv *exec_env, void *func_ptr,
61276127
61286128 ints [n_ints ++ ] = (uint64 )(uintptr_t )exec_env ;
61296129
6130+ #if defined(BH_PLATFORM_DARWIN ) && defined(BUILD_TARGET_AARCH64 )
6131+ uint8 * stack_base = (uint8 * )stacks ;
6132+ uint32 stack_offset = 0 ;
6133+
6134+ #define STK_PUSH_I32 (val ) \
6135+ *(uint32 *)(stack_base + stack_offset) = (uint32)(val); \
6136+ stack_offset += 4
6137+
6138+ #define STK_PUSH_I64 (val ) \
6139+ stack_offset = (stack_offset + 7) & ~7; \
6140+ *(uint64 *)(stack_base + stack_offset) = (uint64)(val); \
6141+ stack_offset += 8
6142+
6143+ #define STK_PUSH_F32 (val ) \
6144+ *(float32 *)(stack_base + stack_offset) = (float32)(val); \
6145+ stack_offset += 4
6146+
6147+ #define STK_PUSH_F64 (val ) \
6148+ stack_offset = (stack_offset + 7) & ~7; \
6149+ *(float64 *)(stack_base + stack_offset) = (float64)(val); \
6150+ stack_offset += 8
6151+
6152+ #define STK_PUSH_PTR (val ) STK_PUSH_I64((uint64)(uintptr_t)(val))
6153+
6154+ #if WASM_ENABLE_SIMD != 0
6155+ #define STK_PUSH_V128 (val ) \
6156+ stack_offset = (stack_offset + 15) & ~15; \
6157+ *(v128 *)(stack_base + stack_offset) = (v128)(val); \
6158+ stack_offset += 16
6159+ #endif
6160+
6161+ #define STK_FINALIZE () (n_stacks = (stack_offset + 7) >> 3)
6162+
6163+ #else
6164+ #define STK_PUSH_I32 (val ) (stacks[n_stacks++] = (uint64)(val))
6165+ #define STK_PUSH_I64 (val ) (stacks[n_stacks++] = (uint64)(val))
6166+ #define STK_PUSH_F32 (val ) (*(float32 *)&stacks[n_stacks++] = (float32)(val))
6167+ #define STK_PUSH_F64 (val ) (*(float64 *)&stacks[n_stacks++] = (float64)(val))
6168+ #define STK_PUSH_PTR (val ) (stacks[n_stacks++] = (uint64)(uintptr_t)(val))
6169+
6170+ #if WASM_ENABLE_SIMD != 0
6171+ #if defined(_WIN32 ) || defined(_WIN32_ )
6172+ #define STK_PUSH_V128 (val ) \
6173+ *(v128 *)&stacks[n_stacks++] = (val); \
6174+ n_stacks++
6175+ #else
6176+ #define STK_PUSH_V128 (val ) \
6177+ *(v128 *)&stacks[n_stacks++] = (v128)(val); \
6178+ n_stacks++
6179+ #endif
6180+ #endif
6181+
6182+ #define STK_FINALIZE ()
6183+ #endif
6184+
61306185 for (i = 0 ; i < func_type -> param_count ; i ++ ) {
61316186 switch (func_type -> types [i ]) {
61326187 case VALUE_TYPE_I32 :
61336188#if WASM_ENABLE_GC == 0 && WASM_ENABLE_REF_TYPES != 0
61346189 case VALUE_TYPE_FUNCREF :
61356190#endif
61366191 {
6192+ bool is_ptr = false;
61376193 arg_i32 = * argv_src ++ ;
61386194 arg_i64 = arg_i32 ;
61396195 if (signature
@@ -6156,6 +6212,7 @@ wasm_runtime_invoke_native(WASMExecEnv *exec_env, void *func_ptr,
61566212
61576213 arg_i64 = (uintptr_t )wasm_runtime_addr_app_to_native (
61586214 module , (uint64 )arg_i32 );
6215+ is_ptr = true;
61596216 }
61606217 else if (signature [i + 1 ] == '$' ) {
61616218 /* param is a string */
@@ -6165,17 +6222,25 @@ wasm_runtime_invoke_native(WASMExecEnv *exec_env, void *func_ptr,
61656222
61666223 arg_i64 = (uintptr_t )wasm_runtime_addr_app_to_native (
61676224 module , (uint64 )arg_i32 );
6225+ is_ptr = true;
61686226 }
61696227 }
61706228 if (n_ints < MAX_REG_INTS )
61716229 ints [n_ints ++ ] = arg_i64 ;
6172- else
6173- stacks [n_stacks ++ ] = arg_i64 ;
6230+ else {
6231+ if (is_ptr ) {
6232+ STK_PUSH_PTR (arg_i64 );
6233+ }
6234+ else {
6235+ STK_PUSH_I32 (arg_i64 );
6236+ }
6237+ }
61746238 break ;
61756239 }
61766240 case VALUE_TYPE_I64 :
61776241#if WASM_ENABLE_MEMORY64 != 0
61786242 {
6243+ bool is_ptr = false;
61796244 arg_i64 = GET_I64_FROM_ADDR (argv_src );
61806245 argv_src += 2 ;
61816246 if (signature && is_memory64 ) {
@@ -6197,6 +6262,7 @@ wasm_runtime_invoke_native(WASMExecEnv *exec_env, void *func_ptr,
61976262
61986263 arg_i64 = (uint64 )wasm_runtime_addr_app_to_native (
61996264 module , arg_i64 );
6265+ is_ptr = true;
62006266 }
62016267 else if (signature [i + 1 ] == '$' ) {
62026268 /* param is a string */
@@ -6206,12 +6272,19 @@ wasm_runtime_invoke_native(WASMExecEnv *exec_env, void *func_ptr,
62066272
62076273 arg_i64 = (uint64 )wasm_runtime_addr_app_to_native (
62086274 module , arg_i64 );
6275+ is_ptr = true;
62096276 }
62106277 }
62116278 if (n_ints < MAX_REG_INTS )
62126279 ints [n_ints ++ ] = arg_i64 ;
6213- else
6214- stacks [n_stacks ++ ] = arg_i64 ;
6280+ else {
6281+ if (is_ptr ) {
6282+ STK_PUSH_PTR (arg_i64 );
6283+ }
6284+ else {
6285+ STK_PUSH_I64 (arg_i64 );
6286+ }
6287+ }
62156288 break ;
62166289 }
62176290#endif
@@ -6237,24 +6310,25 @@ wasm_runtime_invoke_native(WASMExecEnv *exec_env, void *func_ptr,
62376310#endif
62386311 if (n_ints < MAX_REG_INTS )
62396312 ints [n_ints ++ ] = * (uint64 * )argv_src ;
6240- else
6241- stacks [n_stacks ++ ] = * (uint64 * )argv_src ;
6313+ else {
6314+ STK_PUSH_I64 (* (uint64 * )argv_src );
6315+ }
62426316 argv_src += 2 ;
62436317 break ;
62446318 case VALUE_TYPE_F32 :
62456319 if (n_fps < MAX_REG_FLOATS ) {
62466320 * (float32 * )& fps [n_fps ++ ] = * (float32 * )argv_src ++ ;
62476321 }
62486322 else {
6249- * ( float32 * ) & stacks [ n_stacks ++ ] = * (float32 * )argv_src ++ ;
6323+ STK_PUSH_F32 ( * (float32 * )argv_src ++ ) ;
62506324 }
62516325 break ;
62526326 case VALUE_TYPE_F64 :
62536327 if (n_fps < MAX_REG_FLOATS ) {
62546328 * (float64 * )& fps [n_fps ++ ] = * (float64 * )argv_src ;
62556329 }
62566330 else {
6257- * ( float64 * ) & stacks [ n_stacks ++ ] = * (float64 * )argv_src ;
6331+ STK_PUSH_F64 ( * (float64 * )argv_src ) ;
62586332 }
62596333 argv_src += 2 ;
62606334 break ;
@@ -6265,8 +6339,9 @@ wasm_runtime_invoke_native(WASMExecEnv *exec_env, void *func_ptr,
62656339 if (is_aot_func ) {
62666340 if (n_ints < MAX_REG_INTS )
62676341 ints [n_ints ++ ] = externref_idx ;
6268- else
6269- stacks [n_stacks ++ ] = externref_idx ;
6342+ else {
6343+ STK_PUSH_I32 (externref_idx );
6344+ }
62706345 }
62716346 else {
62726347 void * externref_obj ;
@@ -6276,8 +6351,9 @@ wasm_runtime_invoke_native(WASMExecEnv *exec_env, void *func_ptr,
62766351
62776352 if (n_ints < MAX_REG_INTS )
62786353 ints [n_ints ++ ] = (uintptr_t )externref_obj ;
6279- else
6280- stacks [n_stacks ++ ] = (uintptr_t )externref_obj ;
6354+ else {
6355+ STK_PUSH_PTR (externref_obj );
6356+ }
62816357 }
62826358 break ;
62836359 }
@@ -6288,8 +6364,7 @@ wasm_runtime_invoke_native(WASMExecEnv *exec_env, void *func_ptr,
62886364 * (v128 * )& fps [n_fps ++ ] = * (v128 * )argv_src ;
62896365 }
62906366 else {
6291- * (v128 * )& stacks [n_stacks ++ ] = * (v128 * )argv_src ;
6292- n_stacks ++ ;
6367+ STK_PUSH_V128 (* (v128 * )argv_src );
62936368 }
62946369 argv_src += 4 ;
62956370 break ;
@@ -6304,11 +6379,24 @@ wasm_runtime_invoke_native(WASMExecEnv *exec_env, void *func_ptr,
63046379 for (i = 0 ; i < ext_ret_count ; i ++ ) {
63056380 if (n_ints < MAX_REG_INTS )
63066381 ints [n_ints ++ ] = * (uint64 * )argv_src ;
6307- else
6308- stacks [n_stacks ++ ] = * (uint64 * )argv_src ;
6382+ else {
6383+ STK_PUSH_PTR (* (uint64 * )argv_src );
6384+ }
63096385 argv_src += 2 ;
63106386 }
63116387
6388+ STK_FINALIZE ();
6389+
6390+ #undef STK_PUSH_I32
6391+ #undef STK_PUSH_I64
6392+ #undef STK_PUSH_F32
6393+ #undef STK_PUSH_F64
6394+ #undef STK_PUSH_PTR
6395+ #if WASM_ENABLE_SIMD != 0
6396+ #undef STK_PUSH_V128
6397+ #endif
6398+ #undef STK_FINALIZE
6399+
63126400 exec_env -> attachment = attachment ;
63136401 if (result_count == 0 ) {
63146402 invokeNative_Void (func_ptr , argv1 , n_stacks );
0 commit comments