Revision 43fb823b target-i386/ops_sse.h

b/target-i386/ops_sse.h
1079 1079
SSE_OP_CMP(cmpnle, FPU_CMPNLE)
1080 1080
SSE_OP_CMP(cmpord, FPU_CMPORD)
1081 1081

  
1082
const int comis_eflags[4] = {CC_C, CC_Z, 0, CC_Z | CC_P | CC_C};
1083

  
1082 1084
void OPPROTO op_ucomiss(void)
1083 1085
{
1084
    int eflags;
1086
    int ret;
1085 1087
    float32 s0, s1;
1086 1088
    Reg *d, *s;
1087 1089
    d = (Reg *)((char *)env + PARAM1);
......
1089 1091

  
1090 1092
    s0 = d->XMM_S(0);
1091 1093
    s1 = s->XMM_S(0);
1092
    switch(float32_compare_quiet(s0, s1, &env->sse_status)) {
1093
    case -1:
1094
        eflags = CC_C;
1095
        break;
1096
    case 0:
1097
        eflags = CC_Z;
1098
        break;
1099
    case 1:
1100
        eflags = 0;
1101
        break;
1102
    case 2:
1103
    default:
1104
        eflags = CC_Z | CC_P | CC_C;
1105
        break;
1106
    }
1107
    CC_SRC = eflags;
1094
    ret = float32_compare_quiet(s0, s1, &env->sse_status);
1095
    CC_SRC = comis_eflags[ret + 1];
1108 1096
    FORCE_RET();
1109 1097
}
1110 1098

  
1111 1099
void OPPROTO op_comiss(void)
1112 1100
{
1113
    int eflags;
1101
    int ret;
1114 1102
    float32 s0, s1;
1115 1103
    Reg *d, *s;
1116 1104
    d = (Reg *)((char *)env + PARAM1);
......
1118 1106

  
1119 1107
    s0 = d->XMM_S(0);
1120 1108
    s1 = s->XMM_S(0);
1121
    switch(float32_compare(s0, s1, &env->sse_status)) {
1122
    case -1:
1123
        eflags = CC_C;
1124
        break;
1125
    case 0:
1126
        eflags = CC_Z;
1127
        break;
1128
    case 1:
1129
        eflags = 0;
1130
        break;
1131
    case 2:
1132
    default:
1133
        eflags = CC_Z | CC_P | CC_C;
1134
        break;
1135
    }
1136
    CC_SRC = eflags;
1109
    ret = float32_compare(s0, s1, &env->sse_status);
1110
    CC_SRC = comis_eflags[ret + 1];
1137 1111
    FORCE_RET();
1138 1112
}
1139 1113

  
1140 1114
void OPPROTO op_ucomisd(void)
1141 1115
{
1142
    int eflags;
1116
    int ret;
1143 1117
    float64 d0, d1;
1144 1118
    Reg *d, *s;
1145 1119
    d = (Reg *)((char *)env + PARAM1);
......
1147 1121

  
1148 1122
    d0 = d->XMM_D(0);
1149 1123
    d1 = s->XMM_D(0);
1150
    switch(float64_compare_quiet(d0, d1, &env->sse_status)) {
1151
    case -1:
1152
        eflags = CC_C;
1153
        break;
1154
    case 0:
1155
        eflags = CC_Z;
1156
        break;
1157
    case 1:
1158
        eflags = 0;
1159
        break;
1160
    case 2:
1161
    default:
1162
        eflags = CC_Z | CC_P | CC_C;
1163
        break;
1164
    }
1165
    CC_SRC = eflags;
1124
    ret = float64_compare_quiet(d0, d1, &env->sse_status);
1125
    CC_SRC = comis_eflags[ret + 1];
1166 1126
    FORCE_RET();
1167 1127
}
1168 1128

  
1169 1129
void OPPROTO op_comisd(void)
1170 1130
{
1171
    int eflags;
1131
    int ret;
1172 1132
    float64 d0, d1;
1173 1133
    Reg *d, *s;
1174 1134
    d = (Reg *)((char *)env + PARAM1);
......
1176 1136

  
1177 1137
    d0 = d->XMM_D(0);
1178 1138
    d1 = s->XMM_D(0);
1179
    switch(float64_compare(d0, d1, &env->sse_status)) {
1180
    case -1:
1181
        eflags = CC_C;
1182
        break;
1183
    case 0:
1184
        eflags = CC_Z;
1185
        break;
1186
    case 1:
1187
        eflags = 0;
1188
        break;
1189
    case 2:
1190
    default:
1191
        eflags = CC_Z | CC_P | CC_C;
1192
        break;
1193
    }
1194
    CC_SRC = eflags;
1139
    ret = float64_compare(d0, d1, &env->sse_status);
1140
    CC_SRC = comis_eflags[ret + 1];
1195 1141
    FORCE_RET();
1196 1142
}
1197 1143

  

Also available in: Unified diff