Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitf8365ca

Browse files
MannarAmuthanyouknowone
authored andcommitted
Implemented compare operation for boolean types in JIT engine
1 parent91c0c8b commitf8365ca

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+
fntest_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+
fntest_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+
fntest_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+
fntest_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+
fntest_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)

[8]ページ先頭

©2009-2025 Movatter.jp