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...