diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2021-04-24 17:31:52 -0700 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2021-04-24 17:44:07 -0700 |
| commit | ff2ec0dc5ad272113379ff485bb71c6c1637d948 (patch) | |
| tree | 64a073251b80178a293434d8df9aa4cc5998bf4c /src/Sema.zig | |
| parent | e018e64a53eb7fdffedb3efadb862f400f9e9f70 (diff) | |
| download | zig-ff2ec0dc5ad272113379ff485bb71c6c1637d948.tar.gz zig-ff2ec0dc5ad272113379ff485bb71c6c1637d948.zip | |
AstGen: implement `@Vector`
Diffstat (limited to 'src/Sema.zig')
| -rw-r--r-- | src/Sema.zig | 16 |
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(); |
