From cb616cb7972bb2f38ea4527c7ec0ae3cc0d64c7c Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Tue, 5 Oct 2021 21:38:47 -0700 Subject: stage2: implement runtime `@intToEnum` * Update AIR instruction `intcast` to allow the dest type to be an enum. * LLVM backend: update `intcast` to support when the bit counts of operand and dest type are the same. This was already a requirement of the instruction previously. * Type: `intInfo` supports the case when the type is an enum, and retrieves the info for the integer tag type. This makes it pretty easy for backends to implement `intcast` without having to care explicitly that the new type is an enum. As a bonus, simple enums never have to go through the type system; their signedness and bit count are computed directly. The "int to enum" behavior test case is now passing for stage2 in the LLVM backend. --- src/codegen/llvm.zig | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'src/codegen') diff --git a/src/codegen/llvm.zig b/src/codegen/llvm.zig index c9e9b240bd..00df4346d2 100644 --- a/src/codegen/llvm.zig +++ b/src/codegen/llvm.zig @@ -2381,8 +2381,11 @@ pub const FuncGen = struct { .signed => return self.builder.buildSExt(operand, dest_llvm_ty, ""), .unsigned => return self.builder.buildZExt(operand, dest_llvm_ty, ""), } + } else if (operand_info.bits > dest_info.bits) { + return self.builder.buildTrunc(operand, dest_llvm_ty, ""); + } else { + return operand; } - return self.builder.buildTrunc(operand, dest_llvm_ty, ""); } fn airTrunc(self: *FuncGen, inst: Air.Inst.Index) !?*const llvm.Value { -- cgit v1.2.3