authorgravatar for info@bnoordhuis.nlBen Noordhuis <info@bnoordhuis.nl> 2018-06-27 16:20:04+02:00
committergravatar for info@bnoordhuis.nlBen Noordhuis <info@bnoordhuis.nl> 2018-06-27 16:20:04+02:00
log440c1d52b4053c40c58c05116c8f6d9da8e35eed
tree68de983b3b3fc8bcadaf86322428c03906547c04
parentfd75e73ee9818f12fd81d8fdb3cb949c492d664a

simplify comptime floating-point @divTrunc

Replace a conditional ceil/floor call with an unconditional trunc call.

2 files changed, 7 insertions(+), 24 deletions(-)

src/ir.cpp+5-24
......@@ -7725,33 +7725,14 @@ static void float_div_trunc(ConstExprValue *out_val, ConstExprValue *op1, ConstE
77257725 } else if (op1->type->id == TypeTableEntryIdFloat) {
77267726 switch (op1->type->data.floating.bit_count) {
77277727 case 16:
7728 {
7729 double a = zig_f16_to_double(op1->data.x_f16);
7730 double b = zig_f16_to_double(op2->data.x_f16);
7731 double c = a / b;
7732 if (c >= 0.0) {
7733 c = floor(c);
7734 } else {
7735 c = ceil(c);
7736 }
7737 out_val->data.x_f16 = zig_double_to_f16(c);
7738 return;
7739 }
7728 out_val->data.x_f16 = f16_div(op1->data.x_f16, op2->data.x_f16);
7729 out_val->data.x_f16 = f16_roundToInt(out_val->data.x_f16, softfloat_round_minMag, false);
7730 return;
77407731 case 32:
7741 out_val->data.x_f32 = op1->data.x_f32 / op2->data.x_f32;
7742 if (out_val->data.x_f32 >= 0.0) {
7743 out_val->data.x_f32 = floorf(out_val->data.x_f32);
7744 } else {
7745 out_val->data.x_f32 = ceilf(out_val->data.x_f32);
7746 }
7732 out_val->data.x_f32 = truncf(op1->data.x_f32 / op2->data.x_f32);
77477733 return;
77487734 case 64:
7749 out_val->data.x_f64 = op1->data.x_f64 / op2->data.x_f64;
7750 if (out_val->data.x_f64 >= 0.0) {
7751 out_val->data.x_f64 = floor(out_val->data.x_f64);
7752 } else {
7753 out_val->data.x_f64 = ceil(out_val->data.x_f64);
7754 }
7735 out_val->data.x_f64 = trunc(op1->data.x_f64 / op2->data.x_f64);
77557736 return;
77567737 case 128:
77577738 f128M_div(&op1->data.x_f128, &op2->data.x_f128, &out_val->data.x_f128);
test/cases/math.zig+2
......@@ -33,6 +33,8 @@ fn testDivision() void {
3333 assert(divTrunc(f16, -5.0, 3.0) == -1.0);
3434 assert(divTrunc(f32, 5.0, 3.0) == 1.0);
3535 assert(divTrunc(f32, -5.0, 3.0) == -1.0);
36 assert(divTrunc(f64, 5.0, 3.0) == 1.0);
37 assert(divTrunc(f64, -5.0, 3.0) == -1.0);
3638
3739 comptime {
3840 assert(