Loads and stores for different sizes
This commit is contained in:
@@ -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;
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user