From 516ee9f4065d3838d3281d320e2516e8864efa87 Mon Sep 17 00:00:00 2001 From: Andre Wagner Date: Tue, 5 May 2026 21:11:41 -0500 Subject: [PATCH] . --- lua-temp/TODO.md | 3 ++- lua-temp/doc/OPCODES | 26 +++++++++++++------------- lua-temp/tests.lua | 17 +++++++++++++++++ lua-temp/tyche-vm.lua | 16 ++++++++++++++++ 4 files changed, 48 insertions(+), 14 deletions(-) diff --git a/lua-temp/TODO.md b/lua-temp/TODO.md index 71bcbb5..d71d3a9 100644 --- a/lua-temp/TODO.md +++ b/lua-temp/TODO.md @@ -2,7 +2,7 @@ Progress of the Lua port: - [x] Assembler - [x] Basic VM execution -- [ ] Logic/arithmetic expressions +- [x] Logic/arithmetic expressions - [ ] Functions - [ ] Local variables - [ ] Calling functions @@ -19,6 +19,7 @@ Progress of the Lua port: - [ ] Tables - [ ] Garbage collection - [ ] Metatables +- [ ] Real - [ ] Error handling - [ ] Closures/upvalues diff --git a/lua-temp/doc/OPCODES b/lua-temp/doc/OPCODES index 764758b..e333e7a 100644 --- a/lua-temp/doc/OPCODES +++ b/lua-temp/doc/OPCODES @@ -57,19 +57,19 @@ Logical/arithmetic: 22 mul Multiply top 2 values in stack 23 div Float division 24 idiv Integer division -25 eq Equality -26 neq Inequality -27 lt Less than -28 lte Less than or equals -29 gt Greater than -2a gte Greater than or equals -2b and Bitwise AND -2c or Bitwise OR -2d xor Bitwise XOR -2e pow Power -2f shl Shift left -30 shr Shift right -31 mod Modulo +25 mod Modulo +26 eq Equality +27 neq Inequality +28 lt Less than +29 lte Less than or equals +2a gt Greater than +2b gte Greater than or equals +2c and Bitwise AND +2d or Bitwise OR +2e xor Bitwise XOR +2f pow Power +30 shl Shift left +31 shr Shift right Other value operations: 40 len Get table, array or string size diff --git a/lua-temp/tests.lua b/lua-temp/tests.lua index bb9bc9a..3a96776 100644 --- a/lua-temp/tests.lua +++ b/lua-temp/tests.lua @@ -158,6 +158,23 @@ end do assert_eq(arith(2, 5, 'sum'):to_integer(-1), 7) assert_eq(arith(2, 5, 'sub'):to_integer(-1), -3) + assert_eq(arith(2, 5, 'mul'):to_integer(-1), 10) + assert_eq(arith(20, 3, 'idiv'):to_integer(-1), 6) + assert_eq(arith(5, 5, 'eq'):to_integer(-1), 1) + assert_eq(arith(5, 5, 'neq'):to_integer(-1), 0) + assert_eq(arith(4, 5, 'lt'):to_integer(-1), 1) + assert_eq(arith(5, 5, 'lt'):to_integer(-1), 0) + assert_eq(arith(4, 5, 'lte'):to_integer(-1), 1) + assert_eq(arith(5, 5, 'lte'):to_integer(-1), 1) + assert_eq(arith(5, 5, 'gt'):to_integer(-1), 0) + assert_eq(arith(5, 5, 'gte'):to_integer(-1), 1) + assert_eq(arith(20, 5, 'and'):to_integer(-1), 4) + assert_eq(arith(20, 5, 'or'):to_integer(-1), 21) + assert_eq(arith(20, 5, 'xor'):to_integer(-1), 17) + assert_eq(arith(2, 5, 'pow'):to_integer(-1), 32) + assert_eq(arith(2, 5, 'shl'):to_integer(-1), 64) + assert_eq(arith(20, 3, 'shr'):to_integer(-1), 2) + assert_eq(arith(20, 3, 'mod'):to_integer(-1), 2) end print('End.') \ No newline at end of file diff --git a/lua-temp/tyche-vm.lua b/lua-temp/tyche-vm.lua index 5ef225b..fea35ed 100644 --- a/lua-temp/tyche-vm.lua +++ b/lua-temp/tyche-vm.lua @@ -173,6 +173,22 @@ end EXPR.sum.integer.integer = function(vm, b, a) vm:push_integer(a + b) end EXPR.sub.integer.integer = function(vm, b, a) vm:push_integer(a - b) end +EXPR.mul.integer.integer = function(vm, b, a) vm:push_integer(a * b) end +-- TODO - div +EXPR.idiv.integer.integer = function(vm, b, a) vm:push_integer(math.floor(a / b)) end +EXPR.mod.integer.integer = function(vm, b, a) vm:push_integer(a % b) end +EXPR.eq.integer.integer = function(vm, b, a) vm:push_integer((a == b) and 1 or 0) end +EXPR.neq.integer.integer = function(vm, b, a) vm:push_integer((a ~= b) and 1 or 0) end +EXPR.lt.integer.integer = function(vm, b, a) vm:push_integer((a < b) and 1 or 0) end +EXPR.lte.integer.integer = function(vm, b, a) vm:push_integer((a <= b) and 1 or 0) end +EXPR.gt.integer.integer = function(vm, b, a) vm:push_integer((a > b) and 1 or 0) end +EXPR.gte.integer.integer = function(vm, b, a) vm:push_integer((a >= b) and 1 or 0) end +EXPR['and'].integer.integer = function(vm, b, a) vm:push_integer(a & b) end +EXPR['or'].integer.integer = function(vm, b, a) vm:push_integer(a | b) end +EXPR.xor.integer.integer = function(vm, b, a) vm:push_integer(a ~ b) end +EXPR.pow.integer.integer = function(vm, b, a) vm:push_integer(a ^ b) end +EXPR.shl.integer.integer = function(vm, b, a) vm:push_integer(a << b) end +EXPR.shr.integer.integer = function(vm, b, a) vm:push_integer(a >> b) end ---------------------- -- --