aboutsummaryrefslogtreecommitdiff
path: root/src/codegen
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-10-05 21:38:47 -0700
committerAndrew Kelley <andrew@ziglang.org>2021-10-05 21:38:47 -0700
commitcb616cb7972bb2f38ea4527c7ec0ae3cc0d64c7c (patch)
treebb34a640825465b95c7be5c712da5a5a17217192 /src/codegen
parent941b2f0d5e50521c41e6db3912085a72b6c16813 (diff)
downloadzig-cb616cb7972bb2f38ea4527c7ec0ae3cc0d64c7c.tar.gz
zig-cb616cb7972bb2f38ea4527c7ec0ae3cc0d64c7c.zip
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.
Diffstat (limited to 'src/codegen')
-rw-r--r--src/codegen/llvm.zig5
1 files changed, 4 insertions, 1 deletions
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 {