On Monday, 28 July 2014 at 09:46:34 UTC, bearophile wrote:
    uint y = 3_000_000_000;
    writeln(x, " ", y);
    writeln(x * y);

D promotes int to uint, right? Which is a bad idea. It should promote to long, right?

    bool overflow = false;
    immutable r1 = muls(x, y, overflow);

Why does muls accept this without an explicit cast to signed operands long? If the result is signed, the operands should be signed?

    overflow = false;
    immutable r2 = mulu(x, y, overflow);

Well, it overflows because you multiply 0xfffffffff with 3000000000 if it promotes int to uint, but the result would still be incorrect without an overflow if the values were -1 and 1. You would get 0xffffffff without an overflow/underflow.

(I might get it all wrong here, I didn't run the code.)

However, if you manually remove overflow checks, you probably need to check that you still get vectorized output with auto-vectorization. Maybe it is better that the backend deals with it. Dunno.

Reply via email to