add int2float and float2int conversion ops
This commit is contained in:
parent
af01b5afae
commit
39b6a1f15f
28
src/vm.c
28
src/vm.c
|
@ -1,4 +1,3 @@
|
|||
#include <errno.h>
|
||||
#include <stdbool.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
|
@ -24,7 +23,9 @@ typedef enum {
|
|||
OP_SUB_F32, /* dest = src1 - src2 */
|
||||
OP_MUL_F32, /* dest = src1 * src2 */
|
||||
OP_DIV_F32, /* dest = src1 / src2 */
|
||||
OP_MOV, /* dest = src1 */
|
||||
OP_F32_TO_INT, /* dest = src1 as int */
|
||||
OP_INT_TO_F32, /* dest = src1 as f32 */
|
||||
OP_MOV, /* dest = src1 */
|
||||
OP_JMP, /* jump to address src1 unconditionally */
|
||||
OP_JGZ, /* jump to address dest if src1 > 0 */
|
||||
OP_INT_TO_STRING, /* dest = src1 as str */
|
||||
|
@ -69,7 +70,7 @@ void pack_string(const char *str, uint32_t length, uint32_t dest_addr) {
|
|||
uint32_t i = 0;
|
||||
while (i < length) {
|
||||
char ch = str[i++];
|
||||
if (ch == '\0' || ch == EOF) {
|
||||
if (ch == '\0') {
|
||||
uint32_t word = memory[buffer_addr + word_index].u;
|
||||
word = set_char(word, char_index, '\0');
|
||||
memory[buffer_addr + word_index].u = word;
|
||||
|
@ -85,7 +86,6 @@ void pack_string(const char *str, uint32_t length, uint32_t dest_addr) {
|
|||
char_index = 0;
|
||||
word_index++;
|
||||
}
|
||||
length++;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -142,6 +142,16 @@ void run_vm() {
|
|||
}
|
||||
memory[dest_addr].f = memory[src1_addr].f / memory[src2_addr].f;
|
||||
break;
|
||||
case OP_F32_TO_INT: {
|
||||
float tmp = memory[src1_addr].f;
|
||||
memory[dest_addr].u = (uint32_t)tmp;
|
||||
break;
|
||||
}
|
||||
case OP_INT_TO_F32: {
|
||||
int tmp = memory[src1_addr].u;
|
||||
memory[dest_addr].f = (float)tmp;
|
||||
break;
|
||||
}
|
||||
case OP_HALT:
|
||||
return;
|
||||
case OP_MOV:
|
||||
|
@ -238,9 +248,13 @@ int main() {
|
|||
memory[i++].u = 100;
|
||||
memory[i++].u = OP_JGZ;
|
||||
memory[i++].u = 100;
|
||||
memory[i++].u = 4;
|
||||
memory[i++].u = 4;
|
||||
memory[i++].u = OP_F32_TO_STRING;
|
||||
memory[i++].u = 0;
|
||||
memory[i++].u = 0;
|
||||
memory[i++].u = OP_F32_TO_INT;
|
||||
memory[i++].u = 103;
|
||||
memory[i++].u = 0;
|
||||
memory[i++].u = 103;
|
||||
memory[i++].u = OP_INT_TO_STRING;
|
||||
memory[i++].u = 103;
|
||||
memory[i++].u = 0;
|
||||
memory[i++].u = 104;
|
||||
|
|
Loading…
Reference in New Issue