On Fri, 12 Apr 2013, Jakub Jelinek wrote: > On Thu, Apr 11, 2013 at 09:13:17PM +0200, Marc Glisse wrote: > > On Thu, 11 Apr 2013, Jakub Jelinek wrote: > > > > >The op1 - op2 line instead of multiplication is something that has been > > >introduced in C++ double_int changes, but without the 2 * TYPE_PRECISION > > >prec it would always return 0 or -1 anyway. > > > > The comments on PREC in the rshift function really confused me. > > Yeah, me too. But if count == prec, the code always: > /* Zero / sign extend all bits that are beyond the precision. */ > > if (count >= prec) > { > *hv = signmask; > *lv = signmask; > } > which is definitely not what we want. We want TYPE_PRECISION bits > of the result zero resp. sign extended into the whole double_int precision, > which for TYPE_PRECISION == HOST_BITS_PER_WIDE_INT is exactly the: > else if ((prec - count) >= HOST_BITS_PER_WIDE_INT) > { > *hv &= ~((HOST_WIDE_INT) (-1) << (prec - count - > HOST_BITS_PER_WIDE_INT)); > *hv |= signmask << (prec - count - HOST_BITS_PER_WIDE_INT); > } > case, and for smaller TYPE_PRECISION it is the last case: > else > { > *hv = signmask; > *lv &= ~((unsigned HOST_WIDE_INT) (-1) << (prec - count)); > *lv |= signmask << (prec - count); > } > > > I have one question below. > > >+ { > > >+ if (TYPE_PRECISION (type) != 2 * HOST_BITS_PER_WIDE_INT) > > >+ return NULL_TREE; > > >+ op1.wide_mul_with_sign (op2, false, &res, &overflow); > > > > Why "false" and not something involving "uns"? > > false was what rth used in his original code. Looking at what is the > difference, it seems unsigned_p only matters for the computation of > overflow, and, MULT_HIGHPART_EXPR should never overflow, thus perhaps > we should either have a dummy bool overflow_dummy; there and use it > instead of &overflow, or just set overflow = false; afterwards. > Preferences?
dummy_overflow. Ok with that change. Thanks, Richard.