summaryrefslogtreecommitdiff
path: root/src/template/wasm2c.declarations.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/template/wasm2c.declarations.c')
-rw-r--r--src/template/wasm2c.declarations.c81
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;