mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 22:02:55 +01:00
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:
co-authored by
google-labs-jules[bot]
Carbon Infra Bot
parent
f616817b71
commit
694c00c7eb
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user