qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH v6 08/16] target-or32: Add instruction tanslatio


From: Max Filippov
Subject: Re: [Qemu-devel] [PATCH v6 08/16] target-or32: Add instruction tanslation
Date: Tue, 26 Jun 2012 13:32:57 +0400

On Tue, Jun 26, 2012 at 1:14 PM, 陳韋任 (Wei-Ren Chen)
<address@hidden> wrote:
>> > 0xffffffff is -1, 0x80000000 is -MAX.
>> > -1/-MAX ?will raise a exception, and I've handle this.

-1 / -MAX equals 0, it's not the issue here.

>> > -MAX/-1 ?will get a MAX, for max value of a register is -(-MAX)-1, so,
>> > it overflowed, I didn't handle this.
>>
>> Actually you did this with three brcondi in the else branch. The only thing
>> left is not to crash in case guest doesn't want range exception.
>
> So Jia need to do something like below
>
>  /*
>   *  if ((%ra == 0xffffffff || %rb == 0x80000000) && (sr_ove == 0))

Actually the condition that needs special care is

((%rb == 0 || %ra == 0x80000000 && %rb == 0xffffffff) && sr_ove == 0)

>   *    goto lab3;
>   *
>   *  lab3:
>   *    compute %ra/%rb but do NOT cause host failed?

This step is empty if the result is undefined, which I think is the case.

>   */
>  tcg_gen_ori_tl(cpu_sr, cpu_sr, SR_OV);
>  tcg_gen_ori_tl(cpu_sr, cpu_sr, SR_CY);

If we get here then the first part of condition (before && sr_ove == 0)
is true.

>  tcg_gen_brcondi_tl(TCG_COND_NE, sr_ove, SR_OVE, lab3);
>  gen_exception(dc, EXCP_RANGE);
>  gen_set_label(lab2);
>  tcg_gen_div_tl(cpu_R[rd], cpu_R[ra], cpu_R[rb]);
>  gen_set_label(lab3);
>
>    ???

??? == just nothing.

-- 
Thanks.
-- Max



reply via email to

[Prev in Thread] Current Thread [Next in Thread]