Make Core.Float a class. Add missing builtins for float support. (#5932)

Add missing builtins for float compound assignment, for building a
FloatType, and for converting a float literal to FloatType. Switch
`Core.Float` to being a class and add impls for the various
floating-point operators.

---------

Co-authored-by: google-labs-jules[bot] <161369871+google-labs-jules[bot]@users.noreply.github.com>
Co-authored-by: Carbon Infra Bot <carbon-external-infra@google.com>
This commit is contained in:
Richard Smith
2025-08-11 21:01:34 +00:00
committed by GitHub
co-authored by google-labs-jules[bot] Carbon Infra Bot
parent f616817b71
commit 694c00c7eb
66 changed files with 2158 additions and 583 deletions
+30 -8
View File
@@ -997,6 +997,20 @@ static auto MakeIntTypeResult(Context& context, SemIR::LocId loc_id,
return MakeConstantResult(context, result, phase);
}
// Forms a constant float type as an evaluation result. Requires that width_id
// is constant.
static auto MakeFloatTypeResult(Context& context, SemIR::LocId loc_id,
SemIR::InstId width_id, Phase phase)
-> SemIR::ConstantId {
auto result = SemIR::FloatType{
.type_id = GetSingletonType(context, SemIR::TypeType::TypeInstId),
.bit_width_id = width_id};
if (!ValidateFloatType(context, loc_id, result)) {
return SemIR::ErrorInst::ConstantId;
}
return MakeConstantResult(context, result, phase);
}
// Performs a conversion between integer types, truncating if the value doesn't
// fit in the destination type.
static auto PerformIntConvert(Context& context, SemIR::InstId arg_id,
@@ -1556,6 +1570,10 @@ static auto MakeConstantForBuiltinCall(EvalContext& eval_context,
case SemIR::BuiltinFunctionKind::PrintChar:
case SemIR::BuiltinFunctionKind::PrintInt:
case SemIR::BuiltinFunctionKind::ReadChar:
case SemIR::BuiltinFunctionKind::FloatAddAssign:
case SemIR::BuiltinFunctionKind::FloatSubAssign:
case SemIR::BuiltinFunctionKind::FloatMulAssign:
case SemIR::BuiltinFunctionKind::FloatDivAssign:
case SemIR::BuiltinFunctionKind::IntSAddAssign:
case SemIR::BuiltinFunctionKind::IntSSubAssign:
case SemIR::BuiltinFunctionKind::IntSMulAssign:
@@ -1625,6 +1643,10 @@ static auto MakeConstantForBuiltinCall(EvalContext& eval_context,
return context.constant_values().Get(SemIR::CharLiteralType::TypeInstId);
}
case SemIR::BuiltinFunctionKind::FloatLiteralMakeType: {
return context.constant_values().Get(SemIR::LegacyFloatType::TypeInstId);
}
case SemIR::BuiltinFunctionKind::IntLiteralMakeType: {
return context.constant_values().Get(SemIR::IntLiteralType::TypeInstId);
}
@@ -1640,14 +1662,7 @@ static auto MakeConstantForBuiltinCall(EvalContext& eval_context,
}
case SemIR::BuiltinFunctionKind::FloatMakeType: {
// TODO: Support a symbolic constant width.
if (phase != Phase::Concrete) {
break;
}
if (!ValidateFloatBitWidth(context, loc_id, arg_ids[0])) {
return SemIR::ErrorInst::ConstantId;
}
return context.constant_values().Get(SemIR::LegacyFloatType::TypeInstId);
return MakeFloatTypeResult(context, loc_id, arg_ids[0], phase);
}
case SemIR::BuiltinFunctionKind::BoolMakeType: {
@@ -1734,6 +1749,13 @@ static auto MakeConstantForBuiltinCall(EvalContext& eval_context,
arg_ids[1], call.type_id);
}
// Floating-point conversions.
case SemIR::BuiltinFunctionKind::FloatConvertChecked: {
// TODO: Perform a conversion if necessary. For now, all FloatValues are
// represented as double-precision APFloats, so no conversion is needed.
return context.constant_values().Get(arg_ids[0]);
}
// Unary float -> float operations.
case SemIR::BuiltinFunctionKind::FloatNegate: {
if (phase != Phase::Concrete) {