diff --git a/src/prebuilt/wasm2c_simd_source_declarations.cc b/src/prebuilt/wasm2c_simd_source_declarations.cc index a43a000696..0089a0cac5 100644 --- a/src/prebuilt/wasm2c_simd_source_declarations.cc +++ b/src/prebuilt/wasm2c_simd_source_declarations.cc @@ -1,4 +1,6 @@ -const char* s_simd_source_declarations = R"w2c_template(#if defined(__GNUC__) && defined(__x86_64__) +const char* s_simd_source_declarations = R"w2c_template(#if WASM_RT_MEMCHECK_GUARD_PAGES +)w2c_template" +R"w2c_template(#if defined(__GNUC__) && defined(__x86_64__) )w2c_template" R"w2c_template(#define SIMD_FORCE_READ(var) __asm__("" ::"x"(var)); )w2c_template" @@ -8,6 +10,14 @@ R"w2c_template(#define SIMD_FORCE_READ(var) __asm__("" ::"w"(var)); )w2c_template" R"w2c_template(#else )w2c_template" +R"w2c_template(// best-effort using volatile +)w2c_template" +R"w2c_template(#define SIMD_FORCE_READ(var) (void)*(volatile v128*)&var; +)w2c_template" +R"w2c_template(#endif +)w2c_template" +R"w2c_template(#else +)w2c_template" R"w2c_template(#define SIMD_FORCE_READ(var) )w2c_template" R"w2c_template(#endif diff --git a/src/template/wasm2c_simd.declarations.c b/src/template/wasm2c_simd.declarations.c index 39eb4578e1..8e16c1c4be 100644 --- a/src/template/wasm2c_simd.declarations.c +++ b/src/template/wasm2c_simd.declarations.c @@ -1,8 +1,13 @@ +#if WASM_RT_MEMCHECK_GUARD_PAGES #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 +// best-effort using volatile +#define SIMD_FORCE_READ(var) (void)*(volatile v128*)&var; +#endif +#else #define SIMD_FORCE_READ(var) #endif // TODO: equivalent constraint for ARM and other architectures