Skip to content

Commit 1399858

Browse files
committed
Switch to portable SIMD reads
1 parent 508984b commit 1399858

File tree

2 files changed

+30
-32
lines changed

2 files changed

+30
-32
lines changed

src/prebuilt/wasm2c_simd_source_declarations.cc

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,18 @@
1-
const char* s_simd_source_declarations = R"w2c_template(#if defined(__GNUC__) && defined(__x86_64__)
1+
const char* s_simd_source_declarations = R"w2c_template(#define DEFINE_SIMD_LOAD_FUNC(name, func, t) \
22
)w2c_template"
3-
R"w2c_template(#define SIMD_FORCE_READ(var) __asm__("" ::"x"(var));
4-
)w2c_template"
5-
R"w2c_template(#elif defined(__GNUC__) && defined(__aarch64__)
3+
R"w2c_template( static inline v128 name##_unchecked(wasm_rt_memory_t* mem, u64 addr) { \
64
)w2c_template"
7-
R"w2c_template(#define SIMD_FORCE_READ(var) __asm__("" ::"w"(var));
5+
R"w2c_template( char tmp[sizeof(t)]; \
86
)w2c_template"
9-
R"w2c_template(#else
7+
R"w2c_template( const volatile char* v_addr; \
108
)w2c_template"
11-
R"w2c_template(#define SIMD_FORCE_READ(var)
9+
R"w2c_template( v_addr = (const volatile char*)MEM_ADDR(mem, addr, sizeof(t)); \
1210
)w2c_template"
13-
R"w2c_template(#endif
11+
R"w2c_template( for (int i = 0; i < sizeof(t); i++) \
1412
)w2c_template"
15-
R"w2c_template(// TODO: equivalent constraint for ARM and other architectures
13+
R"w2c_template( tmp[i] = v_addr[i]; \
1614
)w2c_template"
17-
R"w2c_template(
18-
#define DEFINE_SIMD_LOAD_FUNC(name, func, t) \
19-
)w2c_template"
20-
R"w2c_template( static inline v128 name##_unchecked(wasm_rt_memory_t* mem, u64 addr) { \
21-
)w2c_template"
22-
R"w2c_template( v128 result = func(MEM_ADDR(mem, addr, sizeof(t))); \
23-
)w2c_template"
24-
R"w2c_template( SIMD_FORCE_READ(result); \
15+
R"w2c_template( v128 result = func(&tmp); \
2516
)w2c_template"
2617
R"w2c_template( return result; \
2718
)w2c_template"
@@ -36,9 +27,17 @@ R"w2c_template( static inline v128 name##_unchecked(wasm_rt_memory_t* mem, u64
3627
)w2c_template"
3728
R"w2c_template( v128 vec) { \
3829
)w2c_template"
39-
R"w2c_template( v128 result = func(MEM_ADDR(mem, addr, sizeof(t)), vec, lane); \
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]; \
4039
)w2c_template"
41-
R"w2c_template( SIMD_FORCE_READ(result); \
40+
R"w2c_template( v128 result = func(&tmp, vec, lane); \
4241
)w2c_template"
4342
R"w2c_template( return result; \
4443
)w2c_template"

src/template/wasm2c_simd.declarations.c

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,24 @@
1-
#if defined(__GNUC__) && defined(__x86_64__)
2-
#define SIMD_FORCE_READ(var) __asm__("" ::"x"(var));
3-
#elif defined(__GNUC__) && defined(__aarch64__)
4-
#define SIMD_FORCE_READ(var) __asm__("" ::"w"(var));
5-
#else
6-
#define SIMD_FORCE_READ(var)
7-
#endif
8-
// TODO: equivalent constraint for ARM and other architectures
9-
101
#define DEFINE_SIMD_LOAD_FUNC(name, func, t) \
112
static inline v128 name##_unchecked(wasm_rt_memory_t* mem, u64 addr) { \
12-
v128 result = func(MEM_ADDR(mem, addr, sizeof(t))); \
13-
SIMD_FORCE_READ(result); \
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); \
149
return result; \
1510
} \
1611
DEF_MEM_CHECKS0(name, _, t, return, v128);
1712

1813
#define DEFINE_SIMD_LOAD_LANE(name, func, t, lane) \
1914
static inline v128 name##_unchecked(wasm_rt_memory_t* mem, u64 addr, \
2015
v128 vec) { \
21-
v128 result = func(MEM_ADDR(mem, addr, sizeof(t)), vec, lane); \
22-
SIMD_FORCE_READ(result); \
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); \
2322
return result; \
2423
} \
2524
DEF_MEM_CHECKS1(name, _, t, return, v128, v128);

0 commit comments

Comments
 (0)