/[qemu]/qemu/target-i386/op.c
ViewVC logotype

Diff of /qemu/target-i386/op.c

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

revision 1.36 by bellard, Sun Mar 20 10:39:24 2005 UTC revision 1.37 by bellard, Tue Apr 26 20:38:17 2005 UTC
# Line 1952  void OPPROTO op_fxchg_ST0_STN(void) Line 1952  void OPPROTO op_fxchg_ST0_STN(void)
1952    
1953  /* FPU operations */  /* FPU operations */
1954    
1955    const int fcom_ccval[4] = {0x0100, 0x4000, 0x0000, 0x4500};
1956    
1957  void OPPROTO op_fcom_ST0_FT0(void)  void OPPROTO op_fcom_ST0_FT0(void)
1958  {  {
1959      int cc;      int ret;
1960      switch(floatx_compare(ST0, FT0, &env->fp_status)) {  
1961      case -1:      ret = floatx_compare(ST0, FT0, &env->fp_status);
1962          cc = 0x0100;      env->fpus = (env->fpus & ~0x4500) | fcom_ccval[ret + 1];
         break;  
     case 0:  
         cc = 0x4000;  
         break;  
     case 1:  
         cc = 0x0000;  
         break;  
     case 2:  
     default:  
         cc = 0x4500;  
         break;  
     }  
     env->fpus = (env->fpus & ~0x4500) | cc;  
1963      FORCE_RET();      FORCE_RET();
1964  }  }
1965    
1966  void OPPROTO op_fucom_ST0_FT0(void)  void OPPROTO op_fucom_ST0_FT0(void)
1967  {  {
1968      int cc;      int ret;
1969      switch(floatx_compare_quiet(ST0, FT0, &env->fp_status)) {  
1970      case -1:      ret = floatx_compare_quiet(ST0, FT0, &env->fp_status);
1971          cc = 0x0100;      env->fpus = (env->fpus & ~0x4500) | fcom_ccval[ret+ 1];
         break;  
     case 0:  
         cc = 0x4000;  
         break;  
     case 1:  
         cc = 0x0000;  
         break;  
     case 2:  
     default:  
         cc = 0x4500;  
         break;  
     }  
     env->fpus = (env->fpus & ~0x4500) | cc;  
1972      FORCE_RET();      FORCE_RET();
1973  }  }
1974    
1975    const int fcomi_ccval[4] = {CC_C, CC_Z, 0, CC_Z | CC_P | CC_C};
1976    
1977  void OPPROTO op_fcomi_ST0_FT0(void)  void OPPROTO op_fcomi_ST0_FT0(void)
1978  {  {
1979      int eflags, cc;      int eflags;
1980      switch(floatx_compare(ST0, FT0, &env->fp_status)) {      int ret;
1981      case -1:  
1982          cc = CC_C;      ret = floatx_compare(ST0, FT0, &env->fp_status);
         break;  
     case 0:  
         cc = CC_Z;  
         break;  
     case 1:  
         cc = 0;  
         break;  
     case 2:  
     default:  
         cc = CC_Z | CC_P | CC_C;  
         break;  
     }  
1983      eflags = cc_table[CC_OP].compute_all();      eflags = cc_table[CC_OP].compute_all();
1984      eflags = (eflags & ~(CC_Z | CC_P | CC_C)) | cc;      eflags = (eflags & ~(CC_Z | CC_P | CC_C)) | fcomi_ccval[ret + 1];
1985      CC_SRC = eflags;      CC_SRC = eflags;
1986      FORCE_RET();      FORCE_RET();
1987  }  }
1988    
1989  void OPPROTO op_fucomi_ST0_FT0(void)  void OPPROTO op_fucomi_ST0_FT0(void)
1990  {  {
1991      int eflags, cc;      int eflags;
1992      switch(floatx_compare_quiet(ST0, FT0, &env->fp_status)) {      int ret;
1993      case -1:  
1994          cc = CC_C;      ret = floatx_compare_quiet(ST0, FT0, &env->fp_status);
         break;  
     case 0:  
         cc = CC_Z;  
         break;  
     case 1:  
         cc = 0;  
         break;  
     case 2:  
     default:  
         cc = CC_Z | CC_P | CC_C;  
         break;  
     }  
1995      eflags = cc_table[CC_OP].compute_all();      eflags = cc_table[CC_OP].compute_all();
1996      eflags = (eflags & ~(CC_Z | CC_P | CC_C)) | cc;      eflags = (eflags & ~(CC_Z | CC_P | CC_C)) | fcomi_ccval[ret + 1];
1997      CC_SRC = eflags;      CC_SRC = eflags;
1998      FORCE_RET();      FORCE_RET();
1999  }  }

Legend:
Removed from v.1.36  
changed lines
  Added in v.1.37

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