authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-04-27 19:34:33-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-04-27 19:34:33-07:00
logc26f7550f037e44fea51983eeb3f0adbb34d1d38
tree91faee66ce0e90ac7c0124c29813f8db97f31b32
parent7d8067878dd4200d73052b8ffd80e2f23c32c2cc

stage1: add missing comptime float ops

These are only as accurate as f64 even for f128 comptime functions. This is OK for now; improvements will come with the launch of self-hosted (#89) and enhancements to compiler-rt implementations.

1 files changed, 82 insertions(+), 13 deletions(-)

src/stage1/ir.cpp+82-13
......@@ -24337,25 +24337,94 @@ static ErrorMsg *ir_eval_float_op(IrAnalyze *ira, Scope *scope, AstNode *source_
2433724337 break;
2433824338 case BuiltinFnIdCeil:
2433924339 f128M_roundToInt(in, softfloat_round_max, false, out);
24340 break;
24340 break;
2434124341 case BuiltinFnIdTrunc:
2434224342 f128M_trunc(in, out);
2434324343 break;
2434424344 case BuiltinFnIdRound:
2434524345 f128M_roundToInt(in, softfloat_round_near_maxMag, false, out);
2434624346 break;
24347 case BuiltinFnIdNearbyInt:
24348 case BuiltinFnIdSin:
24349 case BuiltinFnIdCos:
24350 case BuiltinFnIdTan:
24351 case BuiltinFnIdExp:
24352 case BuiltinFnIdExp2:
24353 case BuiltinFnIdLog:
24354 case BuiltinFnIdLog10:
24355 case BuiltinFnIdLog2:
24356 return ir_add_error_node(ira, source_node,
24357 buf_sprintf("compiler bug: TODO: implement '%s' for type '%s'. See https://github.com/ziglang/zig/issues/4026",
24358 float_un_op_to_name(fop), buf_ptr(&float_type->name)));
24347 case BuiltinFnIdNearbyInt: {
24348 float64_t f64_value = f128M_to_f64(in);
24349 double double_value;
24350 memcpy(&double_value, &f64_value, sizeof(double));
24351 double_value = nearbyint(double_value);
24352 memcpy(&f64_value, &double_value, sizeof(double));
24353 f64_to_f128M(f64_value, out);
24354 break;
24355 }
24356 case BuiltinFnIdSin: {
24357 float64_t f64_value = f128M_to_f64(in);
24358 double double_value;
24359 memcpy(&double_value, &f64_value, sizeof(double));
24360 double_value = sin(double_value);
24361 memcpy(&f64_value, &double_value, sizeof(double));
24362 f64_to_f128M(f64_value, out);
24363 break;
24364 }
24365 case BuiltinFnIdCos: {
24366 float64_t f64_value = f128M_to_f64(in);
24367 double double_value;
24368 memcpy(&double_value, &f64_value, sizeof(double));
24369 double_value = cos(double_value);
24370 memcpy(&f64_value, &double_value, sizeof(double));
24371 f64_to_f128M(f64_value, out);
24372 break;
24373 }
24374 case BuiltinFnIdTan: {
24375 float64_t f64_value = f128M_to_f64(in);
24376 double double_value;
24377 memcpy(&double_value, &f64_value, sizeof(double));
24378 double_value = tan(double_value);
24379 memcpy(&f64_value, &double_value, sizeof(double));
24380 f64_to_f128M(f64_value, out);
24381 break;
24382 }
24383 case BuiltinFnIdExp: {
24384 float64_t f64_value = f128M_to_f64(in);
24385 double double_value;
24386 memcpy(&double_value, &f64_value, sizeof(double));
24387 double_value = exp(double_value);
24388 memcpy(&f64_value, &double_value, sizeof(double));
24389 f64_to_f128M(f64_value, out);
24390 break;
24391 }
24392 case BuiltinFnIdExp2: {
24393 float64_t f64_value = f128M_to_f64(in);
24394 double double_value;
24395 memcpy(&double_value, &f64_value, sizeof(double));
24396 double_value = exp2(double_value);
24397 memcpy(&f64_value, &double_value, sizeof(double));
24398 f64_to_f128M(f64_value, out);
24399 break;
24400 }
24401 case BuiltinFnIdLog: {
24402 float64_t f64_value = f128M_to_f64(in);
24403 double double_value;
24404 memcpy(&double_value, &f64_value, sizeof(double));
24405 double_value = log(double_value);
24406 memcpy(&f64_value, &double_value, sizeof(double));
24407 f64_to_f128M(f64_value, out);
24408 break;
24409 }
24410 case BuiltinFnIdLog10: {
24411 float64_t f64_value = f128M_to_f64(in);
24412 double double_value;
24413 memcpy(&double_value, &f64_value, sizeof(double));
24414 double_value = log10(double_value);
24415 memcpy(&f64_value, &double_value, sizeof(double));
24416 f64_to_f128M(f64_value, out);
24417 break;
24418 }
24419 case BuiltinFnIdLog2: {
24420 float64_t f64_value = f128M_to_f64(in);
24421 double double_value;
24422 memcpy(&double_value, &f64_value, sizeof(double));
24423 double_value = log2(double_value);
24424 memcpy(&f64_value, &double_value, sizeof(double));
24425 f64_to_f128M(f64_value, out);
24426 break;
24427 }
2435924428 default:
2436024429 zig_unreachable();
2436124430 }