#include "onyxwasm.h"
#include "onyxutils.h"
-// NOTE: Allows easier testing of types since most of the characters
-// corresponding to these values are not printable
-#if 1
#define WASM_TYPE_INT32 0x7F
#define WASM_TYPE_INT64 0x7E
#define WASM_TYPE_FLOAT32 0x7D
#define WASM_TYPE_FLOAT64 0x7C
#define WASM_TYPE_VAR128 0x7B
+#define WASM_TYPE_PTR WASM_TYPE_INT32
#define WASM_TYPE_VOID 0x00
-#else
-#define WASM_TYPE_INT32 'A'
-#define WASM_TYPE_INT64 'B'
-#define WASM_TYPE_FLOAT32 'C'
-#define WASM_TYPE_FLOAT64 'D'
-#define WASM_TYPE_VOID 'E'
-#endif
static WasmType onyx_type_to_wasm_type(Type* type) {
if (type->kind == Type_Kind_Struct) {
}
if (type->kind == Type_Kind_Pointer) {
- return WASM_TYPE_INT32;
+ return WASM_TYPE_PTR;
}
if (type->kind == Type_Kind_Array) {
- return WASM_TYPE_INT32;
+ return WASM_TYPE_PTR;
}
if (type->kind == Type_Kind_Function) {
}
u32 elem_size = type_size_of(elem_type);
- // :32BitPointers
- u64 lptr_local = local_raw_allocate(mod->local_alloc, WASM_TYPE_INT32);
+ u64 lptr_local = local_raw_allocate(mod->local_alloc, WASM_TYPE_PTR);
emit_location(mod, &code, left);
WIL(WI_LOCAL_SET, lptr_local);
emit_store_instruction(mod, &code, elem_type, i * elem_size);
}
- local_raw_free(mod->local_alloc, WASM_TYPE_INT32);
+ local_raw_free(mod->local_alloc, WASM_TYPE_PTR);
} else {
u64 offset = 0;
if (type->kind == Type_Kind_Array) {
if (offset != 0) {
- // :32BitPointers
- WID(WI_I32_CONST, offset);
- WI(WI_I32_ADD);
+ WID(WI_PTR_CONST, offset);
+ WI(WI_PTR_ADD);
}
*pcode = code;
bh_arr(WasmInstruction) code = *pcode;
u64 end_ptr_local, ptr_local;
- end_ptr_local = local_raw_allocate(mod->local_alloc, WASM_TYPE_INT32);
+ end_ptr_local = local_raw_allocate(mod->local_alloc, WASM_TYPE_PTR);
if (for_node->by_pointer) {
ptr_local = iter_local;
} else {
- ptr_local = local_raw_allocate(mod->local_alloc, WASM_TYPE_INT32);
+ ptr_local = local_raw_allocate(mod->local_alloc, WASM_TYPE_PTR);
}
AstLocal* var = for_node->var;
if (for_node->by_pointer) elem_size = type_size_of(var->type->Pointer.elem);
else elem_size = type_size_of(var->type);
- // :32BitPointers
WIL(WI_LOCAL_TEE, ptr_local);
- WIL(WI_I32_CONST, for_node->iter->type->Array.count * elem_size);
- WI(WI_I32_ADD);
+ WIL(WI_PTR_CONST, for_node->iter->type->Array.count * elem_size);
+ WI(WI_PTR_ADD);
WIL(WI_LOCAL_SET, end_ptr_local);
emit_enter_structured_block(mod, &code, SBT_Breakable_Block);
emit_enter_structured_block(mod, &code, SBT_Basic_Loop);
emit_enter_structured_block(mod, &code, SBT_Continue_Block);
- // :32BitPointers
WIL(WI_LOCAL_GET, ptr_local);
WIL(WI_LOCAL_GET, end_ptr_local);
- WI(WI_I32_GE_U);
+ WI(WI_PTR_GE);
WID(WI_COND_JUMP, 0x02);
if (!for_node->by_pointer) {
emit_leave_structured_block(mod, &code);
- // :32BitPointers
WIL(WI_LOCAL_GET, ptr_local);
- WIL(WI_I32_CONST, elem_size);
- WI(WI_I32_ADD);
+ WIL(WI_PTR_CONST, elem_size);
+ WI(WI_PTR_ADD);
WIL(WI_LOCAL_SET, ptr_local);
if (bh_arr_last(code).type != WI_JUMP)
emit_leave_structured_block(mod, &code);
emit_leave_structured_block(mod, &code);
- local_raw_free(mod->local_alloc, WASM_TYPE_INT32);
- if (!for_node->by_pointer) local_raw_free(mod->local_alloc, WASM_TYPE_INT32);
+ local_raw_free(mod->local_alloc, WASM_TYPE_PTR);
+ if (!for_node->by_pointer) local_raw_free(mod->local_alloc, WASM_TYPE_PTR);
*pcode = code;
}
bh_arr(WasmInstruction) code = *pcode;
u64 end_ptr_local, ptr_local;
- end_ptr_local = local_raw_allocate(mod->local_alloc, WASM_TYPE_INT32);
+ end_ptr_local = local_raw_allocate(mod->local_alloc, WASM_TYPE_PTR);
if (for_node->by_pointer) {
ptr_local = iter_local;
} else {
- ptr_local = local_raw_allocate(mod->local_alloc, WASM_TYPE_INT32);
+ ptr_local = local_raw_allocate(mod->local_alloc, WASM_TYPE_PTR);
}
AstLocal* var = for_node->var;
if (for_node->by_pointer) elem_size = type_size_of(var->type->Pointer.elem);
else elem_size = type_size_of(var->type);
- // :32BitPointers
WIL(WI_LOCAL_SET, end_ptr_local);
WIL(WI_LOCAL_TEE, ptr_local);
WIL(WI_LOCAL_GET, end_ptr_local);
if (elem_size != 1) {
- WID(WI_I32_CONST, elem_size);
- WI(WI_I32_MUL);
+ WID(WI_PTR_CONST, elem_size);
+ WI(WI_PTR_MUL);
}
- WI(WI_I32_ADD);
+ WI(WI_PTR_ADD);
WIL(WI_LOCAL_SET, end_ptr_local);
emit_enter_structured_block(mod, &code, SBT_Breakable_Block);
emit_enter_structured_block(mod, &code, SBT_Basic_Loop);
emit_enter_structured_block(mod, &code, SBT_Continue_Block);
- // :32BitPointers
WIL(WI_LOCAL_GET, ptr_local);
WIL(WI_LOCAL_GET, end_ptr_local);
- WI(WI_I32_GE_U);
+ WI(WI_PTR_GE);
WID(WI_COND_JUMP, 0x02);
if (!for_node->by_pointer) {
emit_leave_structured_block(mod, &code);
- // :32BitPointers
WIL(WI_LOCAL_GET, ptr_local);
- WIL(WI_I32_CONST, elem_size);
- WI(WI_I32_ADD);
+ WIL(WI_PTR_CONST, elem_size);
+ WI(WI_PTR_ADD);
WIL(WI_LOCAL_SET, ptr_local);
if (bh_arr_last(code).type != WI_JUMP)
emit_leave_structured_block(mod, &code);
emit_leave_structured_block(mod, &code);
- local_raw_free(mod->local_alloc, WASM_TYPE_INT32);
- if (!for_node->by_pointer) local_raw_free(mod->local_alloc, WASM_TYPE_INT32);
+ local_raw_free(mod->local_alloc, WASM_TYPE_PTR);
+ if (!for_node->by_pointer) local_raw_free(mod->local_alloc, WASM_TYPE_PTR);
*pcode = code;
}
if (place_on_stack) WID(WI_GLOBAL_GET, stack_top_idx);
if (stack_grow_amm != 0) {
- stack_top_store_local = local_raw_allocate(mod->local_alloc, WASM_TYPE_INT32);
+ stack_top_store_local = local_raw_allocate(mod->local_alloc, WASM_TYPE_PTR);
WID(WI_GLOBAL_GET, stack_top_idx);
WIL(WI_LOCAL_SET, stack_top_store_local);
- // :32BitPointers
WID(WI_GLOBAL_GET, stack_top_idx);
- WID(WI_I32_CONST, stack_grow_amm);
- WI(WI_I32_ADD);
+ WID(WI_PTR_CONST, stack_grow_amm);
+ WI(WI_PTR_ADD);
WID(WI_GLOBAL_SET, stack_top_idx);
}
WIL(WI_LOCAL_GET, stack_top_store_local);
WID(WI_GLOBAL_SET, stack_top_idx);
- local_raw_free(mod->local_alloc, WASM_TYPE_INT32);
+ local_raw_free(mod->local_alloc, WASM_TYPE_PTR);
}
if (place_on_stack) {
if (arg->va_kind != VA_Kind_Not_VA) vararg_count += 1;
else {
- // :32BitPointers
WID(WI_GLOBAL_GET, stack_top_idx);
- WID(WI_I32_CONST, stack_grow_amm);
- WI(WI_I32_ADD);
+ WID(WI_PTR_CONST, stack_grow_amm);
+ WI(WI_PTR_ADD);
}
stack_grow_amm += type_size_of(arg->value->type);
switch (call->va_kind) {
case VA_Kind_Typed: {
- // :32BitPointers
WID(WI_GLOBAL_GET, stack_top_idx);
- WID(WI_I32_CONST, vararg_offset);
- WI(WI_I32_ADD);
+ WID(WI_PTR_CONST, vararg_offset);
+ WI(WI_PTR_ADD);
WID(WI_I32_CONST, vararg_count);
break;
}
case VA_Kind_Untyped: {
- // :32BitPointers
WID(WI_GLOBAL_GET, stack_top_idx);
WID(WI_GLOBAL_GET, stack_top_idx);
- WID(WI_I32_CONST, vararg_offset);
- WI(WI_I32_ADD);
+ WID(WI_PTR_CONST, vararg_offset);
+ WI(WI_PTR_ADD);
emit_store_instruction(mod, &code, &basic_types[Basic_Kind_Rawptr], stack_grow_amm);
// NOTE: There will be 4 uninitialized bytes here, because pointers are only 4 bytes in WASM.
emit_store_instruction(mod, &code, &basic_types[Basic_Kind_I32], stack_grow_amm + 8);
WID(WI_GLOBAL_GET, stack_top_idx);
- WID(WI_I32_CONST, stack_grow_amm);
- WI(WI_I32_ADD);
+ WID(WI_PTR_CONST, stack_grow_amm);
+ WI(WI_PTR_ADD);
stack_grow_amm += 12;
break;
bh_align(stack_grow_amm, 16);
if (needs_stack) {
- // :32BitPointers
WID(WI_GLOBAL_GET, stack_top_idx);
- WID(WI_I32_CONST, stack_grow_amm);
- WI(WI_I32_ADD);
+ WID(WI_PTR_CONST, stack_grow_amm);
+ WI(WI_PTR_ADD);
WID(WI_GLOBAL_SET, stack_top_idx);
}
}
if (needs_stack) {
- // :32BitPointers
WID(WI_GLOBAL_GET, stack_top_idx);
- WID(WI_I32_CONST, stack_grow_amm);
- WI(WI_I32_SUB);
+ WID(WI_PTR_CONST, stack_grow_amm);
+ WI(WI_PTR_SUB);
WID(WI_GLOBAL_SET, stack_top_idx);
}
emit_expression(mod, &code, aa->expr);
if (aa->elem_size != 1) {
- // :32BitPointers
- WID(WI_I32_CONST, aa->elem_size);
- WI(WI_I32_MUL);
+ WID(WI_PTR_CONST, aa->elem_size);
+ WI(WI_PTR_MUL);
}
u64 offset = 0;
emit_expression(mod, &code, aa->addr);
}
- // :32BitPointers
- WI(WI_I32_ADD);
+ WI(WI_PTR_ADD);
*offset_return += offset;
EMIT_FUNC(memory_reservation_location, AstMemRes* memres) {
bh_arr(WasmInstruction) code = *pcode;
- // :32BitPointers
- WID(WI_I32_CONST, memres->addr);
+ WID(WI_PTR_CONST, memres->addr);
*pcode = code;
}
type_linear_member_lookup(type, 0, &two);
emit_load_instruction(mod, &code, two.type, offset + two.offset); // two.offset should be 0
} else {
- u64 tmp_idx = local_raw_allocate(mod->local_alloc, WASM_TYPE_INT32);
+ u64 tmp_idx = local_raw_allocate(mod->local_alloc, WASM_TYPE_PTR);
WIL(WI_LOCAL_TEE, tmp_idx);
fori (i, 0, mem_count) {
emit_load_instruction(mod, &code, two.type, offset + two.offset);
}
- local_raw_free(mod->local_alloc, WASM_TYPE_INT32);
+ local_raw_free(mod->local_alloc, WASM_TYPE_PTR);
}
*pcode = code;
TypeWithOffset two;
- u64 loc_idx = local_raw_allocate(mod->local_alloc, WASM_TYPE_INT32);
+ u64 loc_idx = local_raw_allocate(mod->local_alloc, WASM_TYPE_PTR);
if (location_first) WIL(WI_LOCAL_SET, loc_idx);
i32 elem_count = type_linear_member_count(type);
}
bh_arr_free(temp_locals);
- local_raw_free(mod->local_alloc, WASM_TYPE_INT32);
+ local_raw_free(mod->local_alloc, WASM_TYPE_PTR);
*pcode = code;
}
}
u32 elem_size = type_size_of(elem_type);
- u64 lptr_local = local_raw_allocate(mod->local_alloc, WASM_TYPE_INT32);
- u64 rptr_local = local_raw_allocate(mod->local_alloc, WASM_TYPE_INT32);
+ u64 lptr_local = local_raw_allocate(mod->local_alloc, WASM_TYPE_PTR);
+ u64 rptr_local = local_raw_allocate(mod->local_alloc, WASM_TYPE_PTR);
WIL(WI_LOCAL_SET, rptr_local);
WIL(WI_LOCAL_SET, lptr_local);
emit_store_instruction(mod, &code, elem_type, i * elem_size + offset);
}
- local_raw_free(mod->local_alloc, WASM_TYPE_INT32);
- local_raw_free(mod->local_alloc, WASM_TYPE_INT32);
+ local_raw_free(mod->local_alloc, WASM_TYPE_PTR);
+ local_raw_free(mod->local_alloc, WASM_TYPE_PTR);
*pcode = code;
return;
}
WIL(WI_LOCAL_GET, mod->stack_base_idx);
- // :32BitPointers
- WIL(WI_I32_CONST, local_offset);
- WI(WI_I32_ADD);
+ WIL(WI_PTR_CONST, local_offset);
+ WI(WI_PTR_ADD);
*pcode = code;
}
case Ast_Kind_Memres: {
AstMemRes* memres = (AstMemRes *) expr;
- // :32BitPointers
- WID(WI_I32_CONST, memres->addr);
+ WID(WI_PTR_CONST, memres->addr);
*offset_return = 0;
break;
}
u64 offset = 0;
emit_location_return_offset(mod, &code, expr, &offset);
if (offset != 0) {
- // :32BitPointers
- WID(WI_I32_CONST, offset);
- WI(WI_I32_ADD);
+ WID(WI_PTR_CONST, offset);
+ WI(WI_PTR_ADD);
}
*pcode = code;
if (expr->type->kind != Type_Kind_Array) {
emit_load_instruction(mod, &code, expr->type, offset);
} else if (offset != 0) {
- // :32BitPointers
- WID(WI_I32_CONST, offset);
- WI(WI_I32_ADD);
+ WID(WI_PTR_CONST, offset);
+ WI(WI_PTR_ADD);
}
}
}
case Ast_Kind_StrLit: {
- // :32BitPointers
- WID(WI_I32_CONST, ((AstStrLit *) expr)->addr);
+ WID(WI_PTR_CONST, ((AstStrLit *) expr)->addr);
WID(WI_I32_CONST, ((AstStrLit *) expr)->length);
break;
}
case Ast_Kind_Function: {
i32 elemidx = get_element_idx(mod, (AstFunction *) expr);
- // :32BitPointers
WID(WI_I32_CONST, elemidx);
break;
}
case Ast_Kind_File_Contents: {
AstFileContents* fc = (AstFileContents *) expr;
- // :32BitPointers
- WID(WI_I32_CONST, fc->addr);
+ WID(WI_PTR_CONST, fc->addr);
WID(WI_I32_CONST, fc->size);
break;
}
// NOTE: '5' needs to match the number of instructions it takes
// to setup a stack frame
bh_arr_insert_end(wasm_func.code, 5);
- mod->stack_base_idx = local_raw_allocate(mod->local_alloc, WASM_TYPE_INT32);
+ mod->stack_base_idx = local_raw_allocate(mod->local_alloc, WASM_TYPE_PTR);
}
// Generate code
}
-#include "onyxwasm_output.c"
\ No newline at end of file
+#include "onyxwasm_output.c"