diff --git a/src/vm/expr.cc b/src/vm/expr.cc index 304a2eb..2470f42 100644 --- a/src/vm/expr.cc +++ b/src/vm/expr.cc @@ -24,6 +24,8 @@ static int init_ = []() { BIN_OP(Subtraction, Integer, Integer) { return Value::CreateInteger(a.as_integer() - b.as_integer()); }; + BIN_OP(Multiplication, Integer, Integer) { return Value::CreateInteger(a.as_integer() * b.as_integer()); }; + BIN_OP(Division, Integer, Integer) { return Value::CreateFloat((float) a.as_integer() / (float) b.as_integer()); }; BIN_OP(IntegerDivision, Integer, Integer) { return Value::CreateInteger(a.as_integer() / b.as_integer()); }; diff --git a/src/vm/tests.cc b/src/vm/tests.cc index 61688fb..4786b03 100644 --- a/src/vm/tests.cc +++ b/src/vm/tests.cc @@ -93,7 +93,7 @@ TEST(VM, BasicCode) ASSERT_EQ(result, 5); } -TEST(VM, SumIntegers) +TEST(VM, IntegerIntegerOperations) { auto test_op = [](int32_t op1, int32_t op2, std::string oper) { return VM().load_bytecode(as::Assembler(std::format(R"( @@ -107,6 +107,26 @@ TEST(VM, SumIntegers) ASSERT_EQ(test_op(2, 3, "sum"), 5); ASSERT_EQ(test_op(2, 3, "sub"), -1); + ASSERT_EQ(test_op(2, 3, "mul"), 6); + ASSERT_EQ(test_op(20, 3, "idiv"), 6); + ASSERT_EQ(test_op(2, 3, "eq"), 0); + ASSERT_EQ(test_op(2, 3, "neq"), 1); + ASSERT_EQ(test_op(2, 3, "lt"), 1); + ASSERT_EQ(test_op(2, 3, "lte"), 1); + ASSERT_EQ(test_op(3, 3, "lte"), 1); + ASSERT_EQ(test_op(4, 3, "lte"), 0); + ASSERT_EQ(test_op(2, 3, "gt"), 0); + ASSERT_EQ(test_op(2, 3, "gte"), 0); + ASSERT_EQ(test_op(3, 3, "gte"), 1); + ASSERT_EQ(test_op(4, 3, "gte"), 1); + ASSERT_EQ(test_op(2, 3, "and"), 2); + ASSERT_EQ(test_op(2, 3, "or"), 3); + ASSERT_EQ(test_op(2, 3, "xor"), 1); + ASSERT_EQ(test_op(2, 3, "pow"), 8); + ASSERT_EQ(test_op(2, 3, "shl"), 16); + ASSERT_EQ(test_op(30, 2, "shr"), 7); + + // TODO - div } int main(int argc, char** argv)