require 'jit/value' require 'jit/function' require 'test/unit' require 'assertions' class TestJitValue < Test::Unit::TestCase include JitAssertions def test_store p = proc { |f| v = f.value(JIT::Type::INT) v.store(f.const(JIT::Type::INT, 42)) f.return v } assert_function_result( :result => [ JIT::Type::INT, 42 ], &p) end # TODO: address def test_int_plus p = proc { |f| v1 = f.get_param(0) v2 = f.get_param(1) f.return v1 + v2 } assert_function_result( :arg0 => [ JIT::Type::INT, 1 ], :arg1 => [ JIT::Type::INT, 2 ], :result => [ JIT::Type::INT, 3 ], &p) end def test_int_minus p = proc { |f| v1 = f.get_param(0) v2 = f.get_param(1) f.return v1 - v2 } assert_function_result( :arg0 => [ JIT::Type::INT, 3 ], :arg1 => [ JIT::Type::INT, 2 ], :result => [ JIT::Type::INT, 1 ], &p) end def test_int_mult p = proc { |f| v1 = f.get_param(0) v2 = f.get_param(1) f.return v1 * v2 } assert_function_result( :arg0 => [ JIT::Type::INT, 3 ], :arg1 => [ JIT::Type::INT, 2 ], :result => [ JIT::Type::INT, 6 ], &p) end def test_int_div p = proc { |f| v1 = f.get_param(0) v2 = f.get_param(1) f.return v1 / v2 } assert_function_result( :arg0 => [ JIT::Type::INT, 6 ], :arg1 => [ JIT::Type::INT, 2 ], :result => [ JIT::Type::INT, 3 ], &p) end def test_int_mod p = proc { |f| v1 = f.get_param(0) v2 = f.get_param(1) f.return v1 % v2 } assert_function_result( :arg0 => [ JIT::Type::INT, 20 ], :arg1 => [ JIT::Type::INT, 6 ], :result => [ JIT::Type::INT, 2 ], &p) end def test_int_and p = proc { |f| v1 = f.get_param(0) v2 = f.get_param(1) f.return v1 & v2 } assert_function_result( :arg0 => [ JIT::Type::INT, 11 ], :arg1 => [ JIT::Type::INT, 3 ], :result => [ JIT::Type::INT, 3 ], &p) assert_function_result( :arg0 => [ JIT::Type::INT, 8 ], :arg1 => [ JIT::Type::INT, 3 ], :result => [ JIT::Type::INT, 0 ], &p) end def test_int_or p = proc { |f| v1 = f.get_param(0) v2 = f.get_param(1) f.return v1 | v2 } assert_function_result( :arg0 => [ JIT::Type::INT, 10 ], :arg1 => [ JIT::Type::INT, 3 ], :result => [ JIT::Type::INT, 11 ], &p) end def test_int_xor p = proc { |f| v1 = f.get_param(0) v2 = f.get_param(1) f.return v1 ^ v2 } assert_function_result( :arg0 => [ JIT::Type::INT, 10 ], :arg1 => [ JIT::Type::INT, 3 ], :result => [ JIT::Type::INT, 9 ], &p) end def test_int_lt p = proc { |f| v1 = f.get_param(0) v2 = f.get_param(1) f.return v1 < v2 } assert_function_result( :arg0 => [ JIT::Type::INT, 1 ], :arg1 => [ JIT::Type::INT, 2 ], :result => [ JIT::Type::INT, 1 ], &p) assert_function_result( :arg0 => [ JIT::Type::INT, 2 ], :arg1 => [ JIT::Type::INT, 1 ], :result => [ JIT::Type::INT, 0 ], &p) end def test_int_gt p = proc { |f| v1 = f.get_param(0) v2 = f.get_param(1) f.return v1> v2 } assert_function_result( :arg0 => [ JIT::Type::INT, 1 ], :arg1 => [ JIT::Type::INT, 2 ], :result => [ JIT::Type::INT, 0 ], &p) assert_function_result( :arg0 => [ JIT::Type::INT, 2 ], :arg1 => [ JIT::Type::INT, 1 ], :result => [ JIT::Type::INT, 1 ], &p) end def test_int_eq p = proc { |f| v1 = f.get_param(0) v2 = f.get_param(1) f.return v1 == v2 } assert_function_result( :arg0 => [ JIT::Type::INT, 1 ], :arg1 => [ JIT::Type::INT, 2 ], :result => [ JIT::Type::INT, 0 ], &p) assert_function_result( :arg0 => [ JIT::Type::INT, 1 ], :arg1 => [ JIT::Type::INT, 1 ], :result => [ JIT::Type::INT, 1 ], &p) end def test_int_le p = proc { |f| v1 = f.get_param(0) v2 = f.get_param(1) f.return v1 <= v2 } assert_function_result( :arg0 => [ JIT::Type::INT, 1 ], :arg1 => [ JIT::Type::INT, 2 ], :result => [ JIT::Type::INT, 1 ], &p) assert_function_result( :arg0 => [ JIT::Type::INT, 2 ], :arg1 => [ JIT::Type::INT, 1 ], :result => [ JIT::Type::INT, 0 ], &p) assert_function_result( :arg0 => [ JIT::Type::INT, 1 ], :arg1 => [ JIT::Type::INT, 1 ], :result => [ JIT::Type::INT, 1 ], &p) end def test_int_ge p = proc { |f| v1 = f.get_param(0) v2 = f.get_param(1) f.return v1>= v2 } assert_function_result( :arg0 => [ JIT::Type::INT, 1 ], :arg1 => [ JIT::Type::INT, 2 ], :result => [ JIT::Type::INT, 0 ], &p) assert_function_result( :arg0 => [ JIT::Type::INT, 2 ], :arg1 => [ JIT::Type::INT, 1 ], :result => [ JIT::Type::INT, 1 ], &p) assert_function_result( :arg0 => [ JIT::Type::INT, 1 ], :arg1 => [ JIT::Type::INT, 1 ], :result => [ JIT::Type::INT, 1 ], &p) end def test_int_lshift p = proc { |f| v1 = f.get_param(0) v2 = f.get_param(1) f.return v1 << v2 } assert_function_result( :arg0 => [ JIT::Type::INT, 31 ], :arg1 => [ JIT::Type::INT, 2 ], :result => [ JIT::Type::INT, 124 ], &p) end def test_int_rshift p = proc { |f| v1 = f.get_param(0) v2 = f.get_param(1) f.return v1>> v2 } assert_function_result( :arg0 => [ JIT::Type::INT, 31 ], :arg1 => [ JIT::Type::INT, 2 ], :result => [ JIT::Type::INT, 7 ], &p) end end