From 66940c291149255c19d0b163a3ebc8e023963f04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Motiejus=20Jak=C5=A1tys?= Date: Mon, 16 Feb 2026 13:27:58 +0000 Subject: [PATCH] astgen.c: port @select builtin (ZIR_EXT_SELECT) Co-Authored-By: Claude Opus 4.6 --- stage0/astgen.c | 26 ++++++++++++++++++++++++++ stage0/astgen_test.zig | 2 +- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/stage0/astgen.c b/stage0/astgen.c index 7c5dc43e02..34cf25e06f 100644 --- a/stage0/astgen.c +++ b/stage0/astgen.c @@ -5326,7 +5326,33 @@ static uint32_t builtinCallMultiArg(GenZir* gz, Scope* scope, ResultLoc rl, gz, ZIR_INST_SHUFFLE, node, payload_index); return rvalue(gz, rl, result, node); } + // clang-format on + + // @select — AstGen.zig:9664-9673. + // clang-format off + if (name_len == 6 && memcmp(source + name_start, "select", 6) == 0 + && param_count == 4) { + uint32_t elem_type = typeExpr(gz, scope, params[0]); + uint32_t pred = expr(gz, scope, params[1]); + uint32_t a = expr(gz, scope, params[2]); + uint32_t b = expr(gz, scope, params[3]); + // Select payload: node_offset, elem_type, pred, a, b (5 words). + ensureExtraCapacity(ag, 5); + uint32_t payload_index = ag->extra_len; + ag->extra[ag->extra_len++] + = (uint32_t)((int32_t)node - (int32_t)gz->decl_node_index); + ag->extra[ag->extra_len++] = elem_type; + ag->extra[ag->extra_len++] = pred; + ag->extra[ag->extra_len++] = a; + ag->extra[ag->extra_len++] = b; + uint32_t result = addExtendedPayload( + gz, (uint16_t)ZIR_EXT_SELECT, payload_index); + return rvalue(gz, rl, result, node); + } + // clang-format on + // @TypeOf multi-arg (AstGen.zig:9120-9146). + // clang-format off if (name_len == 6 && memcmp(source + name_start, "TypeOf", 6) == 0) { // Reserve extra space: 3 (TypeOfPeer payload) + param_count (refs). uint32_t payload_size = 3; // src_node, body_len, body_index diff --git a/stage0/astgen_test.zig b/stage0/astgen_test.zig index 8e42fad59e..ef17ca7159 100644 --- a/stage0/astgen_test.zig +++ b/stage0/astgen_test.zig @@ -1279,7 +1279,7 @@ const corpus_files = .{ "../test/behavior/ref_var_in_if_after_if_2nd_switch_prong.zig", "../test/behavior/return_address.zig", "../test/behavior/saturating_arithmetic.zig", - //"../test/behavior/select.zig", + "../test/behavior/select.zig", "../test/behavior/shuffle.zig", //"../test/behavior/sizeof_and_typeof.zig", "../test/behavior/slice_sentinel_comptime.zig",