Loads and stores for different sizes

This commit is contained in:
Krzosa Karol
2022-06-23 00:03:02 +02:00
parent ce46eb5a8f
commit f7e03e5d2a
2 changed files with 125 additions and 60 deletions

View File

@@ -143,13 +143,25 @@ typedef S32 Register_Index;
union Register{ union Register{
F64 f64; F64 f64;
S64 s64; S64 s64;
U64 *pointer_u64;
U64 u64;
S64 *pointer_s64; S64 *pointer_s64;
F64 *pointer_f64; F64 *pointer_f64;
U64 *pointer64;
U8 *pointer; U8 *pointer;
U64 *pointer64;
U64 *pointer_u64;
U32 *pointer_u32;
U16 *pointer_u16;
U8 *pointer_u8;
U64 u64;
U32 u32;
U16 u16;
U8 u8;
}; };
static_assert(sizeof(Register) == 8, "not 8 bytes");
struct Instruction{ struct Instruction{
Operation operation; Operation operation;
@@ -368,17 +380,6 @@ run_bytecode_interp(Bc *b){
bc_log("i%u[0x%llx] %s ", instr->di, instr, op_name[instr->operation]); bc_log("i%u[0x%llx] %s ", instr->di, instr, op_name[instr->operation]);
switch(instr->operation){ switch(instr->operation){
invalid_default_case; invalid_default_case;
case BC_LOAD_FROM_MEMORY64:{
U64 *load_address = b->registers[instr->index_a].pointer64;
b->registers[instr->index_c].u64 = *load_address;
bc_log("load_address[r%u, %llx] dst[r%u] [0x%llx|%lld|%f]", instr->index_a, load_address, instr->index_c, b->registers[instr->index_c].u64, b->registers[instr->index_c].u64, b->registers[instr->index_c].u64);
}break;
case BC_STORE_TO_MEMORY64:{
U64 *store_address = b->registers[instr->index_c].pointer64;
*store_address = b->registers[instr->index_a].u64;
bc_log("src[r%u] store_address[r%u, %llx] value_written[0x%llx|%lld|%f]", instr->index_a, instr->index_c, store_address, *store_address, *store_address, *store_address);
}break;
case BC_PUSH_STACK:{ case BC_PUSH_STACK:{
U64 *stack = b->stack_pointer++; U64 *stack = b->stack_pointer++;
@@ -415,6 +416,54 @@ run_bytecode_interp(Bc *b){
// *Begin* of switch_cases generated using code_generating_script.py // *Begin* of switch_cases generated using code_generating_script.py
// //
case BC_LOAD_FROM_MEMORY64:{
U64 *load_address = b->registers[instr->index_a].pointer_u64;
b->registers[instr->index_c].u64 = *load_address;
bc_log("load_address[r%u, %llx] dst[r%u] [0x%llx|%lld|%f]", instr->index_a, load_address, instr->index_c, b->registers[instr->index_c].u64, b->registers[instr->index_c].u64, b->registers[instr->index_c].u64);
}break;
case BC_STORE_TO_MEMORY64:{
U64 *store_address = b->registers[instr->index_c].pointer_u64;
*store_address = b->registers[instr->index_a].u64;
bc_log("src[r%u] store_address[r%u, %llx] value_written[0x%llx|%lld|%f]", instr->index_a, instr->index_c, store_address, *store_address, *store_address, *store_address);
}break;
case BC_LOAD_FROM_MEMORY32:{
U32 *load_address = b->registers[instr->index_a].pointer_u32;
b->registers[instr->index_c].u32 = *load_address;
bc_log("load_address[r%u, %llx] dst[r%u] [0x%llx|%lld|%f]", instr->index_a, load_address, instr->index_c, b->registers[instr->index_c].u32, b->registers[instr->index_c].u32, b->registers[instr->index_c].u32);
}break;
case BC_STORE_TO_MEMORY32:{
U32 *store_address = b->registers[instr->index_c].pointer_u32;
*store_address = b->registers[instr->index_a].u32;
bc_log("src[r%u] store_address[r%u, %llx] value_written[0x%llx|%lld|%f]", instr->index_a, instr->index_c, store_address, *store_address, *store_address, *store_address);
}break;
case BC_LOAD_FROM_MEMORY16:{
U16 *load_address = b->registers[instr->index_a].pointer_u16;
b->registers[instr->index_c].u16 = *load_address;
bc_log("load_address[r%u, %llx] dst[r%u] [0x%llx|%lld|%f]", instr->index_a, load_address, instr->index_c, b->registers[instr->index_c].u16, b->registers[instr->index_c].u16, b->registers[instr->index_c].u16);
}break;
case BC_STORE_TO_MEMORY16:{
U16 *store_address = b->registers[instr->index_c].pointer_u16;
*store_address = b->registers[instr->index_a].u16;
bc_log("src[r%u] store_address[r%u, %llx] value_written[0x%llx|%lld|%f]", instr->index_a, instr->index_c, store_address, *store_address, *store_address, *store_address);
}break;
case BC_LOAD_FROM_MEMORY8:{
U8 *load_address = b->registers[instr->index_a].pointer_u8;
b->registers[instr->index_c].u8 = *load_address;
bc_log("load_address[r%u, %llx] dst[r%u] [0x%llx|%lld|%f]", instr->index_a, load_address, instr->index_c, b->registers[instr->index_c].u8, b->registers[instr->index_c].u8, b->registers[instr->index_c].u8);
}break;
case BC_STORE_TO_MEMORY8:{
U8 *store_address = b->registers[instr->index_c].pointer_u8;
*store_address = b->registers[instr->index_a].u8;
bc_log("src[r%u] store_address[r%u, %llx] value_written[0x%llx|%lld|%f]", instr->index_a, instr->index_c, store_address, *store_address, *store_address, *store_address);
}break;
case BC_ADD_S64:{ case BC_ADD_S64:{
S64 left = b->registers[instr->index_a].s64; S64 left = b->registers[instr->index_a].s64;
S64 right = b->registers[instr->index_b].s64; S64 right = b->registers[instr->index_b].s64;

View File

@@ -90,6 +90,22 @@ if True:
# #
if True: if True:
result = "" result = ""
for size in sizes:
result += f"""
case BC_LOAD_FROM_MEMORY{size}:{{
U{size} *load_address = b->registers[instr->index_a].pointer{size};
b->registers[instr->index_c].u{size} = *load_address;
bc_log("load_address[r%u, %llx] dst[r%u] [0x%llx|%lld|%f]", instr->index_a, load_address, instr->index_c, b->registers[instr->index_c].u{size}, b->registers[instr->index_c].u{size}, b->registers[instr->index_c].u{size});
}}break;
case BC_STORE_TO_MEMORY{size}:{{
U{size} *store_address = b->registers[instr->index_c].pointer{size};
*store_address = b->registers[instr->index_a].u{size};
bc_log("src[r%u] store_address[r%u, %llx] value_written[0x%llx|%lld|%f]", instr->index_a, instr->index_c, store_address, *store_address, *store_address, *store_address);
}}break;
"""
for sign, T in zip(print_sign, types): for sign, T in zip(print_sign, types):
t = T.lower() t = T.lower()