home *** CD-ROM | disk | FTP | other *** search
/ Shareware Supreme Volume 6 #1 / swsii.zip / swsii / 201 / DJGPP3.ZIP / EMU387 / E17.CC < prev    next >
C/C++ Source or Header  |  1991-04-29  |  1KB  |  82 lines

  1. #include "emu.h"
  2. #include "rmov.h"
  3.  
  4. extern "C" void shld(void *);
  5. extern "C" void shrd(void *);
  6.  
  7. void fsqrt()
  8. {
  9.   if (empty())
  10.     return;
  11.   if (st().tag == TW_Z)
  12.     return;
  13.   if (st().exp == EXP_MAX)
  14.     return;
  15.   if (st().sign == SIGN_NEG)
  16.     return exception(EX_I);
  17.  
  18.   unsigned long long val = *(unsigned long long *)(&st().sigl);
  19.   unsigned long long result = 0;
  20.   unsigned long long side = 0;
  21.   unsigned long long left = 0;
  22.   int digit = 0;
  23.   int i;
  24.   if (st().exp & 1)
  25.   {
  26.     shrd(&val);
  27.     st().exp++;
  28.   }
  29.   int exp = (st().exp - EXP_BIAS - 1)/2 - 64;
  30.   while (!(((long *)&result)[1] & 0x80000000))
  31.   {
  32.     left = (left << 2) + (val >> 62);
  33.     shld(&val);
  34.     shld(&val);
  35.     if (left >= side*2 + 1)
  36.     {
  37.       left -= side*2+1;
  38.       side = (side+1)*2;
  39.       shld(&result);
  40.       result |= 1;
  41.     }
  42.     else
  43.     {
  44.       side *= 2;
  45.       shld(&result);
  46.     }
  47.     exp++;
  48.   }
  49.   st().exp = exp + EXP_BIAS;
  50.   st().sigl = result & 0xffffffff;
  51.   st().sigh = result >> 32;
  52.   st().tag = TW_V;
  53. }
  54.  
  55. void frndint()
  56. {
  57.   if (empty())
  58.     return;
  59.   long long tmp;
  60.   if (st().exp > EXP_BIAS+62)
  61.     return;
  62.   r_mov(st(), &tmp);
  63.   r_mov(&tmp, st());
  64. }
  65.  
  66. FUNC emu_17_table[] = {
  67.   emu_bad, emu_bad, fsqrt, emu_bad, frndint, emu_bad, emu_bad, emu_bad
  68. };
  69.  
  70. void emu_17()
  71. {
  72.   if (modrm > 0277)
  73.   {
  74.     (emu_17_table[modrm&7])();
  75.   }
  76.   else
  77.   {
  78.     // fstcw m16int
  79.     *(short *)get_modrm() = control_word;
  80.   }
  81. }
  82.