Skip to content

Commit 464e74f

Browse files
tekknolagik0kubun
authored andcommitted
Add branchif, jump
1 parent 5b5d54f commit 464e74f

File tree

1 file changed

+19
-10
lines changed

1 file changed

+19
-10
lines changed

zjit/src/ir.rs

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ pub enum Insn {
9999
Jump(BranchEdge),
100100

101101
// Conditional branch instructions
102-
IfTrue { val: Opnd, branch: BranchEdge },
102+
IfTrue { val: Opnd, target: BranchEdge },
103103
IfFalse { val: Opnd, target: BranchEdge },
104104

105105
// Call a C function
@@ -393,15 +393,24 @@ pub fn iseq_to_ssa(iseq: *const rb_iseq_t) -> Result<Function, ParseError> {
393393
let val = state.pop()?;
394394
let test_id = fun.push_insn(block, Insn::Test { val });
395395
// TODO(max): Check interrupts
396-
let _branch_id = fun.push_insn(block,
397-
Insn::IfFalse {
398-
val: Opnd::Insn(test_id),
399-
target: BranchEdge {
400-
target: insn_idx_to_block[&insn_idx_at_offset(insn_idx, offset)],
401-
// TODO(max): Merge locals/stack for bb arguments
402-
args: vec![],
403-
}
404-
});
396+
let target = insn_idx_to_block[&insn_idx_at_offset(insn_idx, offset)];
397+
// TODO(max): Merge locals/stack for bb arguments
398+
let _branch_id = fun.push_insn(block, Insn::IfFalse { val: Opnd::Insn(test_id), target: BranchEdge { target, args: vec![] } });
399+
}
400+
YARVINSN_branchif => {
401+
let offset = get_arg(pc, 0).as_i64();
402+
let val = state.pop()?;
403+
let test_id = fun.push_insn(block, Insn::Test { val });
404+
// TODO(max): Check interrupts
405+
let target = insn_idx_to_block[&insn_idx_at_offset(insn_idx, offset)];
406+
// TODO(max): Merge locals/stack for bb arguments
407+
let _branch_id = fun.push_insn(block, Insn::IfTrue { val: Opnd::Insn(test_id), target: BranchEdge { target, args: vec![] } });
408+
}
409+
YARVINSN_jump => {
410+
let offset = get_arg(pc, 0).as_i64();
411+
// TODO(max): Check interrupts
412+
let target = insn_idx_to_block[&insn_idx_at_offset(insn_idx, offset)];
413+
let _branch_id = fun.push_insn(block, Insn::Jump(BranchEdge { target, args: vec![] }));
405414
}
406415
YARVINSN_opt_nil_p => {
407416
let recv = state.pop()?;

0 commit comments

Comments
 (0)