Skip to content

Commit f8365ca

Browse files
MannarAmuthanyouknowone
authored andcommitted
Implemented compare operation for boolean types in JIT engine
1 parent 91c0c8b commit f8365ca

File tree

2 files changed

+91
-0
lines changed

2 files changed

+91
-0
lines changed

jit/src/instructions.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,22 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
348348
.push(JitValue::Bool(self.builder.ins().bint(types::I8, val)));
349349
Ok(())
350350
}
351+
(JitValue::Bool(a), JitValue::Bool(b)) => {
352+
let cond = match op {
353+
ComparisonOperator::Equal => IntCC::Equal,
354+
ComparisonOperator::NotEqual => IntCC::NotEqual,
355+
ComparisonOperator::Less => IntCC::UnsignedLessThan,
356+
ComparisonOperator::LessOrEqual => IntCC::UnsignedLessThanOrEqual,
357+
ComparisonOperator::Greater => IntCC::UnsignedGreaterThan,
358+
ComparisonOperator::GreaterOrEqual => IntCC::UnsignedGreaterThanOrEqual,
359+
};
360+
361+
let val = self.builder.ins().icmp(cond, a, b);
362+
// TODO: Remove this `bint` in cranelift 0.90 as icmp now returns i8
363+
self.stack
364+
.push(JitValue::Bool(self.builder.ins().bint(types::I8, val)));
365+
Ok(())
366+
}
351367
_ => Err(JitCompileError::NotSupported),
352368
}
353369
}

jit/tests/bool_tests.rs

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,78 @@ fn test_if_not() {
5050
assert_eq!(if_not(true), Ok(1));
5151
assert_eq!(if_not(false), Ok(0));
5252
}
53+
54+
#[test]
55+
fn test_eq() {
56+
let eq = jit_function! { eq(a:bool, b:bool) -> i64 => r##"
57+
def eq(a: bool, b: bool):
58+
if a == b:
59+
return 1
60+
return 0
61+
"## };
62+
63+
assert_eq!(eq(false, false), Ok(1));
64+
assert_eq!(eq(true, true), Ok(1));
65+
assert_eq!(eq(false, true), Ok(0));
66+
assert_eq!(eq(true, false), Ok(0));
67+
}
68+
69+
#[test]
70+
fn test_gt() {
71+
let gt = jit_function! { gt(a:bool, b:bool) -> i64 => r##"
72+
def gt(a: bool, b: bool):
73+
if a > b:
74+
return 1
75+
return 0
76+
"## };
77+
78+
assert_eq!(gt(false, false), Ok(0));
79+
assert_eq!(gt(true, true), Ok(0));
80+
assert_eq!(gt(false, true), Ok(0));
81+
assert_eq!(gt(true, false), Ok(1));
82+
}
83+
84+
#[test]
85+
fn test_lt() {
86+
let lt = jit_function! { lt(a:bool, b:bool) -> i64 => r##"
87+
def lt(a: bool, b: bool):
88+
if a < b:
89+
return 1
90+
return 0
91+
"## };
92+
93+
assert_eq!(lt(false, false), Ok(0));
94+
assert_eq!(lt(true, true), Ok(0));
95+
assert_eq!(lt(false, true), Ok(1));
96+
assert_eq!(lt(true, false), Ok(0));
97+
}
98+
99+
#[test]
100+
fn test_gte() {
101+
let gte = jit_function! { gte(a:bool, b:bool) -> i64 => r##"
102+
def gte(a: bool, b: bool):
103+
if a >= b:
104+
return 1
105+
return 0
106+
"## };
107+
108+
assert_eq!(gte(false, false), Ok(1));
109+
assert_eq!(gte(true, true), Ok(1));
110+
assert_eq!(gte(false, true), Ok(0));
111+
assert_eq!(gte(true, false), Ok(1));
112+
}
113+
114+
#[test]
115+
fn test_lte() {
116+
let lte = jit_function! { lte(a:bool, b:bool) -> i64 => r##"
117+
def lte(a: bool, b: bool):
118+
if a <= b:
119+
return 1
120+
return 0
121+
"## };
122+
123+
assert_eq!(lte(false, false), Ok(1));
124+
assert_eq!(lte(true, true), Ok(1));
125+
assert_eq!(lte(false, true), Ok(1));
126+
assert_eq!(lte(true, false), Ok(0));
127+
}

0 commit comments

Comments
 (0)