lib/chant/src/lower/statement/condition.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2 const choir = @import("choir");
3 const ast = @import("../../ast/root.zig");
4 const lower_mod = @import("../root.zig");
5 const expression = @import("../expression/root.zig");
6
7 const ArithDialect = choir.dialects.ArithDialect;
8 const Error = lower_mod.Error;
9 const Lowerer = lower_mod.Lowerer;
10
11 pub fn lower(lowerer: *Lowerer, expr: *ast.Expr) Error!*choir.Value {
12 const value = try expression.lowerExpression(lowerer, expr);
13 const type_name = value.value.type.getDialectTypeName() orelse return error.UnsupportedType;
14 if (std.mem.eql(u8, type_name, "arith.bool")) return value.value;
15 if (!ast.types.isInteger(value.c_type)) return error.UnsupportedConstruct;
16 const zero_type = try lower_mod.convert.scalarType(lowerer, value.c_type);
17 const zero = ArithDialect.ConstantOp.createInt(lowerer.ctx, lowerer.loc, zero_type, 0) catch return error.OutOfMemory;
18 try lower_mod.emit.append(lowerer, zero.op);
19 var zero_mutable = zero;
20 const cmp = ArithDialect.CmpOp.create(lowerer.ctx, lowerer.loc, .ne, value.value, zero_mutable.getResult()) catch return error.OutOfMemory;
21 try lower_mod.emit.append(lowerer, cmp.op);
22 var cmp_mutable = cmp;
23 return cmp_mutable.getResult();
24 }