(&mut self, cond: IntCC)
| 3 | const STACK: RegSpec = RegSpec::rsp(); |
| 4 | |
| 5 | pub fn check_cond(&mut self, cond: IntCC) -> JitValue { |
| 6 | let flags = match cond { |
| 7 | IntCC::UnsignedGreaterThan => { |
| 8 | vec![Flags::CF, Flags::ZF] |
| 9 | }, |
| 10 | IntCC::UnsignedGreaterThanOrEqual => { |
| 11 | vec![Flags::CF] |
| 12 | }, |
| 13 | IntCC::UnsignedLessThan => { |
| 14 | vec![Flags::CF] |
| 15 | }, |
| 16 | IntCC::UnsignedLessThanOrEqual => { |
| 17 | vec![Flags::CF, Flags::ZF] |
| 18 | }, |
| 19 | IntCC::Equal => { |
| 20 | vec![Flags::ZF] |
| 21 | }, |
| 22 | IntCC::NotEqual => { |
| 23 | vec![Flags::ZF] |
| 24 | }, |
| 25 | _ => unimplemented!("unimplemented check_cond for {}", cond), |
| 26 | }; |
| 27 | let mut val = None; |
| 28 | let mut same = true; |
| 29 | for flag in flags { |
| 30 | let flag_cond = &self.context.flags[flag as usize]; |
| 31 | if let Some(set_val) = val { |
| 32 | if set_val != flag_cond { |
| 33 | same = false; |
| 34 | break; |
| 35 | } |
| 36 | } else { |
| 37 | val = Some(flag_cond); |
| 38 | } |
| 39 | } |
| 40 | if !same { |
| 41 | unimplemented!(); |
| 42 | } |
| 43 | if let Some(JitFlag::Unknown(left, right, res)) = val { |
| 44 | JitValue::Flag(self.builder.ins().ifcmp(*left, *right)) |
| 45 | } else if let Some(JitFlag::Known(c)) = val { |
| 46 | println!("constant eflags {:?} with cond {}", c, cond); |
| 47 | let tmp = match cond { |
| 48 | IntCC::UnsignedGreaterThan => { |
| 49 | // CF=0 and ZF=0 |
| 50 | let cf = self.context.check_flag(Flags::CF, false, self.builder); |
| 51 | let zf = self.context.check_flag(Flags::ZF, false, self.builder); |
| 52 | self.band(cf, zf) |
| 53 | }, |
| 54 | IntCC::UnsignedGreaterThanOrEqual => { |
| 55 | // CF=0 |
| 56 | self.context.check_flag(Flags::CF, false, self.builder) |
| 57 | }, |
| 58 | IntCC::UnsignedLessThan => { |
| 59 | // CF=1 |
| 60 | self.context.check_flag(Flags::CF, true, self.builder) |
| 61 | }, |
| 62 | IntCC::UnsignedLessThanOrEqual => { |
nothing calls this directly
no outgoing calls
no test coverage detected