| ... | ... | @@ -24337,25 +24337,94 @@ static ErrorMsg *ir_eval_float_op(IrAnalyze *ira, Scope *scope, AstNode *source_ |
| 24337 | 24337 | break; |
| 24338 | 24338 | case BuiltinFnIdCeil: |
| 24339 | 24339 | f128M_roundToInt(in, softfloat_round_max, false, out); |
| 24340 | | break; |
| 24340 | break; |
| 24341 | 24341 | case BuiltinFnIdTrunc: |
| 24342 | 24342 | f128M_trunc(in, out); |
| 24343 | 24343 | break; |
| 24344 | 24344 | case BuiltinFnIdRound: |
| 24345 | 24345 | f128M_roundToInt(in, softfloat_round_near_maxMag, false, out); |
| 24346 | 24346 | 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 | } |
| 24359 | 24428 | default: |
| 24360 | 24429 | zig_unreachable(); |
| 24361 | 24430 | } |