Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
96 changes: 52 additions & 44 deletions src/prebuilt/wasm2c_atomicops_source_declarations.cc
Original file line number Diff line number Diff line change
Expand Up @@ -113,7 +113,9 @@ R"w2c_template( ATOMIC_ALIGNMENT_CHECK(addr, t1);
)w2c_template"
R"w2c_template( t1 result; \
)w2c_template"
R"w2c_template( wasm_rt_memcpy(&result, MEM_ADDR(mem, addr, sizeof(t1)), sizeof(t1)); \
R"w2c_template( wasm_rt_memcpy(&result, MEM_ADDR_MEMOP(mem, addr, sizeof(t1)), \
)w2c_template"
R"w2c_template( sizeof(t1)); \
)w2c_template"
R"w2c_template( force_read(result); \
)w2c_template"
Expand Down Expand Up @@ -169,7 +171,9 @@ R"w2c_template( ATOMIC_ALIGNMENT_CHECK(addr, t1);
)w2c_template"
R"w2c_template( t1 wrapped = (t1)value; \
)w2c_template"
R"w2c_template( wasm_rt_memcpy(MEM_ADDR(mem, addr, sizeof(t1)), &wrapped, sizeof(t1)); \
R"w2c_template( wasm_rt_memcpy(MEM_ADDR_MEMOP(mem, addr, sizeof(t1)), &wrapped, \
)w2c_template"
R"w2c_template( sizeof(t1)); \
)w2c_template"
R"w2c_template( } \
)w2c_template"
Expand Down Expand Up @@ -207,45 +211,47 @@ R"w2c_template(DEFINE_ATOMIC_STORE(i64_atomic_store16, u16, u64)
R"w2c_template(DEFINE_ATOMIC_STORE(i64_atomic_store32, u32, u64)
)w2c_template"
R"w2c_template(
#define DEFINE_ATOMIC_RMW(name, opname, op, t1, t2) \
#define DEFINE_ATOMIC_RMW(name, opname, op, t1, t2) \
)w2c_template"
R"w2c_template( static inline t2 name##_unchecked(wasm_rt_memory_t* mem, u64 addr, \
R"w2c_template( static inline t2 name##_unchecked(wasm_rt_memory_t* mem, u64 addr, \
)w2c_template"
R"w2c_template( t2 value) { \
R"w2c_template( t2 value) { \
)w2c_template"
R"w2c_template( ATOMIC_ALIGNMENT_CHECK(addr, t1); \
R"w2c_template( ATOMIC_ALIGNMENT_CHECK(addr, t1); \
)w2c_template"
R"w2c_template( t1 wrapped = (t1)value; \
R"w2c_template( t1 wrapped = (t1)value; \
)w2c_template"
R"w2c_template( t1 ret; \
R"w2c_template( t1 ret; \
)w2c_template"
R"w2c_template( wasm_rt_memcpy(&ret, MEM_ADDR(mem, addr, sizeof(t1)), sizeof(t1)); \
R"w2c_template( wasm_rt_memcpy(&ret, MEM_ADDR_MEMOP(mem, addr, sizeof(t1)), sizeof(t1)); \
)w2c_template"
R"w2c_template( t1 newval = ret op wrapped; \
R"w2c_template( t1 newval = ret op wrapped; \
)w2c_template"
R"w2c_template( wasm_rt_memcpy(MEM_ADDR(mem, addr, sizeof(t1)), &newval, sizeof(t1)); \
R"w2c_template( wasm_rt_memcpy(MEM_ADDR_MEMOP(mem, addr, sizeof(t1)), &newval, \
)w2c_template"
R"w2c_template( return (t2)ret; \
R"w2c_template( sizeof(t1)); \
)w2c_template"
R"w2c_template( } \
R"w2c_template( return (t2)ret; \
)w2c_template"
R"w2c_template( DEF_MEM_CHECKS1(name, _, t1, return, t2, t2) \
R"w2c_template( } \
)w2c_template"
R"w2c_template( static inline t2 name##_shared_unchecked(wasm_rt_shared_memory_t* mem, \
R"w2c_template( DEF_MEM_CHECKS1(name, _, t1, return, t2, t2) \
)w2c_template"
R"w2c_template( u64 addr, t2 value) { \
R"w2c_template( static inline t2 name##_shared_unchecked(wasm_rt_shared_memory_t* mem, \
)w2c_template"
R"w2c_template( ATOMIC_ALIGNMENT_CHECK(addr, t1); \
R"w2c_template( u64 addr, t2 value) { \
)w2c_template"
R"w2c_template( t1 wrapped = (t1)value; \
R"w2c_template( ATOMIC_ALIGNMENT_CHECK(addr, t1); \
)w2c_template"
R"w2c_template( t1 ret = atomic_##opname( \
R"w2c_template( t1 wrapped = (t1)value; \
)w2c_template"
R"w2c_template( (_Atomic volatile t1*)MEM_ADDR(mem, addr, sizeof(t1)), wrapped); \
R"w2c_template( t1 ret = atomic_##opname( \
)w2c_template"
R"w2c_template( return (t2)ret; \
R"w2c_template( (_Atomic volatile t1*)MEM_ADDR(mem, addr, sizeof(t1)), wrapped); \
)w2c_template"
R"w2c_template( } \
R"w2c_template( return (t2)ret; \
)w2c_template"
R"w2c_template( } \
)w2c_template"
R"w2c_template( DEF_MEM_CHECKS1(name##_shared, _shared_, t1, return, t2, t2)
)w2c_template"
Expand Down Expand Up @@ -325,43 +331,45 @@ R"w2c_template(DEFINE_ATOMIC_RMW(i64_atomic_rmw32_xor_u, fetch_xor, ^, u32, u64)
R"w2c_template(DEFINE_ATOMIC_RMW(i64_atomic_rmw_xor, fetch_xor, ^, u64, u64)
)w2c_template"
R"w2c_template(
#define DEFINE_ATOMIC_XCHG(name, opname, t1, t2) \
#define DEFINE_ATOMIC_XCHG(name, opname, t1, t2) \
)w2c_template"
R"w2c_template( static inline t2 name##_unchecked(wasm_rt_memory_t* mem, u64 addr, \
R"w2c_template( static inline t2 name##_unchecked(wasm_rt_memory_t* mem, u64 addr, \
)w2c_template"
R"w2c_template( t2 value) { \
R"w2c_template( t2 value) { \
)w2c_template"
R"w2c_template( ATOMIC_ALIGNMENT_CHECK(addr, t1); \
R"w2c_template( ATOMIC_ALIGNMENT_CHECK(addr, t1); \
)w2c_template"
R"w2c_template( t1 wrapped = (t1)value; \
R"w2c_template( t1 wrapped = (t1)value; \
)w2c_template"
R"w2c_template( t1 ret; \
R"w2c_template( t1 ret; \
)w2c_template"
R"w2c_template( wasm_rt_memcpy(&ret, MEM_ADDR(mem, addr, sizeof(t1)), sizeof(t1)); \
R"w2c_template( wasm_rt_memcpy(&ret, MEM_ADDR_MEMOP(mem, addr, sizeof(t1)), sizeof(t1)); \
)w2c_template"
R"w2c_template( wasm_rt_memcpy(MEM_ADDR(mem, addr, sizeof(t1)), &wrapped, sizeof(t1)); \
R"w2c_template( wasm_rt_memcpy(MEM_ADDR_MEMOP(mem, addr, sizeof(t1)), &wrapped, \
)w2c_template"
R"w2c_template( return (t2)ret; \
R"w2c_template( sizeof(t1)); \
)w2c_template"
R"w2c_template( } \
R"w2c_template( return (t2)ret; \
)w2c_template"
R"w2c_template( DEF_MEM_CHECKS1(name, _, t1, return, t2, t2) \
R"w2c_template( } \
)w2c_template"
R"w2c_template( static inline t2 name##_shared_unchecked(wasm_rt_shared_memory_t* mem, \
R"w2c_template( DEF_MEM_CHECKS1(name, _, t1, return, t2, t2) \
)w2c_template"
R"w2c_template( u64 addr, t2 value) { \
R"w2c_template( static inline t2 name##_shared_unchecked(wasm_rt_shared_memory_t* mem, \
)w2c_template"
R"w2c_template( ATOMIC_ALIGNMENT_CHECK(addr, t1); \
R"w2c_template( u64 addr, t2 value) { \
)w2c_template"
R"w2c_template( t1 wrapped = (t1)value; \
R"w2c_template( ATOMIC_ALIGNMENT_CHECK(addr, t1); \
)w2c_template"
R"w2c_template( t1 ret = atomic_##opname( \
R"w2c_template( t1 wrapped = (t1)value; \
)w2c_template"
R"w2c_template( (_Atomic volatile t1*)MEM_ADDR(mem, addr, sizeof(t1)), wrapped); \
R"w2c_template( t1 ret = atomic_##opname( \
)w2c_template"
R"w2c_template( return (t2)ret; \
R"w2c_template( (_Atomic volatile t1*)MEM_ADDR(mem, addr, sizeof(t1)), wrapped); \
)w2c_template"
R"w2c_template( } \
R"w2c_template( return (t2)ret; \
)w2c_template"
R"w2c_template( } \
)w2c_template"
R"w2c_template( DEF_MEM_CHECKS1(name##_shared, _shared_, t1, return, t2, t2)
)w2c_template"
Expand Down Expand Up @@ -395,13 +403,13 @@ R"w2c_template( t2 replacement_wrapped = (t2)replacement;
)w2c_template"
R"w2c_template( t2 ret; \
)w2c_template"
R"w2c_template( wasm_rt_memcpy(&ret, MEM_ADDR(mem, addr, sizeof(t2)), sizeof(t2)); \
R"w2c_template( wasm_rt_memcpy(&ret, MEM_ADDR_MEMOP(mem, addr, sizeof(t2)), sizeof(t2)); \
)w2c_template"
R"w2c_template( if (ret == expected_wrapped) { \
)w2c_template"
R"w2c_template( wasm_rt_memcpy(MEM_ADDR(mem, addr, sizeof(t2)), &replacement_wrapped, \
R"w2c_template( wasm_rt_memcpy(MEM_ADDR_MEMOP(mem, addr, sizeof(t2)), \
)w2c_template"
R"w2c_template( sizeof(t2)); \
R"w2c_template( &replacement_wrapped, sizeof(t2)); \
)w2c_template"
R"w2c_template( } \
)w2c_template"
Expand Down
78 changes: 55 additions & 23 deletions src/prebuilt/wasm2c_simd_source_declarations.cc
Original file line number Diff line number Diff line change
Expand Up @@ -19,60 +19,92 @@ R"w2c_template(#endif
R"w2c_template(// TODO: equivalent constraint for ARM and other architectures
)w2c_template"
R"w2c_template(
#define DEFINE_SIMD_LOAD_FUNC(name, func, t) \
// The below SIMD operations copy to a local variable first as the
)w2c_template"
R"w2c_template( static inline v128 name##_unchecked(wasm_rt_memory_t* mem, u64 addr) { \
R"w2c_template(// MEM_ADDR_MEMOP maybe segment pointers if WASM_RT_USE_SEGUE_FOR_THIS_MODULE is
)w2c_template"
R"w2c_template( v128 result = func(MEM_ADDR(mem, addr, sizeof(t))); \
R"w2c_template(// defined and regular pointers otherwse. memcpy into the local works correctly
)w2c_template"
R"w2c_template( SIMD_FORCE_READ(result); \
R"w2c_template(// in both cases.
)w2c_template"
R"w2c_template( return result; \
R"w2c_template(#define DEFINE_SIMD_LOAD_FUNC(name, func, t) \
)w2c_template"
R"w2c_template( } \
R"w2c_template( static inline v128 name##_unchecked(wasm_rt_memory_t* mem, u64 addr) { \
)w2c_template"
R"w2c_template( t simd_mem_value; \
)w2c_template"
R"w2c_template( wasm_rt_memcpy(&simd_mem_value, MEM_ADDR_MEMOP(mem, addr, sizeof(t)), \
)w2c_template"
R"w2c_template( sizeof(t)); \
)w2c_template"
R"w2c_template( v128 result = func(&simd_mem_value); \
)w2c_template"
R"w2c_template( SIMD_FORCE_READ(result); \
)w2c_template"
R"w2c_template( return result; \
)w2c_template"
R"w2c_template( } \
)w2c_template"
R"w2c_template( DEF_MEM_CHECKS0(name, _, t, return, v128);
)w2c_template"
R"w2c_template(
#define DEFINE_SIMD_LOAD_LANE(name, func, t, lane) \
#define DEFINE_SIMD_LOAD_LANE(name, func, t, lane) \
)w2c_template"
R"w2c_template( static inline v128 name##_unchecked(wasm_rt_memory_t* mem, u64 addr, \
)w2c_template"
R"w2c_template( static inline v128 name##_unchecked(wasm_rt_memory_t* mem, u64 addr, \
R"w2c_template( v128 vec) { \
)w2c_template"
R"w2c_template( v128 vec) { \
R"w2c_template( t simd_mem_value; \
)w2c_template"
R"w2c_template( v128 result = func(MEM_ADDR(mem, addr, sizeof(t)), vec, lane); \
R"w2c_template( wasm_rt_memcpy(&simd_mem_value, MEM_ADDR_MEMOP(mem, addr, sizeof(t)), \
)w2c_template"
R"w2c_template( SIMD_FORCE_READ(result); \
R"w2c_template( sizeof(t)); \
)w2c_template"
R"w2c_template( return result; \
R"w2c_template( v128 result = func(&simd_mem_value, vec, lane); \
)w2c_template"
R"w2c_template( } \
R"w2c_template( SIMD_FORCE_READ(result); \
)w2c_template"
R"w2c_template( return result; \
)w2c_template"
R"w2c_template( } \
)w2c_template"
R"w2c_template( DEF_MEM_CHECKS1(name, _, t, return, v128, v128);
)w2c_template"
R"w2c_template(
#define DEFINE_SIMD_STORE(name, t) \
#define DEFINE_SIMD_STORE(name, t) \
)w2c_template"
R"w2c_template( static inline void name##_unchecked(wasm_rt_memory_t* mem, u64 addr, \
)w2c_template"
R"w2c_template( v128 value) { \
)w2c_template"
R"w2c_template( static inline void name##_unchecked(wasm_rt_memory_t* mem, u64 addr, \
R"w2c_template( t simd_mem_value; \
)w2c_template"
R"w2c_template( v128 value) { \
R"w2c_template( simde_wasm_v128_store(&simd_mem_value, value); \
)w2c_template"
R"w2c_template( simde_wasm_v128_store(MEM_ADDR(mem, addr, sizeof(t)), value); \
R"w2c_template( wasm_rt_memcpy(MEM_ADDR_MEMOP(mem, addr, sizeof(t)), &simd_mem_value, \
)w2c_template"
R"w2c_template( } \
R"w2c_template( sizeof(t)); \
)w2c_template"
R"w2c_template( } \
)w2c_template"
R"w2c_template( DEF_MEM_CHECKS1(name, _, t, , void, v128);
)w2c_template"
R"w2c_template(
#define DEFINE_SIMD_STORE_LANE(name, func, t, lane) \
#define DEFINE_SIMD_STORE_LANE(name, func, t, lane) \
)w2c_template"
R"w2c_template( static inline void name##_unchecked(wasm_rt_memory_t* mem, u64 addr, \
)w2c_template"
R"w2c_template( v128 value) { \
)w2c_template"
R"w2c_template( t simd_mem_value; \
)w2c_template"
R"w2c_template( static inline void name##_unchecked(wasm_rt_memory_t* mem, u64 addr, \
R"w2c_template( func(&simd_mem_value, value, lane); \
)w2c_template"
R"w2c_template( v128 value) { \
R"w2c_template( wasm_rt_memcpy(MEM_ADDR_MEMOP(mem, addr, sizeof(t)), &simd_mem_value, \
)w2c_template"
R"w2c_template( func(MEM_ADDR(mem, addr, sizeof(t)), value, lane); \
R"w2c_template( sizeof(t)); \
)w2c_template"
R"w2c_template( } \
R"w2c_template( } \
)w2c_template"
R"w2c_template( DEF_MEM_CHECKS1(name, _, t, , void, v128);
)w2c_template"
Expand Down
Loading
Loading