diff options
Diffstat (limited to 'src/template/wasm2c.declarations.c')
-rw-r--r-- | src/template/wasm2c.declarations.c | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/src/template/wasm2c.declarations.c b/src/template/wasm2c.declarations.c index 4459790f..8e1e1d3c 100644 --- a/src/template/wasm2c.declarations.c +++ b/src/template/wasm2c.declarations.c @@ -444,4 +444,85 @@ static float wasm_sqrtf(float x) { return sqrtf(x); } +static inline void memory_fill(wasm_rt_memory_t* mem, u32 d, u32 val, u32 n) { + RANGE_CHECK(mem, d, n); + memset(mem->data + d, val, n); +} + +static inline void memory_copy(wasm_rt_memory_t* dest, + const wasm_rt_memory_t* src, + u32 dest_addr, + u32 src_addr, + u32 n) { + RANGE_CHECK(dest, dest_addr, n); + RANGE_CHECK(src, src_addr, n); + memmove(dest->data + dest_addr, src->data + src_addr, n); +} + +static inline void memory_init(wasm_rt_memory_t* dest, + const u8* src, + u32 src_size, + u32 dest_addr, + u32 src_addr, + u32 n) { + if (UNLIKELY(src_addr + (uint64_t)n > src_size)) + TRAP(OOB); + LOAD_DATA((*dest), dest_addr, src + src_addr, n); +} + +typedef struct { + uint32_t func_type_index; + wasm_rt_funcref_t func; + size_t module_offset; +} wasm_elem_segment_expr_t; + +static inline void table_init(wasm_rt_table_t* dest, + const wasm_elem_segment_expr_t* src, + u32 src_size, + u32 dest_addr, + u32 src_addr, + u32 n, + void* module_instance, + const u32* func_types) { + if (UNLIKELY(src_addr + (uint64_t)n > src_size)) + TRAP(OOB); + if (UNLIKELY(dest_addr + (uint64_t)n > dest->size)) + TRAP(OOB); + for (u32 i = 0; i < n; i++) { + const wasm_elem_segment_expr_t* src_expr = &src[src_addr + i]; + dest->data[dest_addr + i] = + (wasm_rt_elem_t){func_types[src_expr->func_type_index], src_expr->func, + (char*)module_instance + src_expr->module_offset}; + } +} + +static inline void table_copy(wasm_rt_table_t* dest, + const wasm_rt_table_t* src, + u32 dest_addr, + u32 src_addr, + u32 n) { + if (UNLIKELY(dest_addr + (uint64_t)n > dest->size)) + TRAP(OOB); + if (UNLIKELY(src_addr + (uint64_t)n > src->size)) + TRAP(OOB); + + if (n == 0) { + return; + } + + if (dest->data + dest_addr == src->data + src_addr) { + return; + } + + if (dest->data + dest_addr < src->data + src_addr) { + for (u32 i = 0; i < n; i++) { + dest->data[dest_addr + i] = src->data[src_addr + i]; + } + } else { + for (u32 i = n; i > 0; i--) { + dest->data[dest_addr + i - 1] = src->data[src_addr + i - 1]; + } + } +} + static bool s_module_initialized = false; |