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:
@@ -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;
|
||||
|
||||
@@ -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",
|
||||
|
||||
Reference in New Issue
Block a user