<<<    Index    >>>
F-23
GUIDELINES FOR WRITING SIMD FLOATING-POINT EXCEPTION
        exc_env->exception_cause = INEXACT;
        if (result_tiny) {
          exc_env->status_flag_underflow = 1;
          // if ftz = 1 and result is tiny, result = 0.0
          // (no need to check for underflow traps disabled: result tiny and
          // underflow traps enabled would have caused taking an underflow
          // trap above)
          if (exc_env->ftz) {
            if (res > 0.0)
              res = ZEROF;
            else if (res < 0.0)
              res = NZEROF;
            // else leave res unchanged
          }
        }
        if (result_huge) exc_env->status_flag_overflow = 1;
        exc_env->result_fval = res; 
        return (RAISE_EXCEPTION);
      } 
      // if it got here, then there is no trap to be taken; the following must
      // hold: ((the MXCSR U exceptions are disabled  or
      //
      // the MXCSR underflow exceptions are enabled and the underflow flag is
      // clear and (the inexact flag is set or the inexact flag is clear and
      // the 24-bit result with unbounded exponent is not tiny)))
      // and (the MXCSR overflow traps are disabled or the overflow flag is
      // clear) and (the MXCSR inexact traps are disabled or the inexact flag
      // is clear)
      //
      // in this case, the result has to be delivered (the status flags are 
      // sticky, so they are all set correctly already)
      // read status word to see if result is inexact
      __asm {
        fstsw WORD PTR sw;
      }
 
      if (sw & UNDERFLOW_MASK) exc_env->status_flag_underflow = 1;
      if (sw & OVERFLOW_MASK) exc_env->status_flag_overflow = 1;
      if (sw & PRECISION_MASK) exc_env->status_flag_inexact = 1;
      // if ftz = 1, and result is tiny (underflow traps must be disabled),
      // result = 0.0
      if (exc_env->ftz && result_tiny) {
        if (res > 0.0)
<<<    Index    >>>