/[qemu]/qemu/target-i386/ops_sse.h
ViewVC logotype

Diff of /qemu/target-i386/ops_sse.h

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

revision 1.5 by bellard, Sun Mar 20 10:39:24 2005 UTC revision 1.6 by bellard, Tue Apr 26 20:38:17 2005 UTC
# Line 1079  SSE_OP_CMP(cmpnlt, FPU_CMPNLT) Line 1079  SSE_OP_CMP(cmpnlt, FPU_CMPNLT)
1079  SSE_OP_CMP(cmpnle, FPU_CMPNLE)  SSE_OP_CMP(cmpnle, FPU_CMPNLE)
1080  SSE_OP_CMP(cmpord, FPU_CMPORD)  SSE_OP_CMP(cmpord, FPU_CMPORD)
1081    
1082    const int comis_eflags[4] = {CC_C, CC_Z, 0, CC_Z | CC_P | CC_C};
1083    
1084  void OPPROTO op_ucomiss(void)  void OPPROTO op_ucomiss(void)
1085  {  {
1086      int eflags;      int ret;
1087      float32 s0, s1;      float32 s0, s1;
1088      Reg *d, *s;      Reg *d, *s;
1089      d = (Reg *)((char *)env + PARAM1);      d = (Reg *)((char *)env + PARAM1);
# Line 1089  void OPPROTO op_ucomiss(void) Line 1091  void OPPROTO op_ucomiss(void)
1091    
1092      s0 = d->XMM_S(0);      s0 = d->XMM_S(0);
1093      s1 = s->XMM_S(0);      s1 = s->XMM_S(0);
1094      switch(float32_compare_quiet(s0, s1, &env->sse_status)) {      ret = float32_compare_quiet(s0, s1, &env->sse_status);
1095      case -1:      CC_SRC = comis_eflags[ret + 1];
         eflags = CC_C;  
         break;  
     case 0:  
         eflags = CC_Z;  
         break;  
     case 1:  
         eflags = 0;  
         break;  
     case 2:  
     default:  
         eflags = CC_Z | CC_P | CC_C;  
         break;  
     }  
     CC_SRC = eflags;  
1096      FORCE_RET();      FORCE_RET();
1097  }  }
1098    
1099  void OPPROTO op_comiss(void)  void OPPROTO op_comiss(void)
1100  {  {
1101      int eflags;      int ret;
1102      float32 s0, s1;      float32 s0, s1;
1103      Reg *d, *s;      Reg *d, *s;
1104      d = (Reg *)((char *)env + PARAM1);      d = (Reg *)((char *)env + PARAM1);
# Line 1118  void OPPROTO op_comiss(void) Line 1106  void OPPROTO op_comiss(void)
1106    
1107      s0 = d->XMM_S(0);      s0 = d->XMM_S(0);
1108      s1 = s->XMM_S(0);      s1 = s->XMM_S(0);
1109      switch(float32_compare(s0, s1, &env->sse_status)) {      ret = float32_compare(s0, s1, &env->sse_status);
1110      case -1:      CC_SRC = comis_eflags[ret + 1];
         eflags = CC_C;  
         break;  
     case 0:  
         eflags = CC_Z;  
         break;  
     case 1:  
         eflags = 0;  
         break;  
     case 2:  
     default:  
         eflags = CC_Z | CC_P | CC_C;  
         break;  
     }  
     CC_SRC = eflags;  
1111      FORCE_RET();      FORCE_RET();
1112  }  }
1113    
1114  void OPPROTO op_ucomisd(void)  void OPPROTO op_ucomisd(void)
1115  {  {
1116      int eflags;      int ret;
1117      float64 d0, d1;      float64 d0, d1;
1118      Reg *d, *s;      Reg *d, *s;
1119      d = (Reg *)((char *)env + PARAM1);      d = (Reg *)((char *)env + PARAM1);
# Line 1147  void OPPROTO op_ucomisd(void) Line 1121  void OPPROTO op_ucomisd(void)
1121    
1122      d0 = d->XMM_D(0);      d0 = d->XMM_D(0);
1123      d1 = s->XMM_D(0);      d1 = s->XMM_D(0);
1124      switch(float64_compare_quiet(d0, d1, &env->sse_status)) {      ret = float64_compare_quiet(d0, d1, &env->sse_status);
1125      case -1:      CC_SRC = comis_eflags[ret + 1];
         eflags = CC_C;  
         break;  
     case 0:  
         eflags = CC_Z;  
         break;  
     case 1:  
         eflags = 0;  
         break;  
     case 2:  
     default:  
         eflags = CC_Z | CC_P | CC_C;  
         break;  
     }  
     CC_SRC = eflags;  
1126      FORCE_RET();      FORCE_RET();
1127  }  }
1128    
1129  void OPPROTO op_comisd(void)  void OPPROTO op_comisd(void)
1130  {  {
1131      int eflags;      int ret;
1132      float64 d0, d1;      float64 d0, d1;
1133      Reg *d, *s;      Reg *d, *s;
1134      d = (Reg *)((char *)env + PARAM1);      d = (Reg *)((char *)env + PARAM1);
# Line 1176  void OPPROTO op_comisd(void) Line 1136  void OPPROTO op_comisd(void)
1136    
1137      d0 = d->XMM_D(0);      d0 = d->XMM_D(0);
1138      d1 = s->XMM_D(0);      d1 = s->XMM_D(0);
1139      switch(float64_compare(d0, d1, &env->sse_status)) {      ret = float64_compare(d0, d1, &env->sse_status);
1140      case -1:      CC_SRC = comis_eflags[ret + 1];
         eflags = CC_C;  
         break;  
     case 0:  
         eflags = CC_Z;  
         break;  
     case 1:  
         eflags = 0;  
         break;  
     case 2:  
     default:  
         eflags = CC_Z | CC_P | CC_C;  
         break;  
     }  
     CC_SRC = eflags;  
1141      FORCE_RET();      FORCE_RET();
1142  }  }
1143    

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

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