Skip to content
  • Joseph Myers's avatar
    418b0f93
    target/i386: fix IEEE SSE floating-point exception raising · 418b0f93
    Joseph Myers authored
    
    
    The SSE instruction implementations all fail to raise the expected
    IEEE floating-point exceptions because they do nothing to convert the
    exception state from the softfloat machinery into the exception flags
    in MXCSR.
    
    Fix this by adding such conversions.  Unlike for x87, emulated SSE
    floating-point operations might be optimized using hardware floating
    point on the host, and so a different approach is taken that is
    compatible with such optimizations.  The required invariant is that
    all exceptions set in env->sse_status (other than "denormal operand",
    for which the SSE semantics are different from those in the softfloat
    code) are ones that are set in the MXCSR; the emulated MXCSR is
    updated lazily when code reads MXCSR, while when code sets MXCSR, the
    exceptions in env->sse_status are set accordingly.
    
    A few instructions do not raise all the exceptions that would be
    raised by the softfloat code, and those instructions are made to save
    and restore the softfloat exception state accordingly.
    
    Nothing is done about "denormal operand"; setting that (only for the
    case when input denormals are *not* flushed to zero, the opposite of
    the logic in the softfloat code for such an exception) will require
    custom code for relevant instructions, or else architecture-specific
    conditionals in the softfloat code for when to set such an exception
    together with custom code for various SSE conversion and rounding
    instructions that do not set that exception.
    
    Nothing is done about trapping exceptions (for which there is minimal
    and largely broken support in QEMU's emulation in the x87 case and no
    support at all in the SSE case).
    
    Signed-off-by: default avatarJoseph Myers <joseph@codesourcery.com>
    Message-Id: <alpine.DEB.2.21.2006252358000.3832@digraph.polyomino.org.uk>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    418b0f93
    target/i386: fix IEEE SSE floating-point exception raising
    Joseph Myers authored
    
    
    The SSE instruction implementations all fail to raise the expected
    IEEE floating-point exceptions because they do nothing to convert the
    exception state from the softfloat machinery into the exception flags
    in MXCSR.
    
    Fix this by adding such conversions.  Unlike for x87, emulated SSE
    floating-point operations might be optimized using hardware floating
    point on the host, and so a different approach is taken that is
    compatible with such optimizations.  The required invariant is that
    all exceptions set in env->sse_status (other than "denormal operand",
    for which the SSE semantics are different from those in the softfloat
    code) are ones that are set in the MXCSR; the emulated MXCSR is
    updated lazily when code reads MXCSR, while when code sets MXCSR, the
    exceptions in env->sse_status are set accordingly.
    
    A few instructions do not raise all the exceptions that would be
    raised by the softfloat code, and those instructions are made to save
    and restore the softfloat exception state accordingly.
    
    Nothing is done about "denormal operand"; setting that (only for the
    case when input denormals are *not* flushed to zero, the opposite of
    the logic in the softfloat code for such an exception) will require
    custom code for relevant instructions, or else architecture-specific
    conditionals in the softfloat code for when to set such an exception
    together with custom code for various SSE conversion and rounding
    instructions that do not set that exception.
    
    Nothing is done about trapping exceptions (for which there is minimal
    and largely broken support in QEMU's emulation in the x87 case and no
    support at all in the SSE case).
    
    Signed-off-by: default avatarJoseph Myers <joseph@codesourcery.com>
    Message-Id: <alpine.DEB.2.21.2006252358000.3832@digraph.polyomino.org.uk>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
Loading