qemu-ppc
[Top][All Lists]
Advanced

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

[Qemu-ppc] ppc: TCG and FP exceptions, is it right ?


From: Benjamin Herrenschmidt
Subject: [Qemu-ppc] ppc: TCG and FP exceptions, is it right ?
Date: Mon, 25 Jul 2016 19:44:46 +1000

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  ?

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 ?

Cheers,
Ben.





reply via email to

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