|
1 | 1 | use cranelift::prelude::*; |
2 | 2 | use num_traits::cast::ToPrimitive; |
3 | 3 | use rustpython_bytecode::bytecode::{ |
4 | | - UnaryOperator, BinaryOperator, CodeObject, ComparisonOperator, Constant, Instruction, Label, NameScope, |
| 4 | + BinaryOperator, CodeObject, ComparisonOperator, Constant, Instruction, Label, NameScope, |
| 5 | + UnaryOperator, |
5 | 6 | }; |
6 | 7 | use std::collections::HashMap; |
7 | 8 |
|
@@ -85,9 +86,14 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> { |
85 | 86 | JitType::Float => { |
86 | 87 | let zero = self.builder.ins().f64const(0); |
87 | 88 | let val = self.builder.ins().fcmp(FloatCC::NotEqual, val.val, zero); |
88 | | - Ok(self.builder.ins().bint(types::I64, val)) |
89 | | - }, |
90 | | - JitType::Int => Ok(val.val), |
| 89 | + Ok(self.builder.ins().bint(types::I8, val)) |
| 90 | + } |
| 91 | + JitType::Int => { |
| 92 | + let zero = self.builder.ins().iconst(types::I64, 0); |
| 93 | + let val = self.builder.ins().icmp(IntCC::NotEqual, val.val, zero); |
| 94 | + Ok(self.builder.ins().bint(types::I8, val)) |
| 95 | + } |
| 96 | + JitType::Bool => Ok(val.val), |
91 | 97 | } |
92 | 98 | } |
93 | 99 |
|
@@ -228,8 +234,8 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> { |
228 | 234 |
|
229 | 235 | let val = self.builder.ins().icmp(cond, a.val, b.val); |
230 | 236 | self.stack.push(JitValue { |
231 | | - val, |
232 | | - ty: JitType::Int, // TODO: Boolean |
| 237 | + val: self.builder.ins().bint(types::I8, val), |
| 238 | + ty: JitType::Bool, |
233 | 239 | }); |
234 | 240 |
|
235 | 241 | Ok(()) |
@@ -264,6 +270,18 @@ impl<'a, 'b> FunctionCompiler<'a, 'b> { |
264 | 270 | } |
265 | 271 | _ => Err(JitCompileError::NotSupported), |
266 | 272 | }, |
| 273 | + JitType::Bool => match op { |
| 274 | + UnaryOperator::Not => { |
| 275 | + let val = self.boolean_val(a)?; |
| 276 | + let not_val = self.builder.ins().bxor_imm(val, 1); |
| 277 | + self.stack.push(JitValue { |
| 278 | + val: not_val, |
| 279 | + ty: JitType::Bool, |
| 280 | + }); |
| 281 | + Ok(()) |
| 282 | + } |
| 283 | + _ => Err(JitCompileError::NotSupported), |
| 284 | + }, |
267 | 285 | _ => Err(JitCompileError::NotSupported), |
268 | 286 | } |
269 | 287 | } |
|
0 commit comments