aboutsummaryrefslogtreecommitdiff
path: root/src/Sema.zig
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2021-04-24 17:31:52 -0700
committerAndrew Kelley <andrew@ziglang.org>2021-04-24 17:44:07 -0700
commitff2ec0dc5ad272113379ff485bb71c6c1637d948 (patch)
tree64a073251b80178a293434d8df9aa4cc5998bf4c /src/Sema.zig
parente018e64a53eb7fdffedb3efadb862f400f9e9f70 (diff)
downloadzig-ff2ec0dc5ad272113379ff485bb71c6c1637d948.tar.gz
zig-ff2ec0dc5ad272113379ff485bb71c6c1637d948.zip
AstGen: implement `@Vector`
Diffstat (limited to 'src/Sema.zig')
-rw-r--r--src/Sema.zig16
1 files changed, 16 insertions, 0 deletions
diff --git a/src/Sema.zig b/src/Sema.zig
index af0fe90649..308e1d8859 100644
--- a/src/Sema.zig
+++ b/src/Sema.zig
@@ -143,6 +143,7 @@ pub fn analyzeBody(
.array_mul => try sema.zirArrayMul(block, inst),
.array_type => try sema.zirArrayType(block, inst),
.array_type_sentinel => try sema.zirArrayTypeSentinel(block, inst),
+ .vector_type => try sema.zirVectorType(block, inst),
.as => try sema.zirAs(block, inst),
.as_node => try sema.zirAsNode(block, inst),
.bit_and => try sema.zirBitwise(block, inst, .bit_and),
@@ -2143,6 +2144,21 @@ fn zirElemType(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) InnerErro
return sema.mod.constType(sema.arena, src, elem_type);
}
+fn zirVectorType(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) InnerError!*Inst {
+ const inst_data = sema.code.instructions.items(.data)[inst].pl_node;
+ const src = inst_data.src();
+ const elem_type_src: LazySrcLoc = .{ .node_offset_builtin_call_arg0 = inst_data.src_node };
+ const len_src: LazySrcLoc = .{ .node_offset_builtin_call_arg1 = inst_data.src_node };
+ const extra = sema.code.extraData(Zir.Inst.Bin, inst_data.payload_index).data;
+ const len = try sema.resolveAlreadyCoercedInt(block, len_src, extra.lhs, u32);
+ const elem_type = try sema.resolveType(block, elem_type_src, extra.rhs);
+ const vector_type = try Type.Tag.vector.create(sema.arena, .{
+ .len = len,
+ .elem_type = elem_type,
+ });
+ return sema.mod.constType(sema.arena, src, vector_type);
+}
+
fn zirArrayType(sema: *Sema, block: *Scope.Block, inst: Zir.Inst.Index) InnerError!*Inst {
const tracy = trace(@src());
defer tracy.end();