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 }