}
u32 elem_size = type_size_of(elem_type);
+ // :32BitPointers
u64 lptr_local = local_raw_allocate(mod->local_alloc, WASM_TYPE_INT32);
emit_location(mod, &code, left);
if (type->kind == Type_Kind_Array) {
if (offset != 0) {
+ // :32BitPointers
WID(WI_I32_CONST, offset);
WI(WI_I32_ADD);
}
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);
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);
emit_leave_structured_block(mod, &code);
+ // :32BitPointers
WIL(WI_LOCAL_GET, ptr_local);
WIL(WI_I32_CONST, elem_size);
WI(WI_I32_ADD);
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);
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);
emit_leave_structured_block(mod, &code);
+ // :32BitPointers
WIL(WI_LOCAL_GET, ptr_local);
WIL(WI_I32_CONST, elem_size);
WI(WI_I32_ADD);
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);
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);
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);
}
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);
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);
}
if (needs_stack) {
+ // :32BitPointers
WID(WI_GLOBAL_GET, stack_top_idx);
WID(WI_I32_CONST, stack_grow_amm);
WI(WI_I32_SUB);
emit_expression(mod, &code, aa->expr);
if (aa->elem_size != 1) {
+ // :32BitPointers
WID(WI_I32_CONST, aa->elem_size);
WI(WI_I32_MUL);
}
} else {
emit_expression(mod, &code, aa->addr);
}
+
+ // :32BitPointers
WI(WI_I32_ADD);
*offset_return += offset;
EMIT_FUNC(memory_reservation_location, AstMemRes* memres) {
bh_arr(WasmInstruction) code = *pcode;
+ // :32BitPointers
WID(WI_I32_CONST, memres->addr);
*pcode = code;
}
WIL(WI_LOCAL_GET, mod->stack_base_idx);
+ // :32BitPointers
WIL(WI_I32_CONST, local_offset);
WI(WI_I32_ADD);
case Ast_Kind_Memres: {
AstMemRes* memres = (AstMemRes *) expr;
+ // :32BitPointers
WID(WI_I32_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);
}
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);
}
}
case Ast_Kind_StrLit: {
+ // :32BitPointers
WID(WI_I32_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;
}
// CLEANUP structs-by-value
if (field->expr->kind == Ast_Kind_Param) {
- AstLocal* param = (AstLocal *) field->expr;
-
- if (type_get_param_pass(param->type) == Param_Pass_By_Value && !type_is_pointer(param->type)) {
+ if (type_get_param_pass(field->expr->type) == Param_Pass_By_Value && !type_is_pointer(field->expr->type)) {
u64 localidx = bh_imap_get(&mod->local_map, (u64) field->expr) + field->idx;
WIL(WI_LOCAL_GET, localidx);
break;
// HACK
+ // This is only used in the weird case where you write something like this:
+ //
+ // data_ptr := "Test string".data;
+ // string_count := "Some other string".count;
+ //
+ // I don't think this is every used in the core libraries or anything written in
+ // Onyx yet, so this might go away at some point. Actually, thinking about it,
+ // I think accessing fields on r-values is completely disabled currently, so this
+ // is never possible.
+ //
+ // I think a more general case of accessing fields on r-values is better. For example,
+ //
+ // returns_foo :: proc () -> Foo { ... }
+ //
+ // value := returns_foo().foo_member;
+ //
+ // This does not work in the language at the moment, but maybe should?
+ /*
else if (field->expr->kind == Ast_Kind_StrLit) {
StructMember smem;
break;
}
+ */
u64 offset = 0;
emit_field_access_location(mod, &code, field, &offset);
case Ast_Kind_Enum_Value: {
AstEnumValue* ev = (AstEnumValue *) expr;
WasmType backing_type = onyx_type_to_wasm_type(ev->type);
- if (backing_type == WASM_TYPE_INT32) {
- WID(WI_I32_CONST, ev->value->value.i);
- }
- else if (backing_type == WASM_TYPE_INT64) {
- WID(WI_I64_CONST, ev->value->value.l);
- }
- else {
- onyx_report_error(ev->token->pos, "Invalid backing type for enum.");
- }
+ if (backing_type == WASM_TYPE_INT32) WID(WI_I32_CONST, ev->value->value.i);
+ else if (backing_type == WASM_TYPE_INT64) WID(WI_I64_CONST, ev->value->value.l);
+ else onyx_report_error(ev->token->pos, "Invalid backing type for enum.");
break;
}
case Ast_Kind_File_Contents: {
AstFileContents* fc = (AstFileContents *) expr;
+ // :32BitPointers
WID(WI_I32_CONST, fc->addr);
WID(WI_I32_CONST, fc->size);
break;