diff --git a/runtime/src/ops/control_flow.rs b/runtime/src/ops/control_flow.rs index c904af86..7298c402 100644 --- a/runtime/src/ops/control_flow.rs +++ b/runtime/src/ops/control_flow.rs @@ -48,6 +48,34 @@ impl Context { from } + pub fn jp(&mut self, from: Cont, x: Cont) -> Cont { + if self.cpu.flags.contains(Flags::PF) { + return x; + } + from + } + + pub fn jnp(&mut self, from: Cont, x: Cont) -> Cont { + if !self.cpu.flags.contains(Flags::PF) { + return x; + } + from + } + + pub fn jo(&mut self, from: Cont, x: Cont) -> Cont { + if self.cpu.flags.contains(Flags::OF) { + return x; + } + from + } + + pub fn jno(&mut self, from: Cont, x: Cont) -> Cont { + if !self.cpu.flags.contains(Flags::OF) { + return x; + } + from + } + pub fn js(&mut self, from: Cont, x: Cont) -> Cont { if self.cpu.flags.contains(Flags::SF) { return x; diff --git a/tc/src/codegen/control_flow.rs b/tc/src/codegen/control_flow.rs index caf0159a..951a0d3e 100644 --- a/tc/src/codegen/control_flow.rs +++ b/tc/src/codegen/control_flow.rs @@ -132,7 +132,8 @@ impl<'a> CodeGen<'a> { bitness = self.module.bitness() )); } - Je | Jne | Jb | Js | Jns | Ja | Jae | Jl | Jg | Jge | Jecxz | Jle | Jbe | Jcxz + Je | Jne | Jb | Js | Jns | Ja | Jae | Jl | Jg | Jge | Jecxz | Jle | Jbe | Jcxz | Jp + | Jnp | Jo | Jno | Loop | Loopne => { let next = self.resolve_jmp(instr.next_ip()); let (None, None, cont) = self.jmp_target(instr) else {