aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore5
-rw-r--r--Makefile4
-rw-r--r--compile_commands.json43
-rwxr-xr-xscripts/runall.sh9
-rw-r--r--src/fvm.c3
-rw-r--r--src/fvm.h2
-rw-r--r--src/main.c5
-rw-r--r--tests/test_opcodes.c45
8 files changed, 115 insertions, 1 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..8bc6794
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,5 @@
+foo
+*.o
+*.d
+*.bin
+.cache
diff --git a/Makefile b/Makefile
index 4095f31..1a79f46 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-target = foo
+target = fvm
cflags = -g
ldflags = -lm
cc = gcc
@@ -10,6 +10,8 @@ tests_bin=$(tests:.c=.bin)
all: $(target)
+full: all $(tests_bin)
+
$(target): $(obj) src/main.o
$(cc) $(cflags) $(ldflags) -o $@ $^
diff --git a/compile_commands.json b/compile_commands.json
new file mode 100644
index 0000000..5702bfd
--- /dev/null
+++ b/compile_commands.json
@@ -0,0 +1,43 @@
+[
+ {
+ "arguments": [
+ "/usr/bin/gcc",
+ "-c",
+ "-g",
+ "-o",
+ "src/fvm.o",
+ "src/fvm.c"
+ ],
+ "directory": "/home/mistivia/repos/fvm",
+ "file": "/home/mistivia/repos/fvm/src/fvm.c",
+ "output": "/home/mistivia/repos/fvm/src/fvm.o"
+ },
+ {
+ "arguments": [
+ "/usr/bin/gcc",
+ "-c",
+ "-g",
+ "-o",
+ "src/main.o",
+ "src/main.c"
+ ],
+ "directory": "/home/mistivia/repos/fvm",
+ "file": "/home/mistivia/repos/fvm/src/main.c",
+ "output": "/home/mistivia/repos/fvm/src/main.o"
+ },
+ {
+ "arguments": [
+ "/usr/bin/gcc",
+ "-c",
+ "-Isrc/",
+ "-g",
+ "src/fvm.o",
+ "-o",
+ "tests/test_opcodes.bin",
+ "tests/test_opcodes.c"
+ ],
+ "directory": "/home/mistivia/repos/fvm",
+ "file": "/home/mistivia/repos/fvm/tests/test_opcodes.c",
+ "output": "/home/mistivia/repos/fvm/tests/test_opcodes.bin"
+ }
+]
diff --git a/scripts/runall.sh b/scripts/runall.sh
new file mode 100755
index 0000000..3fdc745
--- /dev/null
+++ b/scripts/runall.sh
@@ -0,0 +1,9 @@
+#!/usr/bin/env bash
+
+for var in "$@"; do
+ ./$var
+ if [ $? -ne 0 ]; then
+ exit 255
+ fi
+done
+
diff --git a/src/fvm.c b/src/fvm.c
index 3f1e3fb..858bd4a 100644
--- a/src/fvm.c
+++ b/src/fvm.c
@@ -409,6 +409,9 @@ int fvm_execute(struct fvm *vm) {
fvm_pushf(vm, (fvm_float_t)x);
vm->pc++;
break;
+ case FVM_OP_EXIT:
+ a = fvm_pop(vm);
+ return a;
default:
fprintf(stderr, "unknown opcode.\n");
break;
diff --git a/src/fvm.h b/src/fvm.h
index 40c71e2..bfa5888 100644
--- a/src/fvm.h
+++ b/src/fvm.h
@@ -90,6 +90,8 @@ enum fvm_op {
FVM_OP_FTI,
FVM_OP_ITF,
+
+ FVM_OP_EXIT,
};
int fvm_init(struct fvm *vm, void *code, int64_t stack_size);
diff --git a/src/main.c b/src/main.c
new file mode 100644
index 0000000..62742b5
--- /dev/null
+++ b/src/main.c
@@ -0,0 +1,5 @@
+#include "fvm.h"
+
+int main() {
+ return 0;
+}
diff --git a/tests/test_opcodes.c b/tests/test_opcodes.c
new file mode 100644
index 0000000..27bfbf3
--- /dev/null
+++ b/tests/test_opcodes.c
@@ -0,0 +1,45 @@
+#include <assert.h>
+#include <stdio.h>
+
+#include "fvm.h"
+
+char code[4096];
+char stack[4096];
+int code_cursor = 0;
+struct fvm vm;
+
+static void reset() {
+ vm.pc = (int64_t)code;
+ vm.sp = (int64_t)stack + 4095;
+ vm.bp = (int64_t)stack + 4095;
+ code_cursor = 0;
+}
+
+static void emit_op(enum fvm_op op) {
+ code[code_cursor] = (char)op;
+ code_cursor++;
+}
+static void emit_num(int64_t x) {
+ *(int64_t*)(code + code_cursor) = x;
+ code_cursor += 8;
+}
+
+void test_imm() {
+ printf("[TEST] imm\n");
+
+ reset();
+
+ emit_op(FVM_OP_IMM);
+ emit_num(3);
+ emit_op(FVM_OP_EXIT);
+
+ assert(fvm_execute(&vm) == 3);
+
+ printf("[PASS] imm\n");
+}
+
+int main()
+{
+ test_imm();
+ return 0;
+}