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); |
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); |
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); |
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); |
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 |
|
|