Fix load/load_splat macros

This commit is contained in:
James Marsh 2025-01-22 10:09:54 +00:00 committed by Marcin Kolny
parent 80e6c986f4
commit bd97970828
2 changed files with 36 additions and 50 deletions

View File

@ -5843,66 +5843,54 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
PUT_V128_TO_ADDR(frame_lp + addr_ret, LOAD_V128(maddr)); PUT_V128_TO_ADDR(frame_lp + addr_ret, LOAD_V128(maddr));
break; break;
} }
#define SIMD_LOAD_OP(op_name, simde_func, element_size, num_elements) \ #define SIMD_LOAD_OP(simde_func, element_size, num_elements) \
do { \ do { \
uint32 offset, addr; \ uint32 offset, addr; \
offset = read_uint32(frame_ip); \ offset = read_uint32(frame_ip); \
addr = GET_OPERAND(uint32, I32, 0); \ addr = GET_OPERAND(uint32, I32, 0); \
frame_ip += 2; \ frame_ip += 2; \
addr_ret = GET_OFFSET(); \ addr_ret = GET_OFFSET(); \
CHECK_MEMORY_OVERFLOW(16); \ CHECK_MEMORY_OVERFLOW(4); \
\ \
simde_v128_t simde_result = simde_func(maddr); \ simde_v128_t simde_result = simde_func(maddr); \
\ \
V128 result; \ V128 result; \
SIMDE_V128_TO_SIMD_V128(simde_result, result); \ SIMDE_V128_TO_SIMD_V128(simde_result, result); \
\ PUT_V128_TO_ADDR(frame_lp + addr_ret, result); \
V128 reversed_result; \
for (int i = 0; i < num_elements; i++) { \
reversed_result.i##element_size##x##num_elements[i] = \
result.i##element_size##x##num_elements[num_elements - 1 - i]; \
} \
PUT_V128_TO_ADDR(frame_lp + addr_ret, reversed_result); \
\ \
break; \ break; \
} while (0) } while (0)
case SIMD_v128_load8x8_s: case SIMD_v128_load8x8_s:
{ {
SIMD_LOAD_OP(SIMD_v128_load8x8_s, SIMD_LOAD_OP(simde_wasm_i16x8_load8x8, 16, 8);
simde_wasm_i16x8_load8x8, 16, 8);
break; break;
} }
case SIMD_v128_load8x8_u: case SIMD_v128_load8x8_u:
{ {
SIMD_LOAD_OP(SIMD_v128_load8x8_u, SIMD_LOAD_OP(simde_wasm_u16x8_load8x8, 16, 8);
simde_wasm_u16x8_load8x8, 16, 8);
break; break;
} }
case SIMD_v128_load16x4_s: case SIMD_v128_load16x4_s:
{ {
SIMD_LOAD_OP(SIMD_v128_load16x4_s, SIMD_LOAD_OP(simde_wasm_i32x4_load16x4, 32, 4);
simde_wasm_i32x4_load16x4, 32, 4);
break; break;
} }
case SIMD_v128_load16x4_u: case SIMD_v128_load16x4_u:
{ {
SIMD_LOAD_OP(SIMD_v128_load16x4_u, SIMD_LOAD_OP(simde_wasm_u32x4_load16x4, 32, 4);
simde_wasm_u32x4_load16x4, 32, 4);
break; break;
} }
case SIMD_v128_load32x2_s: case SIMD_v128_load32x2_s:
{ {
SIMD_LOAD_OP(SIMD_v128_load32x2_s, SIMD_LOAD_OP(simde_wasm_i64x2_load32x2, 64, 2);
simde_wasm_i64x2_load32x2, 64, 2);
break; break;
} }
case SIMD_v128_load32x2_u: case SIMD_v128_load32x2_u:
{ {
SIMD_LOAD_OP(SIMD_v128_load32x2_u, SIMD_LOAD_OP(simde_wasm_u64x2_load32x2, 64, 2);
simde_wasm_u64x2_load32x2, 64, 2);
break; break;
} }
#define SIMD_LOAD_SPLAT_OP(op_name, simde_func) \ #define SIMD_LOAD_SPLAT_OP(simde_func) \
do { \ do { \
uint32 offset, addr; \ uint32 offset, addr; \
offset = read_uint32(frame_ip); \ offset = read_uint32(frame_ip); \
@ -5921,26 +5909,22 @@ wasm_interp_call_func_bytecode(WASMModuleInstance *module,
case SIMD_v128_load8_splat: case SIMD_v128_load8_splat:
{ {
SIMD_LOAD_SPLAT_OP(SIMD_v128_load8_splat, SIMD_LOAD_SPLAT_OP(simde_wasm_v128_load8_splat);
simde_wasm_v128_load8_splat);
break; break;
} }
case SIMD_v128_load16_splat: case SIMD_v128_load16_splat:
{ {
SIMD_LOAD_SPLAT_OP(SIMD_v128_load16_splat, SIMD_LOAD_SPLAT_OP(simde_wasm_v128_load16_splat);
simde_wasm_v128_load16_splat);
break; break;
} }
case SIMD_v128_load32_splat: case SIMD_v128_load32_splat:
{ {
SIMD_LOAD_SPLAT_OP(SIMD_v128_load32_splat, SIMD_LOAD_SPLAT_OP(simde_wasm_v128_load32_splat);
simde_wasm_v128_load32_splat);
break; break;
} }
case SIMD_v128_load64_splat: case SIMD_v128_load64_splat:
{ {
SIMD_LOAD_SPLAT_OP(SIMD_v128_load64_splat, SIMD_LOAD_SPLAT_OP(simde_wasm_v128_load64_splat);
simde_wasm_v128_load64_splat);
break; break;
} }
case SIMD_v128_store: case SIMD_v128_store:

View File

@ -9135,14 +9135,16 @@ preserve_referenced_local(WASMLoaderContext *loader_ctx, uint8 opcode,
loader_ctx->frame_offset_bottom[i] = preserved_offset; loader_ctx->frame_offset_bottom[i] = preserved_offset;
} }
if (is_32bit_type(cur_type)) if (cur_type == VALUE_TYPE_V128) {
i++;
else if (cur_type == VALUE_TYPE_V128) {
i += 4; i += 4;
} }
else else if (is_32bit_type(cur_type)) {
i++;
}
else {
i += 2; i += 2;
} }
}
(void)error_buf; (void)error_buf;
(void)error_buf_size; (void)error_buf_size;