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

Commitb9ee0b6

Browse files
MannarAmuthanyouknowone
authored andcommitted
Implemented compare operation for boolean and int types
1 parentf8365ca commitb9ee0b6

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

[8]ページ先頭

©2009-2025 Movatter.jp