Skip to content

Commit 59f0efd

Browse files
committed
Alternative impl
1 parent 1399858 commit 59f0efd

File tree

2 files changed

+14
-33
lines changed

2 files changed

+14
-33
lines changed

Diff for: src/prebuilt/wasm2c_simd_source_declarations.cc

+8-21
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,13 @@
1-
const char* s_simd_source_declarations = R"w2c_template(#define DEFINE_SIMD_LOAD_FUNC(name, func, t) \
1+
const char* s_simd_source_declarations = R"w2c_template(#define SIMD_FORCE_READ(var) (void)*(volatile v128*)&var;
22
)w2c_template"
3-
R"w2c_template( static inline v128 name##_unchecked(wasm_rt_memory_t* mem, u64 addr) { \
4-
)w2c_template"
5-
R"w2c_template( char tmp[sizeof(t)]; \
6-
)w2c_template"
7-
R"w2c_template( const volatile char* v_addr; \
8-
)w2c_template"
9-
R"w2c_template( v_addr = (const volatile char*)MEM_ADDR(mem, addr, sizeof(t)); \
3+
R"w2c_template(
4+
#define DEFINE_SIMD_LOAD_FUNC(name, func, t) \
105
)w2c_template"
11-
R"w2c_template( for (int i = 0; i < sizeof(t); i++) \
6+
R"w2c_template( static inline v128 name##_unchecked(wasm_rt_memory_t* mem, u64 addr) { \
127
)w2c_template"
13-
R"w2c_template( tmp[i] = v_addr[i]; \
8+
R"w2c_template( v128 result = func(MEM_ADDR(mem, addr, sizeof(t))); \
149
)w2c_template"
15-
R"w2c_template( v128 result = func(&tmp); \
10+
R"w2c_template( SIMD_FORCE_READ(result); \
1611
)w2c_template"
1712
R"w2c_template( return result; \
1813
)w2c_template"
@@ -27,17 +22,9 @@ R"w2c_template( static inline v128 name##_unchecked(wasm_rt_memory_t* mem, u64
2722
)w2c_template"
2823
R"w2c_template( v128 vec) { \
2924
)w2c_template"
30-
R"w2c_template( char tmp[sizeof(t)]; \
31-
)w2c_template"
32-
R"w2c_template( const volatile char* v_addr; \
33-
)w2c_template"
34-
R"w2c_template( v_addr = (const volatile char*)MEM_ADDR(mem, addr, sizeof(t)); \
35-
)w2c_template"
36-
R"w2c_template( for (int i = 0; i < sizeof(t); i++) \
37-
)w2c_template"
38-
R"w2c_template( tmp[i] = v_addr[i]; \
25+
R"w2c_template( v128 result = func(MEM_ADDR(mem, addr, sizeof(t)), vec, lane); \
3926
)w2c_template"
40-
R"w2c_template( v128 result = func(&tmp, vec, lane); \
27+
R"w2c_template( SIMD_FORCE_READ(result); \
4128
)w2c_template"
4229
R"w2c_template( return result; \
4330
)w2c_template"

Diff for: src/template/wasm2c_simd.declarations.c

+6-12
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,18 @@
1+
#define SIMD_FORCE_READ(var) (void)*(volatile v128*)&var;
2+
13
#define DEFINE_SIMD_LOAD_FUNC(name, func, t) \
24
static inline v128 name##_unchecked(wasm_rt_memory_t* mem, u64 addr) { \
3-
char tmp[sizeof(t)]; \
4-
const volatile char* v_addr; \
5-
v_addr = (const volatile char*)MEM_ADDR(mem, addr, sizeof(t)); \
6-
for (int i = 0; i < sizeof(t); i++) \
7-
tmp[i] = v_addr[i]; \
8-
v128 result = func(&tmp); \
5+
v128 result = func(MEM_ADDR(mem, addr, sizeof(t))); \
6+
SIMD_FORCE_READ(result); \
97
return result; \
108
} \
119
DEF_MEM_CHECKS0(name, _, t, return, v128);
1210

1311
#define DEFINE_SIMD_LOAD_LANE(name, func, t, lane) \
1412
static inline v128 name##_unchecked(wasm_rt_memory_t* mem, u64 addr, \
1513
v128 vec) { \
16-
char tmp[sizeof(t)]; \
17-
const volatile char* v_addr; \
18-
v_addr = (const volatile char*)MEM_ADDR(mem, addr, sizeof(t)); \
19-
for (int i = 0; i < sizeof(t); i++) \
20-
tmp[i] = v_addr[i]; \
21-
v128 result = func(&tmp, vec, lane); \
14+
v128 result = func(MEM_ADDR(mem, addr, sizeof(t)), vec, lane); \
15+
SIMD_FORCE_READ(result); \
2216
return result; \
2317
} \
2418
DEF_MEM_CHECKS1(name, _, t, return, v128, v128);

0 commit comments

Comments
 (0)