On 09/07/2015 10:09 AM, Peter Maydell wrote:
On 2 September 2015 at 18:57, Richard Henderson <[email protected]> wrote:+ case 9: /* ls: !C || Z -> !(C && !Z) */ + cond = TCG_COND_NE; + value = tcg_temp_new_i32(); + global = false; + tcg_gen_neg_i32(value, cpu_CF); + tcg_gen_and_i32(value, value, cpu_ZF); break;The comment says hi is C && !Z, but the code doesn't seem to line up with that. At least part of that is presumably because we store ZF inverted, but why are we negating CF here?
We're computing CF ? -1 : 0. ANDing that with !Z (aka cpu_ZF) gets us C & !Z.
case 12: /* gt: !Z && N == V */ case 13: /* le: Z || N != V */ + cond = TCG_COND_NE; + value = tcg_temp_new_i32(); + global = false; + tcg_gen_xor_i32(value, cpu_VF, cpu_NF); + tcg_gen_sari_i32(value, value, 31); + tcg_gen_andc_i32(value, cpu_ZF, value);I think this is correct, but it could use some commentary to explain what it's doing.
Fair enough. r~
