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

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-16 12:55:41 +00:00
parent b27bbd3a38
commit 2707757d9c
2 changed files with 38 additions and 1 deletions

View File

@@ -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;

View File

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