Pass 'min_max'

This commit is contained in:
David Gonzalez Martin 2025-06-18 08:41:39 -06:00
parent 788f8a853f
commit 0e1d279623

View File

@ -5595,7 +5595,47 @@ parse_left = fn (module: &Module, scope: &Scope, builder: ValueBuilder) &Value
},
.max, .min =>
{
#trap();
skip_space(module);
expect_character(module, left_parenthesis);
skip_space(module);
>left = parse_value(module, scope, zero);
skip_space(module);
expect_character(module, ',');
skip_space(module);
>right = parse_value(module, scope, zero);
skip_space(module);
expect_character(module, right_parenthesis);
>binary_id: BinaryId = undefined;
switch (intrinsic)
{
.max =>
{
binary_id = .max;
},
.min =>
{
binary_id = .min;
},
else => { unreachable; },
}
result.& = {
.content = {
.binary = {
.left = left,
.right = right,
.id = binary_id,
},
},
.id = .binary,
zero,
};
},
.build_mode =>
{
@ -11814,6 +11854,15 @@ get_llvm_type = fn (type: &Type, kind: TypeKind) &LLVMType
}
}
emit_intrinsic_call = fn (module: &Module, index: LLVMIntrinsicIndex, argument_types: []&LLVMType, argument_values: []&LLVMValue) &LLVMValue
{
>intrinsic_id = module.llvm.intrinsic_table[index];
>intrinsic_function = LLVMGetIntrinsicDeclaration(module.llvm.module, intrinsic_id, argument_types.pointer, argument_types.length);
>intrinsic_function_type = LLVMIntrinsicGetType(module.llvm.context, intrinsic_id, argument_types.pointer, argument_types.length);
>call = LLVMBuildCall2(module.llvm.builder, intrinsic_function_type, intrinsic_function, argument_values.pointer, #truncate(argument_values.length), "");
return call;
}
emit_binary = fn (module: &Module, left: &LLVMValue, left_type: &Type, right: &LLVMValue, right_type: &Type, id: BinaryId, resolved_value_type: &Type) &LLVMValue
{
switch (resolved_value_type.id)
@ -11830,7 +11879,34 @@ emit_binary = fn (module: &Module, left: &LLVMValue, left_type: &Type, right: &L
{
.max, .min =>
{
#trap();
>intrinsic_index: LLVMIntrinsicIndex = undefined;
switch (resolved_value_type.id)
{
.integer =>
{
>signed = resolved_value_type.content.integer.signed;
switch (id)
{
.max =>
{
intrinsic_index = #select(signed, ."llvm.smax", ."llvm.umax");
},
.min =>
{
intrinsic_index = #select(signed, ."llvm.smin", ."llvm.umin");
},
else => { unreachable; },
}
},
else => { report_error(); },
}
>argument_types: [_]&LLVMType = [ resolved_value_type.llvm.abi ];
>argument_values: [_]&LLVMValue = [ left, right ];
>llvm_value = emit_intrinsic_call(module, intrinsic_index, argument_types[..], argument_values[..]);
return llvm_value;
},
.shift_right =>
{
@ -12941,15 +13017,6 @@ emit_constant_array = fn (module: &Module, elements: []&Value, element_type: &Ty
return constant_array;
}
emit_intrinsic_call = fn (module: &Module, index: LLVMIntrinsicIndex, argument_types: []&LLVMType, argument_values: []&LLVMValue) &LLVMValue
{
>intrinsic_id = module.llvm.intrinsic_table[index];
>intrinsic_function = LLVMGetIntrinsicDeclaration(module.llvm.module, intrinsic_id, argument_types.pointer, argument_types.length);
>intrinsic_function_type = LLVMIntrinsicGetType(module.llvm.context, intrinsic_id, argument_types.pointer, argument_types.length);
>call = LLVMBuildCall2(module.llvm.builder, intrinsic_function_type, intrinsic_function, argument_values.pointer, #truncate(argument_values.length), "");
return call;
}
StructLikeFieldAccess = struct
{
type: &Type,
@ -17566,6 +17633,7 @@ names: [_][]u8 =
"enum_debug_info",
"return_array",
"bool_pair",
"min_max",
];
[export] main = fn [cc(c)] (argument_count: u32, argv: &&u8, envp: &&u8) s32