update opcodes to handle memory better
This commit is contained in:
parent
6be5a4d3f9
commit
aa16b6b348
|
@ -17,8 +17,9 @@ typedef enum {
|
|||
OP_MEM_SWAP, /* mswp : &dest = &src1, &src1 = &dest */
|
||||
OP_MEM_MOV, /* mmov : &dest = &src1 */
|
||||
OP_MEM_ALLOC, /* aloc : dest [next memory location as size] */
|
||||
OP_REF, /* ref : dest = &memory[src1] */
|
||||
OP_DEREF, /* dref : dest = memory[src1] */
|
||||
OP_GET, /* get : dest = ptr : dest = memory[ptr] */
|
||||
OP_PUT, /* put : ptr = src1 : memory[ptr] = src */
|
||||
OP_OFFSET, /* offs : dest = ptr + src1 : dest = p + o */
|
||||
OP_SYSCALL, /* sysc : */
|
||||
OP_ADD_INT, /* addi : dest = src1 + src2 */
|
||||
OP_SUB_INT, /* subi : dest = src1 - src2 */
|
||||
|
|
69
src/vm.c
69
src/vm.c
|
@ -108,6 +108,23 @@ bool step_vm(VM *vm) {
|
|||
vm->memory[ptr] = vm->frames[vm->fp].registers[src1];
|
||||
return true;
|
||||
}
|
||||
case OP_PUT: {
|
||||
uint32_t addr = vm->frames[vm->fp].registers[dest].u;
|
||||
vm->memory[addr] = vm->frames[vm->fp].registers[src1];
|
||||
return true;
|
||||
}
|
||||
case OP_GET: {
|
||||
uint32_t addr = vm->frames[vm->fp].registers[src1].u;
|
||||
vm->frames[vm->fp].registers[dest] = vm->memory[addr];
|
||||
return true;
|
||||
}
|
||||
case OP_OFFSET: {
|
||||
uint32_t ptr = vm->frames[vm->fp].registers[src1].u;
|
||||
uint32_t offset = vm->frames[vm->fp].registers[src2].u;
|
||||
uint32_t result = ptr + offset;
|
||||
vm->frames[vm->fp].registers[dest].u = result;
|
||||
return true;
|
||||
}
|
||||
case OP_PUSH: {
|
||||
vm->stack[++vm->sp] = vm->frames[vm->fp].registers[dest];
|
||||
return true;
|
||||
|
@ -116,6 +133,33 @@ bool step_vm(VM *vm) {
|
|||
vm->frames[vm->fp].registers[dest] = vm->stack[vm->sp--];
|
||||
return true;
|
||||
}
|
||||
case OP_MEM_ALLOC: {
|
||||
uint32_t mem_dest = (uint32_t)vm->frames[vm->fp]
|
||||
.allocated.end; /* get start of unallocated */
|
||||
vm->frames[vm->fp].registers[dest].u =
|
||||
mem_dest; /* store ptr of array to dest register */
|
||||
uint32_t size = (uint32_t)vm->frames[vm->fp].registers[src1].u;
|
||||
vm->memory[mem_dest].u = size;
|
||||
vm->frames[vm->fp].allocated.end +=
|
||||
size; /* increment to end of allocated */
|
||||
return true;
|
||||
}
|
||||
case OP_MEM_MOV: {
|
||||
uint32_t dest_addr = (uint32_t)vm->frames[vm->fp].registers[dest].u;
|
||||
uint32_t src_addr = (uint32_t)vm->frames[vm->fp].registers[src1].u;
|
||||
vm->memory[dest_addr] = vm->memory[src_addr];
|
||||
return true;
|
||||
}
|
||||
case OP_MEM_SWAP: {
|
||||
uint32_t dest_addr = (uint32_t)vm->frames[vm->fp].registers[dest].u;
|
||||
uint32_t src_addr = (uint32_t)vm->frames[vm->fp].registers[src1].u;
|
||||
vm->memory[dest_addr].u ^= vm->memory[src_addr].u;
|
||||
vm->memory[src_addr].u ^= vm->memory[dest_addr].u;
|
||||
vm->memory[dest_addr].u ^= vm->memory[src_addr].u;
|
||||
return true;
|
||||
}
|
||||
case OP_SYSCALL: {
|
||||
}
|
||||
case OP_ADD_INT:
|
||||
MATH_OP(i, +);
|
||||
case OP_SUB_INT:
|
||||
|
@ -316,31 +360,6 @@ bool step_vm(VM *vm) {
|
|||
vm->memory[dest].u = equal;
|
||||
return true;
|
||||
}
|
||||
case OP_MEM_ALLOC: {
|
||||
uint32_t mem_dest = (uint32_t)vm->frames[vm->fp]
|
||||
.allocated.end; /* get start of unallocated */
|
||||
vm->frames[vm->fp].registers[dest].u =
|
||||
mem_dest; /* store ptr of array to dest register */
|
||||
uint32_t size = (uint32_t)vm->frames[vm->fp].registers[src1].u;
|
||||
vm->memory[mem_dest].u = size;
|
||||
vm->frames[vm->fp].allocated.end +=
|
||||
size; /* increment to end of allocated */
|
||||
return true;
|
||||
}
|
||||
case OP_MEM_MOV: {
|
||||
uint32_t dest_addr = (uint32_t)vm->frames[vm->fp].registers[dest].u;
|
||||
uint32_t src_addr = (uint32_t)vm->frames[vm->fp].registers[src1].u;
|
||||
vm->memory[dest_addr] = vm->memory[src_addr];
|
||||
return true;
|
||||
}
|
||||
case OP_MEM_SWAP: {
|
||||
uint32_t dest_addr = (uint32_t)vm->frames[vm->fp].registers[dest].u;
|
||||
uint32_t src_addr = (uint32_t)vm->frames[vm->fp].registers[src1].u;
|
||||
vm->memory[dest_addr].u ^= vm->memory[src_addr].u;
|
||||
vm->memory[src_addr].u ^= vm->memory[dest_addr].u;
|
||||
vm->memory[dest_addr].u ^= vm->memory[src_addr].u;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
return false; /* something bad happened */
|
||||
}
|
||||
|
|
|
@ -3,8 +3,9 @@ do (int i = 50000, 0, -1) {
|
|||
a = a + 5.0;
|
||||
}
|
||||
int b = a as nat;
|
||||
print("Enter a string:");
|
||||
str user_string = gets();
|
||||
print(a.toS());
|
||||
print(b.toS());
|
||||
print(user_string);
|
||||
print "Enter a string:");
|
||||
str user_string = read();
|
||||
print a.str;
|
||||
print b.str;
|
||||
print user_string;
|
||||
|
||||
|
|
Loading…
Reference in New Issue