zongors-reality-engine/src/test.c

146 lines
6.0 KiB
C

#include "test.h"
bool test_hello_world_compile(VM *vm) {
vm->code[vm->cp++].u = OP(OP_LOADU, 1, 0, 0);
vm->code[vm->cp++].u = 0;
vm->code[vm->cp++].u = OP(OP_PRINT_STRING, 0, 1, 0); /* print("nuqneH 'u'?"); */
vm->code[vm->cp++].u = OP(OP_HALT, 0, 0, 0); /* explicit halt */
vm->memory[vm->mp++].u = 12;
vm->memory[vm->mp].c[0] = 'n';
vm->memory[vm->mp].c[1] = 'u';
vm->memory[vm->mp].c[2] = 'q';
vm->memory[vm->mp++].c[3] = 'n';
vm->memory[vm->mp].c[0] = 'e';
vm->memory[vm->mp].c[1] = 'H';
vm->memory[vm->mp].c[2] = ' ';
vm->memory[vm->mp++].c[3] = '\'';
vm->memory[vm->mp].c[0] = 'u';
vm->memory[vm->mp].c[1] = '\'';
vm->memory[vm->mp].c[2] = '?';
vm->memory[vm->mp++].c[3] = '\0';
return true;
}
bool test_add_compile(VM *vm) {
vm->code[vm->cp++].u = OP(OP_LOADU, 0, 0, 0);
vm->code[vm->cp++].u = 1;
vm->code[vm->cp++].u = OP(OP_LOADU, 1, 0, 0);
vm->code[vm->cp++].u = 2;
vm->code[vm->cp++].u = OP(OP_ADD_UINT, 2, 1, 0); /* let sum = 1 + 2; */
vm->code[vm->cp++].u = OP(OP_UINT_TO_STRING, 3, 2, 0);
vm->code[vm->cp++].u = OP(OP_PRINT_STRING, 0, 3, 0); /* print(sum.toS()); */
vm->code[vm->cp++].u = OP(OP_HALT, 0, 0, 0); /* explicit halt */
return true;
}
bool test_loop_compile(VM *vm) {
vm->memory[vm->mp++].u = 17;
vm->memory[vm->mp].c[0] = 'E';
vm->memory[vm->mp].c[1] = 'n';
vm->memory[vm->mp].c[2] = 't';
vm->memory[vm->mp++].c[3] = 'e';
vm->memory[vm->mp].c[0] = 'r';
vm->memory[vm->mp].c[1] = ' ';
vm->memory[vm->mp].c[2] = 'a';
vm->memory[vm->mp++].c[3] = ' ';
vm->memory[vm->mp].c[0] = 's';
vm->memory[vm->mp].c[1] = 't';
vm->memory[vm->mp].c[2] = 'r';
vm->memory[vm->mp++].c[3] = 'i';
vm->memory[vm->mp].c[0] = 'n';
vm->memory[vm->mp].c[1] = 'g';
vm->memory[vm->mp].c[2] = ':';
vm->memory[vm->mp++].c[3] = '\0';
vm->code[vm->cp++].u = OP(OP_LOADF, 0, 0, 0); /* let a = 5.0 */
vm->code[vm->cp++].f = 5.0f;
vm->code[vm->cp++].u = OP(OP_LOADI, 1, 0, 0); /* do (i = 50000, 0, -1) { */
vm->code[vm->cp++].i = 50000;
vm->code[vm->cp++].u = OP(OP_LOADI, 2, 0, 0); /* loop check value */
vm->code[vm->cp++].i = 0;
vm->code[vm->cp++].u = OP(OP_LOADI, 3, 0, 0); /* loop incriment value */
vm->code[vm->cp++].i = -1;
vm->code[vm->cp++].u = OP(OP_LOADU, 4, 0, 0); /* loop start */
uint32_t jmp = vm->cp + 1;
vm->code[vm->cp++].u = jmp;
vm->code[vm->cp++].u = OP(OP_LOADF, 5, 0, 0);
vm->code[vm->cp++].f = 5.0f;
vm->code[vm->cp++].u = OP(OP_ADD_REAL, 0, 0, 5); /* a += 5.0; */
vm->code[vm->cp++].u = OP(OP_ADD_INT, 1, 1, 3); /* (implied by loop) i = i + (-1) */
vm->code[vm->cp++].u = OP(OP_JGE_INT, 4, 1, 2); /* } */
vm->code[vm->cp++].u = OP(OP_REAL_TO_UINT, 1, 0, 0); /* let b = a as nat; */
vm->code[vm->cp++].u = OP(OP_LOADU, 5, 0, 0);
vm->code[vm->cp++].u = 0;
vm->code[vm->cp++].u = OP(OP_PRINT_STRING, 0, 5, 0); /* print("Enter a string: "); */
vm->code[vm->cp++].u = OP(OP_READ_STRING, 2, 0, 0); /* let user_string = gets(); */
vm->code[vm->cp++].u = OP(OP_UINT_TO_STRING, 3, 1, 0);
vm->code[vm->cp++].u = OP(OP_PRINT_STRING, 0, 3, 0); /* print(a.toS()); */
vm->code[vm->cp++].u = OP(OP_REAL_TO_STRING, 3, 0, 0);
vm->code[vm->cp++].u = OP(OP_PRINT_STRING, 0, 3, 0); /* print(b.toS()); */
vm->code[vm->cp++].u = OP(OP_PRINT_STRING, 0, 2, 0); /* print(user_string); */
vm->code[vm->cp++].u = OP(OP_HALT, 0, 0, 0); /* program done */
return true;
}
bool test_add_function_compile(VM *vm) {
/* fn main() */
vm->code[vm->cp++].u = OP(OP_LOADI, 0, 0, 0); /* 1 */
vm->code[vm->cp++].i = 1;
vm->code[vm->cp++].u = OP(OP_PUSHI, 0, 0, 0);
vm->code[vm->cp++].u = OP(OP_LOADI, 0, 0, 0); /* 1 */
vm->code[vm->cp++].i = 1;
vm->code[vm->cp++].u = OP(OP_PUSHI, 0, 0, 0);
vm->code[vm->cp++].u = OP(OP_CALL, 0, 0, 0); /* ); */
vm->code[vm->cp++].u = 12;
vm->code[vm->cp++].u = OP(OP_POPI, 0, 0, 0); /* get return value */
vm->code[vm->cp++].u = OP(OP_INT_TO_STRING, 1, 0, 0);
vm->code[vm->cp++].u = OP(OP_PRINT_STRING, 0, 1, 0); /* print(sum.toS()); */
vm->code[vm->cp++].u = OP(OP_HALT, 0, 0, 0);
/* fn add() */
vm->code[vm->cp++].u = OP(OP_POPI, 0, 0, 0); /* a int */
vm->code[vm->cp++].u = OP(OP_POPI, 1, 0, 0); /* b int */
vm->code[vm->cp++].u = OP(OP_ADD_INT, 2, 1, 0); /* a + b */
vm->code[vm->cp++].u = OP(OP_PUSHI, 2, 0, 0); /* push on stack */
vm->code[vm->cp++].u = OP(OP_RETURN, 0, 0, 0);
return true;
}
bool test_recursive_function_compile(VM *vm) {
/* fn main() */
vm->code[vm->cp++].u = OP(OP_LOADI, 0, 0, 0); /* 35 */
vm->code[vm->cp++].i = 35;
vm->code[vm->cp++].u = OP(OP_PUSHI, 0, 0, 0);
vm->code[vm->cp++].u = OP(OP_CALL, 0, 0, 0); /* ); */
vm->code[vm->cp++].u = 9;
vm->code[vm->cp++].u = OP(OP_POPI, 0, 0, 0); /* get return value */
vm->code[vm->cp++].u = OP(OP_INT_TO_STRING, 1, 0, 0);
vm->code[vm->cp++].u = OP(OP_PRINT_STRING, 0, 1, 0); /* print(fib(35).toS()); */
vm->code[vm->cp++].u = OP(OP_HALT, 0, 0, 0);
/* fn fib() */
vm->code[vm->cp++].u = OP(OP_POPI, 0, 0, 0); /* n int */
vm->code[vm->cp++].u = OP(OP_LOADI, 1, 0, 0); /* 2 */
vm->code[vm->cp++].i = 2;
vm->code[vm->cp++].u = OP(OP_LOADI, 2, 0, 0); /* &fib */
vm->code[vm->cp++].i = 32;
vm->code[vm->cp++].u = OP(OP_JLT_INT, 2, 0, 1);
vm->code[vm->cp++].u = OP(OP_LOADI, 3, 0, 0); /* 2 */
vm->code[vm->cp++].i = 2;
vm->code[vm->cp++].u = OP(OP_SUB_INT, 4, 0, 3);
vm->code[vm->cp++].u = OP(OP_PUSHI, 4, 0, 0);
vm->code[vm->cp++].u = OP(OP_CALL, 0, 0, 0); /* fib(n - 2) */
vm->code[vm->cp++].u = 9;
vm->code[vm->cp++].u = OP(OP_LOADI, 3, 0, 0); /* 1 */
vm->code[vm->cp++].i = 1;
vm->code[vm->cp++].u = OP(OP_SUB_INT, 4, 0, 3);
vm->code[vm->cp++].u = OP(OP_PUSHI, 4, 0, 0);
vm->code[vm->cp++].u = OP(OP_CALL, 0, 0, 0); /* fib(n - 1) */
vm->code[vm->cp++].u = 9;
vm->code[vm->cp++].u = OP(OP_POPI, 4, 0, 0);
vm->code[vm->cp++].u = OP(OP_POPI, 5, 0, 0);
vm->code[vm->cp++].u = OP(OP_ADD_INT, 6, 5, 4);
vm->code[vm->cp++].u = OP(OP_PUSHI, 6, 0, 0);
vm->code[vm->cp++].u = OP(OP_RETURN, 0, 0, 0);
vm->code[vm->cp++].u = OP(OP_PUSHI, 0, 0, 0);
vm->code[vm->cp++].u = OP(OP_RETURN, 0, 0, 0);
return true;
}