Skip to content
Open
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
279 changes: 186 additions & 93 deletions src/prebuilt/wasm2c_atomicops_source_declarations.cc

Large diffs are not rendered by default.

107 changes: 67 additions & 40 deletions src/prebuilt/wasm2c_simd_source_declarations.cc
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,33 @@ R"w2c_template( "Either enable specify -DWASM_RT_NONCONFORMING_ALLOW_OOB_READ_
R"w2c_template(#endif
)w2c_template"
R"w2c_template(
#if WABT_BIG_ENDIAN
)w2c_template"
R"w2c_template(static inline v128 WASM_ADJUST_ENDIAN_v128(v128 value) {
)w2c_template"
R"w2c_template( u64 input[2];
)w2c_template"
R"w2c_template( u64 output[2];
)w2c_template"
R"w2c_template( wasm_rt_memcpy(input, &value, sizeof(input));
)w2c_template"
R"w2c_template( output[0] = htole64(input[1]);
)w2c_template"
R"w2c_template( output[1] = htole64(input[0]);
)w2c_template"
R"w2c_template( wasm_rt_memcpy(&value, output, sizeof(value));
)w2c_template"
R"w2c_template( return value;
)w2c_template"
R"w2c_template(}
)w2c_template"
R"w2c_template(#else
)w2c_template"
R"w2c_template(#define WASM_ADJUST_ENDIAN_v128(value) (value)
)w2c_template"
R"w2c_template(#endif
)w2c_template"
R"w2c_template(
// The below SIMD operations copy to a local variable first as the
)w2c_template"
R"w2c_template(// MEM_ADDR_MEMOP maybe segment pointers if WASM_RT_USE_SEGUE_FOR_THIS_MODULE is
Expand All @@ -47,94 +74,94 @@ R"w2c_template(// defined and regular pointers otherwse. memcpy into the local w
)w2c_template"
R"w2c_template(// in both cases.
)w2c_template"
R"w2c_template(#define DEFINE_SIMD_LOAD_FUNC(name, func, t) \
R"w2c_template(#define DEFINE_SIMD_LOAD_FUNC(name, func, t) \
)w2c_template"
R"w2c_template( static inline v128 name##_unchecked( \
R"w2c_template( static inline v128 name##_unchecked( \
)w2c_template"
R"w2c_template( uint8_t* const wasm_rt_local_memory_base, wasm_rt_memory_t* mem, \
R"w2c_template( uint8_t* const wasm_rt_local_memory_base, wasm_rt_memory_t* mem, \
)w2c_template"
R"w2c_template( u64 addr) { \
R"w2c_template( u64 addr) { \
)w2c_template"
R"w2c_template( t simd_mem_value; \
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)), \
R"w2c_template( wasm_rt_memcpy(&simd_mem_value, MEM_ADDR_MEMOP(mem, addr), sizeof(t)); \
)w2c_template"
R"w2c_template( sizeof(t)); \
R"w2c_template( simd_mem_value = WASM_ADJUST_ENDIAN_##t(simd_mem_value); \
)w2c_template"
R"w2c_template( v128 result = func(&simd_mem_value); \
R"w2c_template( v128 result = func(&simd_mem_value); \
)w2c_template"
R"w2c_template( SIMD_FORCE_READ(result); \
R"w2c_template( SIMD_FORCE_READ(result); \
)w2c_template"
R"w2c_template( return result; \
R"w2c_template( return result; \
)w2c_template"
R"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( \
R"w2c_template( static inline v128 name##_unchecked( \
)w2c_template"
R"w2c_template( uint8_t* const wasm_rt_local_memory_base, wasm_rt_memory_t* mem, \
R"w2c_template( uint8_t* const wasm_rt_local_memory_base, wasm_rt_memory_t* mem, \
)w2c_template"
R"w2c_template( u64 addr, v128 vec) { \
R"w2c_template( u64 addr, v128 vec) { \
)w2c_template"
R"w2c_template( t simd_mem_value; \
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)), \
R"w2c_template( wasm_rt_memcpy(&simd_mem_value, MEM_ADDR_MEMOP(mem, addr), sizeof(t)); \
)w2c_template"
R"w2c_template( sizeof(t)); \
R"w2c_template( simd_mem_value = WASM_ADJUST_ENDIAN_##t(simd_mem_value); \
)w2c_template"
R"w2c_template( v128 result = func(&simd_mem_value, vec, lane); \
R"w2c_template( v128 result = func(&simd_mem_value, vec, lane); \
)w2c_template"
R"w2c_template( SIMD_FORCE_READ(result); \
R"w2c_template( SIMD_FORCE_READ(result); \
)w2c_template"
R"w2c_template( return result; \
R"w2c_template( return result; \
)w2c_template"
R"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( \
R"w2c_template( static inline void name##_unchecked( \
)w2c_template"
R"w2c_template( uint8_t* const wasm_rt_local_memory_base, wasm_rt_memory_t* mem, \
R"w2c_template( uint8_t* const wasm_rt_local_memory_base, wasm_rt_memory_t* mem, \
)w2c_template"
R"w2c_template( u64 addr, v128 value) { \
R"w2c_template( u64 addr, v128 value) { \
)w2c_template"
R"w2c_template( t simd_mem_value; \
R"w2c_template( t simd_mem_value; \
)w2c_template"
R"w2c_template( simde_wasm_v128_store(&simd_mem_value, value); \
R"w2c_template( simde_wasm_v128_store(&simd_mem_value, value); \
)w2c_template"
R"w2c_template( wasm_rt_memcpy(MEM_ADDR_MEMOP(mem, addr, sizeof(t)), &simd_mem_value, \
R"w2c_template( simd_mem_value = WASM_ADJUST_ENDIAN_##t(simd_mem_value); \
)w2c_template"
R"w2c_template( sizeof(t)); \
R"w2c_template( wasm_rt_memcpy(MEM_ADDR_MEMOP(mem, addr), &simd_mem_value, sizeof(t)); \
)w2c_template"
R"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( \
R"w2c_template( static inline void name##_unchecked( \
)w2c_template"
R"w2c_template( uint8_t* const wasm_rt_local_memory_base, wasm_rt_memory_t* mem, \
R"w2c_template( uint8_t* const wasm_rt_local_memory_base, wasm_rt_memory_t* mem, \
)w2c_template"
R"w2c_template( u64 addr, v128 value) { \
R"w2c_template( u64 addr, v128 value) { \
)w2c_template"
R"w2c_template( t simd_mem_value; \
R"w2c_template( t simd_mem_value; \
)w2c_template"
R"w2c_template( func(&simd_mem_value, value, lane); \
R"w2c_template( func(&simd_mem_value, value, lane); \
)w2c_template"
R"w2c_template( wasm_rt_memcpy(MEM_ADDR_MEMOP(mem, addr, sizeof(t)), &simd_mem_value, \
R"w2c_template( simd_mem_value = WASM_ADJUST_ENDIAN_##t(simd_mem_value); \
)w2c_template"
R"w2c_template( sizeof(t)); \
R"w2c_template( wasm_rt_memcpy(MEM_ADDR_MEMOP(mem, addr), &simd_mem_value, 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
142 changes: 76 additions & 66 deletions src/prebuilt/wasm2c_source_declarations.cc
Original file line number Diff line number Diff line change
@@ -1,46 +1,4 @@
const char* s_source_declarations = R"w2c_template(
// Computes a pointer to an object of the given size in a little-endian memory.
)w2c_template"
R"w2c_template(//
)w2c_template"
R"w2c_template(// On a little-endian host, this is just &mem->data[addr] - the object's size is
)w2c_template"
R"w2c_template(// unused. On a big-endian host, it's &mem->data[mem->size - addr - n], where n
)w2c_template"
R"w2c_template(// is the object's size.
)w2c_template"
R"w2c_template(//
)w2c_template"
R"w2c_template(// Note that mem may be evaluated multiple times.
)w2c_template"
R"w2c_template(//
)w2c_template"
R"w2c_template(// Parameters:
)w2c_template"
R"w2c_template(// mem - The memory.
)w2c_template"
R"w2c_template(// addr - The address.
)w2c_template"
R"w2c_template(// n - The size of the object.
)w2c_template"
R"w2c_template(//
)w2c_template"
R"w2c_template(// Result:
)w2c_template"
R"w2c_template(// A pointer for an object of size n.
)w2c_template"
R"w2c_template(#if WABT_BIG_ENDIAN
)w2c_template"
R"w2c_template(#define MEM_ADDR(mem, addr, n) ((mem)->data_end - (addr) - (n))
)w2c_template"
R"w2c_template(#else
)w2c_template"
R"w2c_template(#define MEM_ADDR(mem, addr, n) &((mem)->data[addr])
)w2c_template"
R"w2c_template(#endif
)w2c_template"
R"w2c_template(
// We can only use Segue for this module if it uses a single unshared,
const char* s_source_declarations = R"w2c_template(// We can only use Segue for this module if it uses a single unshared,
)w2c_template"
R"w2c_template(// default-page, 32-bit imported or exported memory.
)w2c_template"
Expand All @@ -64,7 +22,7 @@ R"w2c_template(#endif
R"w2c_template(
#if WASM_RT_USE_LOCAL_MEMORY_BASE_SIZE && WASM_RT_USE_MMAP && \
)w2c_template"
R"w2c_template( IS_SINGLE_UNSHARED_DEFAULT32_MEMORY && !WABT_BIG_ENDIAN
R"w2c_template( IS_SINGLE_UNSHARED_DEFAULT32_MEMORY
)w2c_template"
R"w2c_template(#define WASM_RT_USE_LOCAL_MEMORY_BASE_SIZE_FOR_THIS_MODULE 1
)w2c_template"
Expand Down Expand Up @@ -121,15 +79,15 @@ R"w2c_template( }
)w2c_template"
R"w2c_template(}
)w2c_template"
R"w2c_template(#define MEM_ADDR_MEMOP(mem, addr, n) ((uint8_t __seg_gs*)(uintptr_t)addr)
R"w2c_template(#define MEM_ADDR_MEMOP(mem, addr) ((uint8_t __seg_gs*)(uintptr_t)addr)
)w2c_template"
R"w2c_template(#elif WASM_RT_USE_LOCAL_MEMORY_BASE_SIZE_FOR_THIS_MODULE
)w2c_template"
R"w2c_template(#define MEM_ADDR_MEMOP(mem, addr, n) (&wasm_rt_local_memory_base[(addr)])
R"w2c_template(#define MEM_ADDR_MEMOP(mem, addr) (&wasm_rt_local_memory_base[(addr)])
)w2c_template"
R"w2c_template(#else
)w2c_template"
R"w2c_template(#define MEM_ADDR_MEMOP(mem, addr, n) MEM_ADDR(mem, addr, n)
R"w2c_template(#define MEM_ADDR_MEMOP(mem, addr) (&(mem)->data[addr])
)w2c_template"
R"w2c_template(#endif
)w2c_template"
Expand Down Expand Up @@ -414,38 +372,90 @@ R"w2c_template( "Either enable specify -DWASM_RT_NONCONFORMING_ALLOW_OOB_READ_
R"w2c_template(#endif
)w2c_template"
R"w2c_template(
static inline void load_data(u8* dest, const u8* src, size_t n) {
#define WASM_ADJUST_ENDIAN_u8(value) (value)
)w2c_template"
R"w2c_template( if (!n) {
R"w2c_template(#define WASM_ADJUST_ENDIAN_s8(value) (value)
)w2c_template"
R"w2c_template( return;
R"w2c_template(#if WABT_BIG_ENDIAN
)w2c_template"
R"w2c_template( }
R"w2c_template(#define WASM_ADJUST_ENDIAN_u16 htole16
)w2c_template"
R"w2c_template(#if WABT_BIG_ENDIAN
R"w2c_template(#define WASM_ADJUST_ENDIAN_s16 htole16
)w2c_template"
R"w2c_template( for (size_t i = 0; i < n; i++) {
R"w2c_template(#define WASM_ADJUST_ENDIAN_u32 htole32
)w2c_template"
R"w2c_template( dest[i] = src[n - i - 1];
R"w2c_template(#define WASM_ADJUST_ENDIAN_s32 htole32
)w2c_template"
R"w2c_template( }
R"w2c_template(#define WASM_ADJUST_ENDIAN_u64 htole64
)w2c_template"
R"w2c_template(static inline f32 WASM_ADJUST_ENDIAN_f32(f32 value) {
)w2c_template"
R"w2c_template( u32 bits;
)w2c_template"
R"w2c_template( wasm_rt_memcpy(&bits, &value, sizeof(bits));
)w2c_template"
R"w2c_template( bits = htole32(bits);
)w2c_template"
R"w2c_template( wasm_rt_memcpy(&value, &bits, sizeof(value));
)w2c_template"
R"w2c_template( return value;
)w2c_template"
R"w2c_template(}
)w2c_template"
R"w2c_template(
static inline f64 WASM_ADJUST_ENDIAN_f64(f64 value) {
)w2c_template"
R"w2c_template( u64 bits;
)w2c_template"
R"w2c_template( wasm_rt_memcpy(&bits, &value, sizeof(bits));
)w2c_template"
R"w2c_template( bits = htole64(bits);
)w2c_template"
R"w2c_template( wasm_rt_memcpy(&value, &bits, sizeof(value));
)w2c_template"
R"w2c_template( return value;
)w2c_template"
R"w2c_template(}
)w2c_template"
R"w2c_template(#else
)w2c_template"
R"w2c_template( wasm_rt_memcpy(dest, src, n);
R"w2c_template(#define WASM_ADJUST_ENDIAN_u16(value) (value)
)w2c_template"
R"w2c_template(#define WASM_ADJUST_ENDIAN_s16(value) (value)
)w2c_template"
R"w2c_template(#define WASM_ADJUST_ENDIAN_u32(value) (value)
)w2c_template"
R"w2c_template(#define WASM_ADJUST_ENDIAN_s32(value) (value)
)w2c_template"
R"w2c_template(#define WASM_ADJUST_ENDIAN_u64(value) (value)
)w2c_template"
R"w2c_template(#define WASM_ADJUST_ENDIAN_f32(value) (value)
)w2c_template"
R"w2c_template(#define WASM_ADJUST_ENDIAN_f64(value) (value)
)w2c_template"
R"w2c_template(#endif
)w2c_template"
R"w2c_template(
static inline void load_data(u8* dest, const u8* src, size_t n) {
)w2c_template"
R"w2c_template( if (!n) {
)w2c_template"
R"w2c_template( return;
)w2c_template"
R"w2c_template( }
)w2c_template"
R"w2c_template( wasm_rt_memcpy(dest, src, n);
)w2c_template"
R"w2c_template(}
)w2c_template"
R"w2c_template(
#define LOAD_DATA(m, o, i, s) \
#define LOAD_DATA(m, o, i, s) \
)w2c_template"
R"w2c_template( do { \
R"w2c_template( do { \
)w2c_template"
R"w2c_template( RANGE_CHECK((&m), o, s); \
R"w2c_template( RANGE_CHECK((&m), o, s); \
)w2c_template"
R"w2c_template( load_data(MEM_ADDR(&m, o, s), i, s); \
R"w2c_template( load_data(&(m).data[o], i, s); \
)w2c_template"
R"w2c_template( } while (0)
)w2c_template"
Expand Down Expand Up @@ -553,9 +563,9 @@ R"w2c_template( wasm_rt_memory_t* mem, u64 ad
)w2c_template"
R"w2c_template( t1 result; \
)w2c_template"
R"w2c_template( wasm_rt_memcpy(&result, MEM_ADDR_MEMOP(mem, addr, sizeof(t1)), \
R"w2c_template( wasm_rt_memcpy(&result, MEM_ADDR_MEMOP(mem, addr), sizeof(t1)); \
)w2c_template"
R"w2c_template( sizeof(t1)); \
R"w2c_template( result = WASM_ADJUST_ENDIAN_##t1(result); \
)w2c_template"
R"w2c_template( t3 ret = (t3)(t2)result; \
)w2c_template"
Expand All @@ -578,9 +588,9 @@ R"w2c_template( u64 addr, t2 value) {
)w2c_template"
R"w2c_template( t1 wrapped = (t1)value; \
)w2c_template"
R"w2c_template( wasm_rt_memcpy(MEM_ADDR_MEMOP(mem, addr, sizeof(t1)), &wrapped, \
R"w2c_template( wrapped = WASM_ADJUST_ENDIAN_##t1(wrapped); \
)w2c_template"
R"w2c_template( sizeof(t1)); \
R"w2c_template( wasm_rt_memcpy(MEM_ADDR_MEMOP(mem, addr), &wrapped, sizeof(t1)); \
)w2c_template"
R"w2c_template( } \
)w2c_template"
Expand Down Expand Up @@ -1260,7 +1270,7 @@ static inline void memory_fill(wasm_rt_memory_t* mem, u64 d, u32 val, u64 n) {
)w2c_template"
R"w2c_template( RANGE_CHECK(mem, d, n);
)w2c_template"
R"w2c_template( memset(MEM_ADDR(mem, d, n), val, n);
R"w2c_template( memset(&mem->data[d], val, n);
)w2c_template"
R"w2c_template(}
)w2c_template"
Expand All @@ -1279,7 +1289,7 @@ R"w2c_template( RANGE_CHECK(dest, dest_addr, n);
)w2c_template"
R"w2c_template( RANGE_CHECK(src, src_addr, n);
)w2c_template"
R"w2c_template( memmove(MEM_ADDR(dest, dest_addr, n), MEM_ADDR(src, src_addr, n), n);
R"w2c_template( memmove(&dest->data[dest_addr], &src->data[src_addr], n);
)w2c_template"
R"w2c_template(}
)w2c_template"
Expand Down
Loading