zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

commit 2707757d9cc41b6c68ab07672da2d279b4b7fd64 (tree)
parent b27bbd3a38f86f7d0592232d4f0a2c0aedc00d42
Author: Motiejus Jakštys <motiejus@jakstys.lt>
Date:   Mon, 16 Feb 2026 12:55:41 +0000

astgen.c: port multi-arg @min/@max builtins (minMax, AstGen.zig:9149-9189)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

Diffstat:
Mstage0/astgen.c | 37+++++++++++++++++++++++++++++++++++++
Mstage0/astgen_test.zig | 2+-
2 files changed, 38 insertions(+), 1 deletion(-)

diff --git a/stage0/astgen.c b/stage0/astgen.c @@ -5479,6 +5479,43 @@ static uint32_t builtinCallMultiArg(GenZir* gz, Scope* scope, ResultLoc rl, } // clang-format on + // @min / @max multi-arg (AstGen.zig:9149-9189, minMax). + // clang-format off + if ((name_len == 3 && memcmp(source + name_start, "min", 3) == 0) + || (name_len == 3 && memcmp(source + name_start, "max", 3) == 0)) { + bool is_max = (source[name_start] == 'm' && source[name_start + 1] == 'a'); + if (param_count < 2) { + SET_ERROR(ag); + return ZIR_REF_VOID_VALUE; + } + if (param_count == 2) { + uint32_t tag = is_max ? ZIR_INST_MAX : ZIR_INST_MIN; + uint32_t a = expr(gz, scope, params[0]); + uint32_t b = expr(gz, scope, params[1]); + return rvalue(gz, rl, + addPlNodeBin(gz, tag, node, a, b), node); + } + // >2 args: NodeMultiOp payload + trailing operand refs. + // payload = { src_node }, then param_count operand refs. + ensureExtraCapacity(ag, 1 + param_count); + uint32_t payload_index = ag->extra_len; + ag->extra[ag->extra_len++] + = (uint32_t)((int32_t)node - (int32_t)gz->decl_node_index); + uint32_t args_start = ag->extra_len; + ag->extra_len += param_count; + for (uint32_t i = 0; i < param_count; i++) { + uint32_t arg_ref = expr(gz, scope, params[i]); + ag->extra[args_start + i] = arg_ref; + } + uint16_t ext_tag = is_max + ? (uint16_t)ZIR_EXT_MAX_MULTI + : (uint16_t)ZIR_EXT_MIN_MULTI; + uint32_t result = addExtendedPayloadSmall( + gz, ext_tag, (uint16_t)param_count, payload_index); + return rvalue(gz, rl, result, node); + } + // clang-format on + // TODO: handle other multi-arg builtins. SET_ERROR(ag); return ZIR_REF_VOID_VALUE; diff --git a/stage0/astgen_test.zig b/stage0/astgen_test.zig @@ -1257,7 +1257,7 @@ const corpus_files = .{ "../test/behavior/int_comparison_elision.zig", "../test/behavior/ir_block_deps.zig", "../test/behavior/lower_strlit_to_vector.zig", - //"../test/behavior/maximum_minimum.zig", + "../test/behavior/maximum_minimum.zig", "../test/behavior/member_func.zig", "../test/behavior/memcpy.zig", "../test/behavior/memmove.zig",