| ... | @@ -24337,25 +24337,94 @@ static ErrorMsg *ir_eval_float_op(IrAnalyze *ira, Scope *scope, AstNode *source_ | ... | @@ -24337,25 +24337,94 @@ static ErrorMsg *ir_eval_float_op(IrAnalyze *ira, Scope *scope, AstNode *source_ |
| 24337 | break; | 24337 | break; |
| 24338 | case BuiltinFnIdCeil: | 24338 | case BuiltinFnIdCeil: |
| 24339 | f128M_roundToInt(in, softfloat_round_max, false, out); | 24339 | f128M_roundToInt(in, softfloat_round_max, false, out); |
| 24340 | break; | 24340 | break; |
| 24341 | case BuiltinFnIdTrunc: | 24341 | case BuiltinFnIdTrunc: |
| 24342 | f128M_trunc(in, out); | 24342 | f128M_trunc(in, out); |
| 24343 | break; | 24343 | break; |
| 24344 | case BuiltinFnIdRound: | 24344 | case BuiltinFnIdRound: |
| 24345 | f128M_roundToInt(in, softfloat_round_near_maxMag, false, out); | 24345 | f128M_roundToInt(in, softfloat_round_near_maxMag, false, out); |
| 24346 | break; | 24346 | break; |
| 24347 | case BuiltinFnIdNearbyInt: | 24347 | case BuiltinFnIdNearbyInt: { |
| 24348 | case BuiltinFnIdSin: | 24348 | float64_t f64_value = f128M_to_f64(in); |
| 24349 | case BuiltinFnIdCos: | 24349 | double double_value; |
| 24350 | case BuiltinFnIdTan: | 24350 | memcpy(&double_value, &f64_value, sizeof(double)); |
| 24351 | case BuiltinFnIdExp: | 24351 | double_value = nearbyint(double_value); |
| 24352 | case BuiltinFnIdExp2: | 24352 | memcpy(&f64_value, &double_value, sizeof(double)); |
| 24353 | case BuiltinFnIdLog: | 24353 | f64_to_f128M(f64_value, out); |
| 24354 | case BuiltinFnIdLog10: | 24354 | break; |
| 24355 | case BuiltinFnIdLog2: | 24355 | } |
| 24356 | return ir_add_error_node(ira, source_node, | 24356 | case BuiltinFnIdSin: { |
| 24357 | buf_sprintf("compiler bug: TODO: implement '%s' for type '%s'. See https://github.com/ziglang/zig/issues/4026", | 24357 | float64_t f64_value = f128M_to_f64(in); |
| 24358 | float_un_op_to_name(fop), buf_ptr(&float_type->name))); | 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 | } |
| 24359 | default: | 24428 | default: |
| 24360 | zig_unreachable(); | 24429 | zig_unreachable(); |
| 24361 | } | 24430 | } |