diff options
-rw-r--r-- | test/ruby/test_zjit.rb | 7 | ||||
-rw-r--r-- | zjit/src/hir.rs | 14 |
2 files changed, 21 insertions, 0 deletions
diff --git a/test/ruby/test_zjit.rb b/test/ruby/test_zjit.rb index 8fe5ae2df9..905ee2f125 100644 --- a/test/ruby/test_zjit.rb +++ b/test/ruby/test_zjit.rb @@ -219,6 +219,13 @@ class TestZJIT < Test::Unit::TestCase RUBY end + def test_opt_and + assert_compiles('[1, [3, 2, 1]]', <<~RUBY, insns: [:opt_and]) + def test(x, y) = x & y + return test(0b1101, 3), test([3, 2, 1, 4], [8, 1, 2, 3]) + RUBY + end + def test_opt_ge assert_compiles '[false, true, true]', %q{ def test(a, b) = a >= b diff --git a/zjit/src/hir.rs b/zjit/src/hir.rs index afdbcea0ab..2c32c83aa6 100644 --- a/zjit/src/hir.rs +++ b/zjit/src/hir.rs @@ -2377,6 +2377,7 @@ pub fn iseq_to_hir(iseq: *const rb_iseq_t) -> Result<Function, ParseError> { YARVINSN_opt_aref | YARVINSN_opt_empty_p | YARVINSN_opt_succ | + YARVINSN_opt_and | YARVINSN_opt_send_without_block => { let cd: *const rb_call_data = get_arg(pc, 0).as_ptr(); let call_info = unsafe { rb_get_call_data_ci(cd) }; @@ -3837,6 +3838,19 @@ mod tests { Return v4 "#]]); } + + #[test] + fn opt_and() { + eval(" + def test(x, y) = x & y + "); + assert_method_hir_with_opcode("test", YARVINSN_opt_and, expect![[r#" + fn test: + bb0(v0:BasicObject, v1:BasicObject, v2:BasicObject): + v5:BasicObject = SendWithoutBlock v1, :&, v2 + Return v5 + "#]]); + } #[test] fn test_branchnil() { eval(" |