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"
2617R"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"
3728R"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"
4342R"w2c_template( return result; \
4443)w2c_template"
0 commit comments