On 02/22/2017 08:29 PM, Nikunj A Dadhania wrote:
> * SO and OV reflects overflow of the 64-bit result in 64-bit mode and
> overflow of the low-order 32-bit result in 32-bit mode
>
> * OV32 reflects overflow of the low-order 32-bit independent of the mode
>
> Signed-off-by: Nikunj A Dadhania <nikunj@linux.vnet.ibm.com>
> ---
> target/ppc/translate.c | 14 +++++++++++---
> 1 file changed, 11 insertions(+), 3 deletions(-)
>
> diff --git a/target/ppc/translate.c b/target/ppc/translate.c
> index 184d10f..74185ba 100644
> --- a/target/ppc/translate.c
> +++ b/target/ppc/translate.c
> @@ -809,10 +809,18 @@ static inline void gen_op_arith_compute_ov(DisasContext *ctx, TCGv arg0,
> tcg_gen_andc_tl(cpu_ov, cpu_ov, t0);
> }
> tcg_temp_free(t0);
> - if (NARROW_MODE(ctx)) {
> - tcg_gen_ext32s_tl(cpu_ov, cpu_ov);
> + if (is_isa300(ctx)) {
> + tcg_gen_extract_tl(cpu_ov32, cpu_ov, 31, 1);
> + tcg_gen_extract_tl(cpu_ov, cpu_ov, 63, 1);
> + if (NARROW_MODE(ctx)) {
> + tcg_gen_mov_tl(cpu_ov, cpu_ov32);
> + }
Again, you're computing cpu_ov twice.
> + } else {
> + if (NARROW_MODE(ctx)) {
> + tcg_gen_ext32s_tl(cpu_ov, cpu_ov);
> + }
> + tcg_gen_shri_tl(cpu_ov, cpu_ov, TARGET_LONG_BITS - 1);
> }
> - tcg_gen_shri_tl(cpu_ov, cpu_ov, TARGET_LONG_BITS - 1);
> tcg_gen_or_tl(cpu_so, cpu_so, cpu_ov);
> }
>
>