<<<    Index    >>>
F-22
GUIDELINES FOR WRITING SIMD FLOATING-POINT EXCEPTION 
        case MULPS:
        case MULSS:
          // perform the multiplication
          __asm {
            // load input operands
            fld DWORD PTR opd1; // may set the denormal status flag
            fld DWORD PTR opd2; // may set the denormal status flag
            fmulp st(1), st(0); // rounded to 53 bits, exact
            // store result
            fstp  QWORD PTR dbl_res; // exact, will not set any flag
          }
          break;
        case DIVPS:
        case DIVSS:
          // perform the division
          __asm {
            // load input operands
            fld DWORD PTR opd1; // may set the denormal status flag
            fld DWORD PTR opd2; // may set the denormal status flag
            fdivp st(1), st(0); // rounded to 53 bits, may set the inexact
                                // status flag
            // store result
            fstp  QWORD PTR dbl_res; // exact, will not set any flag
          }
          break;
        default:
          ; // will never occur
      }
      // calculate result for the case an inexact trap has to be taken, or
      // when no trap occurs (second IEEE rounding)
      res = (float)dbl_res; 
          // may set P, U or O; may also involve denormalizing the result
      // read status word
      __asm {
        fstsw WORD PTR sw;
      }
      // if inexact traps are enabled and result is inexact, take inexact trap
      if (!(exc_env->exc_masks & PRECISION_MASK) && 
          ((sw & PRECISION_MASK) || (exc_env->ftz && result_tiny))) {
        exc_env->status_flag_inexact = 1;
<<<    Index    >>>