Skip to content

Commit b9ee0b6

Browse files
MannarAmuthanyouknowone
authored andcommitted
Implemented compare operation for boolean and int types
1 parent f8365ca commit b9ee0b6

File tree

2 files changed

+97
-19
lines changed

2 files changed

+97
-19
lines changed

jit/src/instructions.rs

Lines changed: 21 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -315,18 +315,36 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
315315
let b = self.stack.pop().ok_or(JitCompileError::BadBytecode)?;
316316
let a = self.stack.pop().ok_or(JitCompileError::BadBytecode)?;
317317

318+
let a_type:Option<JitType> = a.to_jit_type();
319+
let b_type:Option<JitType> = b.to_jit_type();
320+
318321
match (a, b) {
319-
(JitValue::Int(a), JitValue::Int(b)) => {
322+
(JitValue::Int(a), JitValue::Int(b)) |
323+
(JitValue::Bool(a), JitValue::Bool(b)) |
324+
(JitValue::Bool(a), JitValue::Int(b)) |
325+
(JitValue::Int(a), JitValue::Bool(b))
326+
=> {
327+
328+
let operand_one = match a_type.unwrap() {
329+
JitType::Bool => self.builder.ins().uextend(types::I64, a),
330+
_=> a
331+
};
332+
333+
let operand_two = match b_type.unwrap() {
334+
JitType::Bool => self.builder.ins().uextend(types::I64, b),
335+
_=> b
336+
};
337+
320338
let cond = match op {
321339
ComparisonOperator::Equal => IntCC::Equal,
322340
ComparisonOperator::NotEqual => IntCC::NotEqual,
323341
ComparisonOperator::Less => IntCC::SignedLessThan,
324342
ComparisonOperator::LessOrEqual => IntCC::SignedLessThanOrEqual,
325343
ComparisonOperator::Greater => IntCC::SignedGreaterThan,
326-
ComparisonOperator::GreaterOrEqual => IntCC::SignedLessThanOrEqual,
344+
ComparisonOperator::GreaterOrEqual => IntCC::SignedGreaterThanOrEqual,
327345
};
328346

329-
let val = self.builder.ins().icmp(cond, a, b);
347+
let val = self.builder.ins().icmp(cond, operand_one, operand_two);
330348
// TODO: Remove this `bint` in cranelift 0.90 as icmp now returns i8
331349
self.stack
332350
.push(JitValue::Bool(self.builder.ins().bint(types::I8, val)));
@@ -348,22 +366,6 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> {
348366
.push(JitValue::Bool(self.builder.ins().bint(types::I8, val)));
349367
Ok(())
350368
}
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-
}
367369
_ => Err(JitCompileError::NotSupported),
368370
}
369371
}

jit/tests/bool_tests.rs

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,21 @@ fn test_eq() {
6666
assert_eq!(eq(true, false), Ok(0));
6767
}
6868

69+
#[test]
70+
fn test_eq_with_integers() {
71+
let eq = jit_function! { eq(a:bool, b:i64) -> i64 => r##"
72+
def eq(a: bool, b: int):
73+
if a == b:
74+
return 1
75+
return 0
76+
"## };
77+
78+
assert_eq!(eq(false, 0), Ok(1));
79+
assert_eq!(eq(true, 1), Ok(1));
80+
assert_eq!(eq(false, 1), Ok(0));
81+
assert_eq!(eq(true, 0), Ok(0));
82+
}
83+
6984
#[test]
7085
fn test_gt() {
7186
let gt = jit_function! { gt(a:bool, b:bool) -> i64 => r##"
@@ -81,6 +96,21 @@ fn test_gt() {
8196
assert_eq!(gt(true, false), Ok(1));
8297
}
8398

99+
#[test]
100+
fn test_gt_with_integers() {
101+
let gt = jit_function! { gt(a:i64, b:bool) -> i64 => r##"
102+
def gt(a: int, b: bool):
103+
if a > b:
104+
return 1
105+
return 0
106+
"## };
107+
108+
assert_eq!(gt(0, false), Ok(0));
109+
assert_eq!(gt(1, true), Ok(0));
110+
assert_eq!(gt(0, true), Ok(0));
111+
assert_eq!(gt(1, false), Ok(1));
112+
}
113+
84114
#[test]
85115
fn test_lt() {
86116
let lt = jit_function! { lt(a:bool, b:bool) -> i64 => r##"
@@ -96,6 +126,21 @@ fn test_lt() {
96126
assert_eq!(lt(true, false), Ok(0));
97127
}
98128

129+
#[test]
130+
fn test_lt_with_integers() {
131+
let lt = jit_function! { lt(a:i64, b:bool) -> i64 => r##"
132+
def lt(a: int, b: bool):
133+
if a < b:
134+
return 1
135+
return 0
136+
"## };
137+
138+
assert_eq!(lt(0, false), Ok(0));
139+
assert_eq!(lt(1, true), Ok(0));
140+
assert_eq!(lt(0, true), Ok(1));
141+
assert_eq!(lt(1, false), Ok(0));
142+
}
143+
99144
#[test]
100145
fn test_gte() {
101146
let gte = jit_function! { gte(a:bool, b:bool) -> i64 => r##"
@@ -111,6 +156,22 @@ fn test_gte() {
111156
assert_eq!(gte(true, false), Ok(1));
112157
}
113158

159+
160+
#[test]
161+
fn test_gte_with_integers() {
162+
let gte = jit_function! { gte(a:bool, b:i64) -> i64 => r##"
163+
def gte(a: bool, b: int):
164+
if a >= b:
165+
return 1
166+
return 0
167+
"## };
168+
169+
assert_eq!(gte(false, 0), Ok(1));
170+
assert_eq!(gte(true, 1), Ok(1));
171+
assert_eq!(gte(false, 1), Ok(0));
172+
assert_eq!(gte(true, 0), Ok(1));
173+
}
174+
114175
#[test]
115176
fn test_lte() {
116177
let lte = jit_function! { lte(a:bool, b:bool) -> i64 => r##"
@@ -125,3 +186,18 @@ fn test_lte() {
125186
assert_eq!(lte(false, true), Ok(1));
126187
assert_eq!(lte(true, false), Ok(0));
127188
}
189+
190+
#[test]
191+
fn test_lte_with_integers() {
192+
let lte = jit_function! { lte(a:bool, b:i64) -> i64 => r##"
193+
def lte(a: bool, b: int):
194+
if a <= b:
195+
return 1
196+
return 0
197+
"## };
198+
199+
assert_eq!(lte(false, 0), Ok(1));
200+
assert_eq!(lte(true, 1), Ok(1));
201+
assert_eq!(lte(false, 1), Ok(1));
202+
assert_eq!(lte(true, 0), Ok(0));
203+
}

0 commit comments

Comments
 (0)