On 28/05/2020 10.48, Philippe Mathieu-Daudé wrote: > When building with clang version 10.0.0-4ubuntu1, we get: > > CC lm32-softmmu/fpu/softfloat.o > fpu/softfloat.c:3365:13: error: bitwise negation of a boolean expression; > did you mean logical negation? [-Werror,-Wbool-operation] > absZ &= ~ ( ( ( roundBits ^ 0x40 ) == 0 ) & roundNearestEven ); > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > fpu/softfloat.c:3423:18: error: bitwise negation of a boolean expression; > did you mean logical negation? [-Werror,-Wbool-operation] > absZ0 &= ~ ( ( (uint64_t) ( absZ1<<1 ) == 0 ) & roundNearestEven ); > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > fpu/softfloat.c:3483:18: error: bitwise negation of a boolean expression; > did you mean logical negation? [-Werror,-Wbool-operation] > absZ0 &= ~(((uint64_t)(absZ1<<1) == 0) & roundNearestEven); > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > fpu/softfloat.c:3606:13: error: bitwise negation of a boolean expression; > did you mean logical negation? [-Werror,-Wbool-operation] > zSig &= ~ ( ( ( roundBits ^ 0x40 ) == 0 ) & roundNearestEven ); > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > fpu/softfloat.c:3760:13: error: bitwise negation of a boolean expression; > did you mean logical negation? [-Werror,-Wbool-operation] > zSig &= ~ ( ( ( roundBits ^ 0x200 ) == 0 ) & roundNearestEven ); > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > fpu/softfloat.c:3987:21: error: bitwise negation of a boolean expression; > did you mean logical negation? [-Werror,-Wbool-operation] > ~ ( ( (uint64_t) ( zSig1<<1 ) == 0 ) & roundNearestEven > ); > > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > fpu/softfloat.c:4003:22: error: bitwise negation of a boolean expression; > did you mean logical negation? [-Werror,-Wbool-operation] > zSig0 &= ~ ( ( (uint64_t) ( zSig1<<1 ) == 0 ) & > roundNearestEven ); > > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > fpu/softfloat.c:4273:18: error: bitwise negation of a boolean expression; > did you mean logical negation? [-Werror,-Wbool-operation] > zSig1 &= ~ ( ( zSig2 + zSig2 == 0 ) & roundNearestEven ); > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > > Fix by rewriting the fishy bitwise AND of two bools as an int. > > Suggested-by: Eric Blake <ebl...@redhat.com> > Buglink: https://bugs.launchpad.net/bugs/1881004 > Signed-off-by: Philippe Mathieu-Daudé <phi...@redhat.com> > --- > v2: Resend without the Cc: "Toni Wilen <twi...@winuae.net>" tag > --- > fpu/softfloat.c | 33 ++++++++++++++++++++++++--------- > 1 file changed, 24 insertions(+), 9 deletions(-) > > diff --git a/fpu/softfloat.c b/fpu/softfloat.c > index 6c8f2d597a..0dd57eddd7 100644 > --- a/fpu/softfloat.c > +++ b/fpu/softfloat.c > @@ -3362,7 +3362,9 @@ static int32_t roundAndPackInt32(bool zSign, uint64_t > absZ, > } > roundBits = absZ & 0x7F; > absZ = ( absZ + roundIncrement )>>7; > - absZ &= ~ ( ( ( roundBits ^ 0x40 ) == 0 ) & roundNearestEven ); > + if (((roundBits ^ 0x40) == 0) && roundNearestEven) { > + absZ &= ~1; > + }
You could get rid of some more parentheses now: if ((roundBits ^ 0x40) == 0 && roundNearestEven) ... also in the other hunks. Anyway: Reviewed-by: Thomas Huth <th...@redhat.com>