From b095aedd386e076d1f5a56b7384b836e653387d1 Mon Sep 17 00:00:00 2001 From: dec05eba Date: Tue, 17 Sep 2019 01:28:55 +0200 Subject: Add support for r8-r15 registers, pass args to registers directly (sys-v) --- src/program.c | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) (limited to 'src/program.c') diff --git a/src/program.c b/src/program.c index 63d2b6e..128f0f9 100644 --- a/src/program.c +++ b/src/program.c @@ -570,26 +570,30 @@ static CHECK_RESULT int amal_program_read_instructions(amal_program *self, amal_ self->read_index += 1; break; } + case AMAL_OP_CALL_START: { + u8 num_args = self->data.data[self->read_index]; + return_if_error(amal_exec_call_start(executor, num_args)); + self->read_index += 1; + break; + } case AMAL_OP_CALL: { u8 import_index; u16 func_index; - u8 num_args; BytecodeHeaderFunction func_def; i8 dst_reg; am_memcpy(&import_index, self->data.data + self->read_index, sizeof(import_index)); am_memcpy(&func_index, self->data.data + self->read_index + sizeof(import_index), sizeof(func_index)); - am_memcpy(&num_args, self->data.data + self->read_index + sizeof(import_index) + sizeof(func_index), sizeof(num_args)); amal_program_get_header_function_by_index(self, import_index, func_index, &func_def); assert(func_def.num_return_types == 1 && "TODO: Support 0 and more than 1 return values"); assert(self->return_value_index == 1); dst_reg = self->return_values_stack[0]; - self->return_value_index -= func_def.num_return_types; + self->return_value_index = 0; /* func_offset will only be non-zero when the function has been decoded (FUNC_START) */ if(func_def.func_offset != 0) { /* TODO: Instead of pushing num args, push the sum of sizeof the last num_args */ - return_if_error(amal_exec_call(executor, func_def.func_offset, num_args, dst_reg)); + return_if_error(amal_exec_call(executor, func_def.func_offset, dst_reg)); } else { /* The code for the function has not been generated yet (the function is defined after the current location). @@ -609,24 +613,23 @@ static CHECK_RESULT int amal_program_read_instructions(amal_program *self, amal_ return_if_error(hash_map_insert(&self->deferred_func_calls, key_mem, &new_deferred_call_list)); } /* Dummy call to offset 0, offset will be replace later when the target function hits AMAL_OP_FUNC_START */ - return_if_error(amal_exec_call(executor, 0, num_args, dst_reg)); + return_if_error(amal_exec_call(executor, 0, dst_reg)); } - self->read_index += 4; + self->read_index += 3; break; } - case AMAL_OP_CALLR: + case AMAL_OP_CALLR: { assert(bool_false && "TODO: Implement CALLR"); - self->read_index += 2; + self->read_index += 1; break; + } case AMAL_OP_CALLE: { u8 import_index; u16 extern_func_index; - u8 num_args; i8 dst_reg; am_memcpy(&import_index, self->data.data + self->read_index, sizeof(import_index)); am_memcpy(&extern_func_index, self->data.data + self->read_index + sizeof(import_index), sizeof(extern_func_index)); - am_memcpy(&num_args, self->data.data + self->read_index + sizeof(import_index) + sizeof(extern_func_index), sizeof(num_args)); assert(self->return_value_index == 1 && "TODO: Support extern functions that don't return any value"); dst_reg = self->return_values_stack[0]; self->return_value_index = 0; @@ -634,9 +637,9 @@ static CHECK_RESULT int amal_program_read_instructions(amal_program *self, amal_ { ProgramExternFunc extern_func; return_if_error(amal_program_get_extern_func_by_index(self, import_index, extern_func_index, &extern_func)); - return_if_error(amal_exec_calle(executor, extern_func.func, num_args, dst_reg)); + return_if_error(amal_exec_calle(executor, extern_func.func, dst_reg)); } - self->read_index += 4; + self->read_index += 3; break; } case AMAL_OP_CMP: { -- cgit v1.2.3