On Fri, Jul 04, 2014 at 12:05:37AM +0100, Peter Maydell wrote:
> On 3 July 2014 23:47, Al Viro <v...@zeniv.linux.org.uk> wrote:
> > How can that be correct?  Suppose a = b = 0.  We get
> > tcg_gen_eqv_i64(tmp, va, vb);   ->      tmp = -1
> > tcg_gen_mov_i64(tmp2, va);      ->      tmp2 = 0
> > tcg_gen_add_i64(vc, va, vb);    ->      c = 0
> > tcg_gen_xor_i64(tmp2, tmp2, vc);->      tmp2 = 0
> > tcg_gen_and_i64(tmp, tmp, tmp2);->      tmp = -1
> 
> tmp2 here is 0, so the result of this AND is 0, not -1...

Doh.  Misread it as tcg_gen_add_i64, sorry.

Hmm...  So it's ((a ^ ~b) & (a ^ c) < 0 as overflow condition, IOW
MSB(a) == MSB(b) && MSB(c) != MSB(a).  OK, that works; might deserve
a comment, though...

Reply via email to