On Fri, 11 Dec 2020, Andrew Haley via Gcc wrote:

> On 11/12/2020 07:12, Marc Glisse wrote:
> > On Thu, 10 Dec 2020, Lucas de Almeida via Gcc wrote:
> > 
> >> when performing (int64_t) foo / (int32_t) bar in gcc under x86, a call to
> >> __divdi3 is always output, even though it seems the use of the idiv
> >> instruction could be faster.
> > 
> > IIRC, idiv requires that the quotient fit in 32 bits, while your C code 
> > doesn't. (1LL << 60) / 3 would cause an error with idiv.
> 
> Isn't that an integer overflow, which is undefined behaviour?

No, see my other response in this thread. The division happens in type 'int64_t'
aka 'long long' (no overflow), and then int64_t result is converted to int32_t
in an implementation-defined manner (without UB).

Generally speaking an implementation-defined signal may be raised if the result
would not fit in int32_t, but GCC defines the behavior as bitwise truncation
in all cases.

Alexander

Reply via email to