[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Qemu-ppc] ppc: TCG and FP exceptions, is it right ?
From: |
Tristan Gingold |
Subject: |
Re: [Qemu-ppc] ppc: TCG and FP exceptions, is it right ? |
Date: |
Mon, 25 Jul 2016 17:12:18 +0200 |
> On 25 Jul 2016, at 11:44, Benjamin Herrenschmidt <address@hidden> wrote:
>
> Hi folks !
>
> I could use a bit of help determining if something is quite right in
> TCG emulation of FP ops.
>
> Fabien, Tristan, you submitted a patch back in 2013:
>
> db72c9f256ae70b30c5d5985234f085df4226c55 "powerpc: correctly handle fpu
> exceptions" which effectively makes any of the exceptions generated
> for underflow, overflow and inexact fire right away
> (helper_raise_exception_err will exit the cpu loop with a setjmp).
>
> This makes them effectively do the same thing
> as float_zero_divide_excp().
>
> However I *think* it might not be what we want, according to the
> comment in helper_float_check_status() that says
>
> /* Differred floating-point exception after target FPR update */
>
> And according to the architecture definition for those exceptions,
> where we indeed want the target FPR updated before we take the
> interrupts.
>
> The code as writte will take the exception before the FPR is updated,
> I *think*, or am I missing something here ?
This looks like an oversight. In our tests, we don't read the fpr.
>
> I think the intent was to return to the translated code so the FPRons
> update happen, though we ideally would need to also set some state
> so the translated code itself can then check for an exception and
> fire it.
>
> However as you noticed, that doesn't work well either.
>
> What do you think is the most appropriate implementation here?
>
> I'm thinking it's almost worth bringing FE0/FE1 into the hflags
> so that we know at translation time whether to be precise, imprecise,
> or ignore FP exceptions.
>
> Then we could do something along the lines of:
>
> - In the helpers, when checking status, set an env flag if an
> exception should occur.
>
> - In all the translate call sites, if FE0/1 is non-0 (at translate
> time), generate call to check that flag and shoot the exception
>
> - Optionally, we could even implement some smarts to defer this to
> the end of a TB in imprecise mode.
>
> An additional note is that if FE0/FE1 are 0, we still in some case
> leave an exception behind in cs->exception_index. Now, I *think*
> that's ok, it will just be silently dropped at some point, but I am not
> 100% certain as that's a part of TCG I'm an not super familiar with
> yet.
>
> What do you guys reckon ? I am missing something here ?
I like the second helper suggestion from address@hidden That's simple.
Tristan.