| ... | @@ -7710,6 +7710,14 @@ static void float_rem(ConstExprValue *out_val, ConstExprValue *op1, ConstExprVal | ... | @@ -7710,6 +7710,14 @@ static void float_rem(ConstExprValue *out_val, ConstExprValue *op1, ConstExprVal |
| 7710 | } | 7710 | } |
| 7711 | } | 7711 | } |
| 7712 | | 7712 | |
| | 7713 | // c = a - b * trunc(a / b) |
| | 7714 | static void zig_f128M_mod(const float128_t* a, const float128_t* b, float128_t* c) { |
| | 7715 | f128M_div(a, b, c); |
| | 7716 | f128M_roundToInt(c, softfloat_round_min, true, c); |
| | 7717 | f128M_mul(b, c, c); |
| | 7718 | f128M_sub(a, c, c); |
| | 7719 | } |
| | 7720 | |
| 7713 | static void float_mod(ConstExprValue *out_val, ConstExprValue *op1, ConstExprValue *op2) { | 7721 | static void float_mod(ConstExprValue *out_val, ConstExprValue *op1, ConstExprValue *op2) { |
| 7714 | assert(op1->type == op2->type); | 7722 | assert(op1->type == op2->type); |
| 7715 | out_val->type = op1->type; | 7723 | out_val->type = op1->type; |
| ... | @@ -7724,9 +7732,7 @@ static void float_mod(ConstExprValue *out_val, ConstExprValue *op1, ConstExprVal | ... | @@ -7724,9 +7732,7 @@ static void float_mod(ConstExprValue *out_val, ConstExprValue *op1, ConstExprVal |
| 7724 | out_val->data.x_f64 = fmod(fmod(op1->data.x_f64, op2->data.x_f64) + op2->data.x_f64, op2->data.x_f64); | 7732 | out_val->data.x_f64 = fmod(fmod(op1->data.x_f64, op2->data.x_f64) + op2->data.x_f64, op2->data.x_f64); |
| 7725 | return; | 7733 | return; |
| 7726 | case 128: | 7734 | case 128: |
| 7727 | f128M_rem(&op1->data.x_f128, &op2->data.x_f128, &out_val->data.x_f128); | 7735 | zig_f128M_mod(&op1->data.x_f128, &op2->data.x_f128, &out_val->data.x_f128); |
| 7728 | f128M_add(&out_val->data.x_f128, &op2->data.x_f128, &out_val->data.x_f128); | | |
| 7729 | f128M_rem(&out_val->data.x_f128, &op2->data.x_f128, &out_val->data.x_f128); | | |
| 7730 | return; | 7736 | return; |
| 7731 | default: | 7737 | default: |
| 7732 | zig_unreachable(); | 7738 | zig_unreachable(); |