MCPcopy Create free account
hub / github.com/chc4/lineiform / check_cond

Function check_cond

tangle/src/oper.rs:5–82  ·  view source on GitHub ↗
(&mut self, cond: IntCC)

Source from the content-addressed store, hash-verified

3const 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 => {

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected