/[qemu]/qemu/helper-i386.c
ViewVC logotype

Diff of /qemu/helper-i386.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.6 by bellard, Wed Jun 25 16:18:05 2003 UTC revision 1.7 by bellard, Tue Jul 1 15:05:19 2003 UTC
# Line 981  void helper_lar(void) Line 981  void helper_lar(void)
981  #ifndef USE_X86LDOUBLE  #ifndef USE_X86LDOUBLE
982  void helper_fldt_ST0_A0(void)  void helper_fldt_ST0_A0(void)
983  {  {
984      ST0 = helper_fldt((uint8_t *)A0);      int new_fpstt;
985        new_fpstt = (env->fpstt - 1) & 7;
986        env->fpregs[new_fpstt] = helper_fldt((uint8_t *)A0);
987        env->fpstt = new_fpstt;
988        env->fptags[new_fpstt] = 0; /* validate stack entry */
989  }  }
990    
991  void helper_fstt_ST0_A0(void)  void helper_fstt_ST0_A0(void)
# Line 996  void helper_fstt_ST0_A0(void) Line 1000  void helper_fstt_ST0_A0(void)
1000    
1001  void helper_fbld_ST0_A0(void)  void helper_fbld_ST0_A0(void)
1002  {  {
1003      uint8_t *seg;      CPU86_LDouble tmp;
1004      CPU86_LDouble fpsrcop;      uint64_t val;
     int m32i;  
1005      unsigned int v;      unsigned int v;
1006        int i;
1007    
1008      /* in this code, seg/m32i will be used as temporary ptr/int */      val = 0;
1009      seg = (uint8_t *)A0 + 8;      for(i = 8; i >= 0; i--) {
1010      v = ldub(seg--);          v = ldub((uint8_t *)A0 + i);
1011      /* XXX: raise exception */          val = (val * 100) + ((v >> 4) * 10) + (v & 0xf);
1012      if (v != 0)      }
1013          return;      tmp = val;
1014      v = ldub(seg--);      if (ldub((uint8_t *)A0 + 9) & 0x80)
1015      /* XXX: raise exception */          tmp = -tmp;
1016      if ((v & 0xf0) != 0)      fpush();
1017          return;      ST0 = tmp;
     m32i = v;  /* <-- d14 */  
     v = ldub(seg--);  
     m32i = MUL10(m32i) + (v >> 4);  /* <-- val * 10 + d13 */  
     m32i = MUL10(m32i) + (v & 0xf); /* <-- val * 10 + d12 */  
     v = ldub(seg--);  
     m32i = MUL10(m32i) + (v >> 4);  /* <-- val * 10 + d11 */  
     m32i = MUL10(m32i) + (v & 0xf); /* <-- val * 10 + d10 */  
     v = ldub(seg--);  
     m32i = MUL10(m32i) + (v >> 4);  /* <-- val * 10 + d9 */  
     m32i = MUL10(m32i) + (v & 0xf); /* <-- val * 10 + d8 */  
     fpsrcop = ((CPU86_LDouble)m32i) * 100000000.0;  
   
     v = ldub(seg--);  
     m32i = (v >> 4);  /* <-- d7 */  
     m32i = MUL10(m32i) + (v & 0xf); /* <-- val * 10 + d6 */  
     v = ldub(seg--);  
     m32i = MUL10(m32i) + (v >> 4);  /* <-- val * 10 + d5 */  
     m32i = MUL10(m32i) + (v & 0xf); /* <-- val * 10 + d4 */  
     v = ldub(seg--);  
     m32i = MUL10(m32i) + (v >> 4);  /* <-- val * 10 + d3 */  
     m32i = MUL10(m32i) + (v & 0xf); /* <-- val * 10 + d2 */  
     v = ldub(seg);  
     m32i = MUL10(m32i) + (v >> 4);  /* <-- val * 10 + d1 */  
     m32i = MUL10(m32i) + (v & 0xf); /* <-- val * 10 + d0 */  
     fpsrcop += ((CPU86_LDouble)m32i);  
     if ( ldub(seg+9) & 0x80 )  
         fpsrcop = -fpsrcop;  
     ST0 = fpsrcop;  
1018  }  }
1019    
1020  void helper_fbst_ST0_A0(void)  void helper_fbst_ST0_A0(void)
1021  {  {
1022      CPU86_LDouble fptemp;      CPU86_LDouble tmp;
     CPU86_LDouble fpsrcop;  
1023      int v;      int v;
1024      uint8_t *mem_ref, *mem_end;      uint8_t *mem_ref, *mem_end;
1025        int64_t val;
1026    
1027      fpsrcop = rint(ST0);      tmp = rint(ST0);
1028        val = (int64_t)tmp;
1029      mem_ref = (uint8_t *)A0;      mem_ref = (uint8_t *)A0;
1030      mem_end = mem_ref + 8;      mem_end = mem_ref + 9;
1031      if ( fpsrcop < 0.0 ) {      if (val < 0) {
1032          stw(mem_end, 0x8000);          stb(mem_end, 0x80);
1033          fpsrcop = -fpsrcop;          val = -val;
1034      } else {      } else {
1035          stw(mem_end, 0x0000);          stb(mem_end, 0x00);
1036      }      }
1037      while (mem_ref < mem_end) {      while (mem_ref < mem_end) {
1038          if (fpsrcop == 0.0)          if (val == 0)
1039              break;              break;
1040          fptemp = floor(fpsrcop/10.0);          v = val % 100;
1041          v = ((int)(fpsrcop - fptemp*10.0));          val = val / 100;
1042          if  (fptemp == 0.0)  {          v = ((v / 10) << 4) | (v % 10);
             stb(mem_ref++, v);  
             break;  
         }  
         fpsrcop = fptemp;  
         fptemp = floor(fpsrcop/10.0);  
         v |= (((int)(fpsrcop - fptemp*10.0)) << 4);  
1043          stb(mem_ref++, v);          stb(mem_ref++, v);
         fpsrcop = fptemp;  
1044      }      }
1045      while (mem_ref < mem_end) {      while (mem_ref < mem_end) {
1046          stb(mem_ref++, 0);          stb(mem_ref++, 0);

Legend:
Removed from v.1.6  
changed lines
  Added in v.1.7

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26