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:
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",