提交 08f4a0f7 编写于 作者: R Richard Henderson 提交者: Anthony Liguori

target-ppc: Fix SUBFE carry

While ~T0+T1+CF = T1-T0+CF-1 is true for the low 32-bits,
it does not produce the correct carry-out to bit 33.  Do
exactly what the manual says.

Cc: Alexander Graf <agraf@suse.de>
Signed-off-by: NRichard Henderson <rth@twiddle.net>
Signed-off-by: NAnthony Liguori <aliguori@us.ibm.com>
上级 e77f0832
...@@ -1120,14 +1120,15 @@ static inline void gen_op_arith_subf(DisasContext *ctx, TCGv ret, TCGv arg1, ...@@ -1120,14 +1120,15 @@ static inline void gen_op_arith_subf(DisasContext *ctx, TCGv ret, TCGv arg1,
} }
if (add_ca) { if (add_ca) {
/* dest = ~arg1 + arg2 + ca = arg2 - arg1 + ca - 1. */ /* dest = ~arg1 + arg2 + ca. */
if (compute_ca) { if (compute_ca) {
TCGv zero; TCGv zero, inv1 = tcg_temp_new();
tcg_gen_subi_tl(cpu_ca, cpu_ca, 1); tcg_gen_not_tl(inv1, arg1);
zero = tcg_const_tl(0); zero = tcg_const_tl(0);
tcg_gen_add2_tl(t0, cpu_ca, arg2, zero, cpu_ca, zero); tcg_gen_add2_tl(t0, cpu_ca, arg2, zero, cpu_ca, zero);
tcg_gen_sub2_tl(t0, cpu_ca, t0, cpu_ca, arg1, zero); tcg_gen_add2_tl(t0, cpu_ca, t0, cpu_ca, inv1, zero);
tcg_temp_free(zero); tcg_temp_free(zero);
tcg_temp_free(inv1);
} else { } else {
tcg_gen_sub_tl(t0, arg2, arg1); tcg_gen_sub_tl(t0, arg2, arg1);
tcg_gen_add_tl(t0, t0, cpu_ca); tcg_gen_add_tl(t0, t0, cpu_ca);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册