Skip to content

Commit

Permalink
Switch to portable SIMD reads
Browse files Browse the repository at this point in the history
  • Loading branch information
SoniEx2 committed Feb 18, 2025
1 parent 508984b commit bc55f0e
Show file tree
Hide file tree
Showing 2 changed files with 25 additions and 33 deletions.
35 changes: 15 additions & 20 deletions src/prebuilt/wasm2c_simd_source_declarations.cc
Original file line number Diff line number Diff line change
@@ -1,27 +1,16 @@
const char* s_simd_source_declarations = R"w2c_template(#if defined(__GNUC__) && defined(__x86_64__)
const char* s_simd_source_declarations = R"w2c_template(#define DEFINE_SIMD_LOAD_FUNC(name, func, t) \
)w2c_template"
R"w2c_template(#define SIMD_FORCE_READ(var) __asm__("" ::"x"(var));
)w2c_template"
R"w2c_template(#elif defined(__GNUC__) && defined(__aarch64__)
)w2c_template"
R"w2c_template(#define SIMD_FORCE_READ(var) __asm__("" ::"w"(var));
)w2c_template"
R"w2c_template(#else
)w2c_template"
R"w2c_template(#define SIMD_FORCE_READ(var)
)w2c_template"
R"w2c_template(#endif
R"w2c_template( static inline v128 name##_unchecked(wasm_rt_memory_t* mem, u64 addr) { \
)w2c_template"
R"w2c_template(// TODO: equivalent constraint for ARM and other architectures
R"w2c_template( char tmp[sizeof(t)]; \
)w2c_template"
R"w2c_template(
#define DEFINE_SIMD_LOAD_FUNC(name, func, t) \
R"w2c_template( const volatile char *v_addr; \
)w2c_template"
R"w2c_template( static inline v128 name##_unchecked(wasm_rt_memory_t* mem, u64 addr) { \
R"w2c_template( v_addr = (const volatile char *)MEM_ADDR(mem, addr, sizeof(t)); \
)w2c_template"
R"w2c_template( v128 result = func(MEM_ADDR(mem, addr, sizeof(t))); \
R"w2c_template( for (int i = 0; i < sizeof(t); i++) tmp[i] = v_addr[i]; \
)w2c_template"
R"w2c_template( SIMD_FORCE_READ(result); \
R"w2c_template( v128 result = func(&tmp); \
)w2c_template"
R"w2c_template( return result; \
)w2c_template"
Expand All @@ -36,9 +25,15 @@ R"w2c_template( static inline v128 name##_unchecked(wasm_rt_memory_t* mem, u64
)w2c_template"
R"w2c_template( v128 vec) { \
)w2c_template"
R"w2c_template( v128 result = func(MEM_ADDR(mem, addr, sizeof(t)), vec, lane); \
R"w2c_template( char tmp[sizeof(t)]; \
)w2c_template"
R"w2c_template( const volatile char *v_addr; \
)w2c_template"
R"w2c_template( v_addr = (const volatile char *)MEM_ADDR(mem, addr, sizeof(t)); \
)w2c_template"
R"w2c_template( for (int i = 0; i < sizeof(t); i++) tmp[i] = v_addr[i]; \
)w2c_template"
R"w2c_template( SIMD_FORCE_READ(result); \
R"w2c_template( v128 result = func(&tmp, vec, lane); \
)w2c_template"
R"w2c_template( return result; \
)w2c_template"
Expand Down
23 changes: 10 additions & 13 deletions src/template/wasm2c_simd.declarations.c
Original file line number Diff line number Diff line change
@@ -1,25 +1,22 @@
#if defined(__GNUC__) && defined(__x86_64__)
#define SIMD_FORCE_READ(var) __asm__("" ::"x"(var));
#elif defined(__GNUC__) && defined(__aarch64__)
#define SIMD_FORCE_READ(var) __asm__("" ::"w"(var));
#else
#define SIMD_FORCE_READ(var)
#endif
// TODO: equivalent constraint for ARM and other architectures

#define DEFINE_SIMD_LOAD_FUNC(name, func, t) \
static inline v128 name##_unchecked(wasm_rt_memory_t* mem, u64 addr) { \
v128 result = func(MEM_ADDR(mem, addr, sizeof(t))); \
SIMD_FORCE_READ(result); \
char tmp[sizeof(t)]; \
const volatile char *v_addr; \
v_addr = (const volatile char *)MEM_ADDR(mem, addr, sizeof(t)); \
for (int i = 0; i < sizeof(t); i++) tmp[i] = v_addr[i]; \
v128 result = func(&tmp); \
return result; \
} \
DEF_MEM_CHECKS0(name, _, t, return, v128);

#define DEFINE_SIMD_LOAD_LANE(name, func, t, lane) \
static inline v128 name##_unchecked(wasm_rt_memory_t* mem, u64 addr, \
v128 vec) { \
v128 result = func(MEM_ADDR(mem, addr, sizeof(t)), vec, lane); \
SIMD_FORCE_READ(result); \
char tmp[sizeof(t)]; \
const volatile char *v_addr; \
v_addr = (const volatile char *)MEM_ADDR(mem, addr, sizeof(t)); \
for (int i = 0; i < sizeof(t); i++) tmp[i] = v_addr[i]; \
v128 result = func(&tmp, vec, lane); \
return result; \
} \
DEF_MEM_CHECKS1(name, _, t, return, v128, v128);
Expand Down

0 comments on commit bc55f0e

Please sign in to comment.