@@ -5843,60 +5843,58 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
58435843 PUT_V128_TO_ADDR (frame_lp + addr_ret , LOAD_V128 (maddr ));
58445844 break ;
58455845 }
5846- #define SIMD_LOAD_OP (simde_func , element_size , num_elements ) \
5847- do { \
5848- uint32 offset, addr; \
5849- offset = read_uint32(frame_ip); \
5850- addr = GET_OPERAND(uint32, I32, 0); \
5851- frame_ip += 2; \
5852- addr_ret = GET_OFFSET(); \
5853- CHECK_MEMORY_OVERFLOW(16); \
5854- \
5855- simde_v128_t simde_result = simde_func(maddr); \
5856- \
5857- V128 result; \
5858- SIMDE_V128_TO_SIMD_V128(simde_result, result); \
5859- PUT_V128_TO_ADDR(frame_lp + addr_ret, result); \
5860- \
5846+ #define SIMD_LOAD_OP (simde_func ) \
5847+ do { \
5848+ uint32 offset, addr; \
5849+ offset = read_uint32(frame_ip); \
5850+ addr = POP_I32(); \
5851+ addr_ret = GET_OFFSET(); \
5852+ CHECK_MEMORY_OVERFLOW(8); \
5853+ \
5854+ simde_v128_t simde_result = simde_func(maddr); \
5855+ \
5856+ V128 result; \
5857+ SIMDE_V128_TO_SIMD_V128(simde_result, result); \
5858+ PUT_V128_TO_ADDR(frame_lp + addr_ret, result); \
5859+ \
58615860 } while (0)
58625861 case SIMD_v128_load8x8_s :
58635862 {
5864- SIMD_LOAD_OP (simde_wasm_i16x8_load8x8 , 16 , 8 );
5863+ SIMD_LOAD_OP (simde_wasm_i16x8_load8x8 );
58655864 break ;
58665865 }
58675866 case SIMD_v128_load8x8_u :
58685867 {
5869- SIMD_LOAD_OP (simde_wasm_u16x8_load8x8 , 16 , 8 );
5868+ SIMD_LOAD_OP (simde_wasm_u16x8_load8x8 );
58705869 break ;
58715870 }
58725871 case SIMD_v128_load16x4_s :
58735872 {
5874- SIMD_LOAD_OP (simde_wasm_i32x4_load16x4 , 32 , 4 );
5873+ SIMD_LOAD_OP (simde_wasm_i32x4_load16x4 );
58755874 break ;
58765875 }
58775876 case SIMD_v128_load16x4_u :
58785877 {
5879- SIMD_LOAD_OP (simde_wasm_u32x4_load16x4 , 32 , 4 );
5878+ SIMD_LOAD_OP (simde_wasm_u32x4_load16x4 );
58805879 break ;
58815880 }
58825881 case SIMD_v128_load32x2_s :
58835882 {
5884- SIMD_LOAD_OP (simde_wasm_i64x2_load32x2 , 64 , 2 );
5883+ SIMD_LOAD_OP (simde_wasm_i64x2_load32x2 );
58855884 break ;
58865885 }
58875886 case SIMD_v128_load32x2_u :
58885887 {
5889- SIMD_LOAD_OP (simde_wasm_u64x2_load32x2 , 64 , 2 );
5888+ SIMD_LOAD_OP (simde_wasm_u64x2_load32x2 );
58905889 break ;
58915890 }
5892- #define SIMD_LOAD_SPLAT_OP (simde_func ) \
5891+ #define SIMD_LOAD_SPLAT_OP (simde_func , width ) \
58935892 do { \
58945893 uint32 offset, addr; \
58955894 offset = read_uint32(frame_ip); \
5896- addr = GET_OPERAND(uint32, I32, 0); \
5897- frame_ip += 2; \
5895+ addr = POP_I32(); \
58985896 addr_ret = GET_OFFSET(); \
5899- CHECK_MEMORY_OVERFLOW(4); \
5897+ CHECK_MEMORY_OVERFLOW(width / 8); \
59005898 \
59015899 simde_v128_t simde_result = simde_func(maddr); \
59025900 \
@@ -5908,22 +5906,22 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
59085906
59095907 case SIMD_v128_load8_splat :
59105908 {
5911- SIMD_LOAD_SPLAT_OP (simde_wasm_v128_load8_splat );
5909+ SIMD_LOAD_SPLAT_OP (simde_wasm_v128_load8_splat , 8 );
59125910 break ;
59135911 }
59145912 case SIMD_v128_load16_splat :
59155913 {
5916- SIMD_LOAD_SPLAT_OP (simde_wasm_v128_load16_splat );
5914+ SIMD_LOAD_SPLAT_OP (simde_wasm_v128_load16_splat , 16 );
59175915 break ;
59185916 }
59195917 case SIMD_v128_load32_splat :
59205918 {
5921- SIMD_LOAD_SPLAT_OP (simde_wasm_v128_load32_splat );
5919+ SIMD_LOAD_SPLAT_OP (simde_wasm_v128_load32_splat , 32 );
59225920 break ;
59235921 }
59245922 case SIMD_v128_load64_splat :
59255923 {
5926- SIMD_LOAD_SPLAT_OP (simde_wasm_v128_load64_splat );
5924+ SIMD_LOAD_SPLAT_OP (simde_wasm_v128_load64_splat , 64 );
59275925 break ;
59285926 }
59295927 case SIMD_v128_store :
@@ -5933,9 +5931,6 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
59335931 V128 data = POP_V128 ();
59345932 addr = POP_I32 ();
59355933
5936- V128 data ;
5937- data = POP_V128 ();
5938-
59395934 CHECK_MEMORY_OVERFLOW (16 );
59405935 STORE_V128 (maddr , data );
59415936 break ;
@@ -5952,7 +5947,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
59525947 PUT_V128_TO_ADDR (frame_lp + addr_ret , * (V128 * )orig_ip );
59535948 break ;
59545949 }
5955- // TODO: Add a faster SIMD implementation
5950+ /* TODO: Add a faster SIMD implementation */
59565951 case SIMD_v8x16_shuffle :
59575952 {
59585953 V128 indices ;
@@ -6053,15 +6048,22 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
60536048 SIMD_SPLAT_OP_F64 (simde_wasm_f64x2_splat );
60546049 break ;
60556050 }
6051+ #if WASM_CPU_SUPPORTS_UNALIGNED_ADDR_ACCESS != 0
6052+ #define SIMD_LANE_HANDLE_UNALIGNED_ACCESS ()
6053+ #else
6054+ #define SIMD_LANE_HANDLE_UNALIGNED_ACCESS () *frame_ip++;
6055+ #endif
60566056#define SIMD_EXTRACT_LANE_OP (register , return_type , push_elem ) \
60576057 do { \
60586058 uint8 lane = *frame_ip++; \
6059+ SIMD_LANE_HANDLE_UNALIGNED_ACCESS(); \
60596060 V128 v = POP_V128(); \
60606061 push_elem((return_type)(v.register[lane])); \
60616062 } while (0)
60626063#define SIMD_REPLACE_LANE_OP (register , return_type , pop_elem ) \
60636064 do { \
60646065 uint8 lane = *frame_ip++; \
6066+ SIMD_LANE_HANDLE_UNALIGNED_ACCESS(); \
60656067 return_type replacement = pop_elem(); \
60666068 V128 v = POP_V128(); \
60676069 v.register[lane] = replacement; \
@@ -6482,6 +6484,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
64826484 V128 vec = POP_V128(); \
64836485 addr = POP_I32(); \
64846486 int lane = *frame_ip++; \
6487+ SIMD_LANE_HANDLE_UNALIGNED_ACCESS(); \
64856488 SIMD_LOAD_LANE_COMMON(vec, register, lane, width); \
64866489 } while (0)
64876490
@@ -6512,6 +6515,7 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
65126515 V128 vec = POP_V128(); \
65136516 addr = POP_I32(); \
65146517 int lane = *frame_ip++; \
6518+ SIMD_LANE_HANDLE_UNALIGNED_ACCESS(); \
65156519 CHECK_MEMORY_OVERFLOW(width / 8); \
65166520 if (width == 64) { \
65176521 STORE_I64(maddr, vec.register[lane]); \
@@ -6659,7 +6663,6 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
66596663 SIMD_SINGLE_OP (simde_wasm_f32x4_nearest );
66606664 break ;
66616665 }
6662- // TODO: Check count?
66636666#define SIMD_LANE_SHIFT (simde_func ) \
66646667 do { \
66656668 int32 count = POP_I32(); \
@@ -7131,8 +7134,6 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
71317134 SIMD_SINGLE_OP (simde_wasm_u64x2_extend_high_u32x4 );
71327135 break ;
71337136 }
7134-
7135- // TODO: Verify count works
71367137 case SIMD_i64x2_shl :
71377138 {
71387139 SIMD_LANE_SHIFT (simde_wasm_i64x2_shl );
0 commit comments