From fc185a6f71b9bd611a6d808082999a9da0f107e8 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Wed, 23 Jun 2021 09:52:09 -0700 Subject: [PATCH] stage1: `@shuffle` type and mask params in comptime scope --- src/stage1/astgen.cpp | 7 +++++-- test/behavior/vector.zig | 13 +++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/src/stage1/astgen.cpp b/src/stage1/astgen.cpp index 118b920f58..b69cd480c6 100644 --- a/src/stage1/astgen.cpp +++ b/src/stage1/astgen.cpp @@ -4599,8 +4599,11 @@ static IrInstSrc *astgen_builtin_fn_call(Stage1AstGen *ag, Scope *scope, AstNode } case BuiltinFnIdShuffle: { + // Used for the type expr and the mask expr + Scope *comptime_scope = create_comptime_scope(ag->codegen, node, scope); + AstNode *arg0_node = node->data.fn_call_expr.params.at(0); - IrInstSrc *arg0_value = astgen_node(ag, arg0_node, scope); + IrInstSrc *arg0_value = astgen_node(ag, arg0_node, comptime_scope); if (arg0_value == ag->codegen->invalid_inst_src) return arg0_value; @@ -4615,7 +4618,7 @@ static IrInstSrc *astgen_builtin_fn_call(Stage1AstGen *ag, Scope *scope, AstNode return arg2_value; AstNode *arg3_node = node->data.fn_call_expr.params.at(3); - IrInstSrc *arg3_value = astgen_node(ag, arg3_node, scope); + IrInstSrc *arg3_value = astgen_node(ag, arg3_node, comptime_scope); if (arg3_value == ag->codegen->invalid_inst_src) return arg3_value; diff --git a/test/behavior/vector.zig b/test/behavior/vector.zig index 1847640a91..2c615b542b 100644 --- a/test/behavior/vector.zig +++ b/test/behavior/vector.zig @@ -634,3 +634,16 @@ test "vector reduce operation" { try S.doTheTest(); comptime try S.doTheTest(); } + +test "mask parameter of @shuffle is comptime scope" { + const __v4hi = std.meta.Vector(4, i16); + var v4_a = __v4hi{ 0, 0, 0, 0 }; + var v4_b = __v4hi{ 0, 0, 0, 0 }; + var shuffled: __v4hi = @shuffle(i16, v4_a, v4_b, std.meta.Vector(4, i32){ + std.zig.c_translation.shuffleVectorIndex(0, @typeInfo(@TypeOf(v4_a)).Vector.len), + std.zig.c_translation.shuffleVectorIndex(0, @typeInfo(@TypeOf(v4_a)).Vector.len), + std.zig.c_translation.shuffleVectorIndex(0, @typeInfo(@TypeOf(v4_a)).Vector.len), + std.zig.c_translation.shuffleVectorIndex(0, @typeInfo(@TypeOf(v4_a)).Vector.len), + }); + _ = shuffled; +}