Revision 8422b113 target-i386/ops_sse.h
b/target-i386/ops_sse.h | ||
---|---|---|
704 | 704 |
/* float to float conversions */ |
705 | 705 |
void OPPROTO op_cvtps2pd(void) |
706 | 706 |
{ |
707 |
float s0, s1; |
|
707 |
float32 s0, s1;
|
|
708 | 708 |
Reg *d, *s; |
709 | 709 |
d = (Reg *)((char *)env + PARAM1); |
710 | 710 |
s = (Reg *)((char *)env + PARAM2); |
... | ... | |
1031 | 1031 |
Reg *d, *s;\ |
1032 | 1032 |
d = (Reg *)((char *)env + PARAM1);\ |
1033 | 1033 |
s = (Reg *)((char *)env + PARAM2);\ |
1034 |
d->XMM_L(0) = F(d->XMM_S(0), s->XMM_S(0));\ |
|
1035 |
d->XMM_L(1) = F(d->XMM_S(1), s->XMM_S(1));\ |
|
1036 |
d->XMM_L(2) = F(d->XMM_S(2), s->XMM_S(2));\ |
|
1037 |
d->XMM_L(3) = F(d->XMM_S(3), s->XMM_S(3));\ |
|
1034 |
d->XMM_L(0) = F(32, d->XMM_S(0), s->XMM_S(0));\
|
|
1035 |
d->XMM_L(1) = F(32, d->XMM_S(1), s->XMM_S(1));\
|
|
1036 |
d->XMM_L(2) = F(32, d->XMM_S(2), s->XMM_S(2));\
|
|
1037 |
d->XMM_L(3) = F(32, d->XMM_S(3), s->XMM_S(3));\
|
|
1038 | 1038 |
}\ |
1039 | 1039 |
\ |
1040 | 1040 |
void OPPROTO op_ ## name ## ss (void)\ |
... | ... | |
1042 | 1042 |
Reg *d, *s;\ |
1043 | 1043 |
d = (Reg *)((char *)env + PARAM1);\ |
1044 | 1044 |
s = (Reg *)((char *)env + PARAM2);\ |
1045 |
d->XMM_L(0) = F(d->XMM_S(0), s->XMM_S(0));\ |
|
1045 |
d->XMM_L(0) = F(32, d->XMM_S(0), s->XMM_S(0));\
|
|
1046 | 1046 |
}\ |
1047 | 1047 |
void OPPROTO op_ ## name ## pd (void)\ |
1048 | 1048 |
{\ |
1049 | 1049 |
Reg *d, *s;\ |
1050 | 1050 |
d = (Reg *)((char *)env + PARAM1);\ |
1051 | 1051 |
s = (Reg *)((char *)env + PARAM2);\ |
1052 |
d->XMM_Q(0) = F(d->XMM_D(0), s->XMM_D(0));\ |
|
1053 |
d->XMM_Q(1) = F(d->XMM_D(1), s->XMM_D(1));\ |
|
1052 |
d->XMM_Q(0) = F(64, d->XMM_D(0), s->XMM_D(0));\
|
|
1053 |
d->XMM_Q(1) = F(64, d->XMM_D(1), s->XMM_D(1));\
|
|
1054 | 1054 |
}\ |
1055 | 1055 |
\ |
1056 | 1056 |
void OPPROTO op_ ## name ## sd (void)\ |
... | ... | |
1058 | 1058 |
Reg *d, *s;\ |
1059 | 1059 |
d = (Reg *)((char *)env + PARAM1);\ |
1060 | 1060 |
s = (Reg *)((char *)env + PARAM2);\ |
1061 |
d->XMM_Q(0) = F(d->XMM_D(0), s->XMM_D(0));\ |
|
1061 |
d->XMM_Q(0) = F(64, d->XMM_D(0), s->XMM_D(0));\
|
|
1062 | 1062 |
} |
1063 | 1063 |
|
1064 |
#define FPU_CMPEQ(a, b) (a) == (b) ? -1 : 0
|
|
1065 |
#define FPU_CMPLT(a, b) (a) < (b) ? -1 : 0
|
|
1066 |
#define FPU_CMPLE(a, b) (a) <= (b) ? -1 : 0
|
|
1067 |
#define FPU_CMPUNORD(a, b) (fpu_isnan(a) || fpu_isnan(b)) ? - 1 : 0
|
|
1068 |
#define FPU_CMPNEQ(a, b) (a) == (b) ? 0 : -1
|
|
1069 |
#define FPU_CMPNLT(a, b) (a) < (b) ? 0 : -1
|
|
1070 |
#define FPU_CMPNLE(a, b) (a) <= (b) ? 0 : -1
|
|
1071 |
#define FPU_CMPORD(a, b) (!fpu_isnan(a) && !fpu_isnan(b)) ? - 1 : 0
|
|
1064 |
#define FPU_CMPEQ(size, a, b) float ## size ## _eq(a, b, &env->sse_status) ? -1 : 0
|
|
1065 |
#define FPU_CMPLT(size, a, b) float ## size ## _lt(a, b, &env->sse_status) ? -1 : 0
|
|
1066 |
#define FPU_CMPLE(size, a, b) float ## size ## _le(a, b, &env->sse_status) ? -1 : 0
|
|
1067 |
#define FPU_CMPUNORD(size, a, b) float ## size ## _unordered(a, b, &env->sse_status) ? - 1 : 0
|
|
1068 |
#define FPU_CMPNEQ(size, a, b) float ## size ## _eq(a, b, &env->sse_status) ? 0 : -1
|
|
1069 |
#define FPU_CMPNLT(size, a, b) float ## size ## _lt(a, b, &env->sse_status) ? 0 : -1
|
|
1070 |
#define FPU_CMPNLE(size, a, b) float ## size ## _le(a, b, &env->sse_status) ? 0 : -1
|
|
1071 |
#define FPU_CMPORD(size, a, b) float ## size ## _unordered(a, b, &env->sse_status) ? 0 : -1
|
|
1072 | 1072 |
|
1073 | 1073 |
SSE_OP_CMP(cmpeq, FPU_CMPEQ) |
1074 | 1074 |
SSE_OP_CMP(cmplt, FPU_CMPLT) |
... | ... | |
1082 | 1082 |
void OPPROTO op_ucomiss(void) |
1083 | 1083 |
{ |
1084 | 1084 |
int eflags; |
1085 |
float s0, s1; |
|
1085 |
float32 s0, s1;
|
|
1086 | 1086 |
Reg *d, *s; |
1087 | 1087 |
d = (Reg *)((char *)env + PARAM1); |
1088 | 1088 |
s = (Reg *)((char *)env + PARAM2); |
1089 | 1089 |
|
1090 | 1090 |
s0 = d->XMM_S(0); |
1091 | 1091 |
s1 = s->XMM_S(0); |
1092 |
if (s0 < s1) |
|
1092 |
switch(float32_compare_quiet(s0, s1, &env->sse_status)) { |
|
1093 |
case -1: |
|
1093 | 1094 |
eflags = CC_C; |
1094 |
else if (s0 == s1) |
|
1095 |
break; |
|
1096 |
case 0: |
|
1095 | 1097 |
eflags = CC_Z; |
1096 |
else |
|
1098 |
break; |
|
1099 |
case 1: |
|
1097 | 1100 |
eflags = 0; |
1101 |
break; |
|
1102 |
case 2: |
|
1103 |
default: |
|
1104 |
eflags = CC_Z | CC_P | CC_C; |
|
1105 |
break; |
|
1106 |
} |
|
1098 | 1107 |
CC_SRC = eflags; |
1099 | 1108 |
FORCE_RET(); |
1100 | 1109 |
} |
... | ... | |
1102 | 1111 |
void OPPROTO op_comiss(void) |
1103 | 1112 |
{ |
1104 | 1113 |
int eflags; |
1105 |
float s0, s1; |
|
1114 |
float32 s0, s1;
|
|
1106 | 1115 |
Reg *d, *s; |
1107 | 1116 |
d = (Reg *)((char *)env + PARAM1); |
1108 | 1117 |
s = (Reg *)((char *)env + PARAM2); |
1109 | 1118 |
|
1110 | 1119 |
s0 = d->XMM_S(0); |
1111 | 1120 |
s1 = s->XMM_S(0); |
1112 |
if (s0 < s1) |
|
1121 |
switch(float32_compare(s0, s1, &env->sse_status)) { |
|
1122 |
case -1: |
|
1113 | 1123 |
eflags = CC_C; |
1114 |
else if (s0 == s1) |
|
1124 |
break; |
|
1125 |
case 0: |
|
1115 | 1126 |
eflags = CC_Z; |
1116 |
else |
|
1127 |
break; |
|
1128 |
case 1: |
|
1117 | 1129 |
eflags = 0; |
1130 |
break; |
|
1131 |
case 2: |
|
1132 |
default: |
|
1133 |
eflags = CC_Z | CC_P | CC_C; |
|
1134 |
break; |
|
1135 |
} |
|
1118 | 1136 |
CC_SRC = eflags; |
1119 | 1137 |
FORCE_RET(); |
1120 | 1138 |
} |
... | ... | |
1122 | 1140 |
void OPPROTO op_ucomisd(void) |
1123 | 1141 |
{ |
1124 | 1142 |
int eflags; |
1125 |
double d0, d1;
|
|
1143 |
float64 d0, d1;
|
|
1126 | 1144 |
Reg *d, *s; |
1127 | 1145 |
d = (Reg *)((char *)env + PARAM1); |
1128 | 1146 |
s = (Reg *)((char *)env + PARAM2); |
1129 | 1147 |
|
1130 | 1148 |
d0 = d->XMM_D(0); |
1131 | 1149 |
d1 = s->XMM_D(0); |
1132 |
if (d0 < d1) |
|
1150 |
switch(float64_compare_quiet(d0, d1, &env->sse_status)) { |
|
1151 |
case -1: |
|
1133 | 1152 |
eflags = CC_C; |
1134 |
else if (d0 == d1) |
|
1153 |
break; |
|
1154 |
case 0: |
|
1135 | 1155 |
eflags = CC_Z; |
1136 |
else |
|
1156 |
break; |
|
1157 |
case 1: |
|
1137 | 1158 |
eflags = 0; |
1159 |
break; |
|
1160 |
case 2: |
|
1161 |
default: |
|
1162 |
eflags = CC_Z | CC_P | CC_C; |
|
1163 |
break; |
|
1164 |
} |
|
1138 | 1165 |
CC_SRC = eflags; |
1139 | 1166 |
FORCE_RET(); |
1140 | 1167 |
} |
... | ... | |
1142 | 1169 |
void OPPROTO op_comisd(void) |
1143 | 1170 |
{ |
1144 | 1171 |
int eflags; |
1145 |
double d0, d1;
|
|
1172 |
float64 d0, d1;
|
|
1146 | 1173 |
Reg *d, *s; |
1147 | 1174 |
d = (Reg *)((char *)env + PARAM1); |
1148 | 1175 |
s = (Reg *)((char *)env + PARAM2); |
1149 | 1176 |
|
1150 | 1177 |
d0 = d->XMM_D(0); |
1151 | 1178 |
d1 = s->XMM_D(0); |
1152 |
if (d0 < d1) |
|
1179 |
switch(float64_compare(d0, d1, &env->sse_status)) { |
|
1180 |
case -1: |
|
1153 | 1181 |
eflags = CC_C; |
1154 |
else if (d0 == d1) |
|
1182 |
break; |
|
1183 |
case 0: |
|
1155 | 1184 |
eflags = CC_Z; |
1156 |
else |
|
1185 |
break; |
|
1186 |
case 1: |
|
1157 | 1187 |
eflags = 0; |
1188 |
break; |
|
1189 |
case 2: |
|
1190 |
default: |
|
1191 |
eflags = CC_Z | CC_P | CC_C; |
|
1192 |
break; |
|
1193 |
} |
|
1158 | 1194 |
CC_SRC = eflags; |
1159 | 1195 |
FORCE_RET(); |
1160 | 1196 |
} |
Also available in: Unified diff