169 |
} |
} |
170 |
|
|
171 |
/* multiply/divide */ |
/* multiply/divide */ |
172 |
|
|
173 |
|
/* XXX: add eflags optimizations */ |
174 |
|
/* XXX: add non P4 style flags */ |
175 |
|
|
176 |
void OPPROTO op_mulb_AL_T0(void) |
void OPPROTO op_mulb_AL_T0(void) |
177 |
{ |
{ |
178 |
unsigned int res; |
unsigned int res; |
179 |
res = (uint8_t)EAX * (uint8_t)T0; |
res = (uint8_t)EAX * (uint8_t)T0; |
180 |
EAX = (EAX & 0xffff0000) | res; |
EAX = (EAX & 0xffff0000) | res; |
181 |
|
CC_DST = res; |
182 |
CC_SRC = (res & 0xff00); |
CC_SRC = (res & 0xff00); |
183 |
} |
} |
184 |
|
|
187 |
int res; |
int res; |
188 |
res = (int8_t)EAX * (int8_t)T0; |
res = (int8_t)EAX * (int8_t)T0; |
189 |
EAX = (EAX & 0xffff0000) | (res & 0xffff); |
EAX = (EAX & 0xffff0000) | (res & 0xffff); |
190 |
|
CC_DST = res; |
191 |
CC_SRC = (res != (int8_t)res); |
CC_SRC = (res != (int8_t)res); |
192 |
} |
} |
193 |
|
|
197 |
res = (uint16_t)EAX * (uint16_t)T0; |
res = (uint16_t)EAX * (uint16_t)T0; |
198 |
EAX = (EAX & 0xffff0000) | (res & 0xffff); |
EAX = (EAX & 0xffff0000) | (res & 0xffff); |
199 |
EDX = (EDX & 0xffff0000) | ((res >> 16) & 0xffff); |
EDX = (EDX & 0xffff0000) | ((res >> 16) & 0xffff); |
200 |
|
CC_DST = res; |
201 |
CC_SRC = res >> 16; |
CC_SRC = res >> 16; |
202 |
} |
} |
203 |
|
|
207 |
res = (int16_t)EAX * (int16_t)T0; |
res = (int16_t)EAX * (int16_t)T0; |
208 |
EAX = (EAX & 0xffff0000) | (res & 0xffff); |
EAX = (EAX & 0xffff0000) | (res & 0xffff); |
209 |
EDX = (EDX & 0xffff0000) | ((res >> 16) & 0xffff); |
EDX = (EDX & 0xffff0000) | ((res >> 16) & 0xffff); |
210 |
|
CC_DST = res; |
211 |
CC_SRC = (res != (int16_t)res); |
CC_SRC = (res != (int16_t)res); |
212 |
} |
} |
213 |
|
|
217 |
res = (uint64_t)((uint32_t)EAX) * (uint64_t)((uint32_t)T0); |
res = (uint64_t)((uint32_t)EAX) * (uint64_t)((uint32_t)T0); |
218 |
EAX = res; |
EAX = res; |
219 |
EDX = res >> 32; |
EDX = res >> 32; |
220 |
|
CC_DST = res; |
221 |
CC_SRC = res >> 32; |
CC_SRC = res >> 32; |
222 |
} |
} |
223 |
|
|
227 |
res = (int64_t)((int32_t)EAX) * (int64_t)((int32_t)T0); |
res = (int64_t)((int32_t)EAX) * (int64_t)((int32_t)T0); |
228 |
EAX = res; |
EAX = res; |
229 |
EDX = res >> 32; |
EDX = res >> 32; |
230 |
|
CC_DST = res; |
231 |
CC_SRC = (res != (int32_t)res); |
CC_SRC = (res != (int32_t)res); |
232 |
} |
} |
233 |
|
|
236 |
int res; |
int res; |
237 |
res = (int16_t)T0 * (int16_t)T1; |
res = (int16_t)T0 * (int16_t)T1; |
238 |
T0 = res; |
T0 = res; |
239 |
|
CC_DST = res; |
240 |
CC_SRC = (res != (int16_t)res); |
CC_SRC = (res != (int16_t)res); |
241 |
} |
} |
242 |
|
|
245 |
int64_t res; |
int64_t res; |
246 |
res = (int64_t)((int32_t)T0) * (int64_t)((int32_t)T1); |
res = (int64_t)((int32_t)T0) * (int64_t)((int32_t)T1); |
247 |
T0 = res; |
T0 = res; |
248 |
|
CC_DST = res; |
249 |
CC_SRC = (res != (int32_t)res); |
CC_SRC = (res != (int32_t)res); |
250 |
} |
} |
251 |
|
|
1305 |
return CC_SRC & CC_C; |
return CC_SRC & CC_C; |
1306 |
} |
} |
1307 |
|
|
|
static int compute_c_mul(void) |
|
|
{ |
|
|
int cf; |
|
|
cf = (CC_SRC != 0); |
|
|
return cf; |
|
|
} |
|
|
|
|
|
static int compute_all_mul(void) |
|
|
{ |
|
|
int cf, pf, af, zf, sf, of; |
|
|
cf = (CC_SRC != 0); |
|
|
pf = 0; /* undefined */ |
|
|
af = 0; /* undefined */ |
|
|
zf = 0; /* undefined */ |
|
|
sf = 0; /* undefined */ |
|
|
of = cf << 11; |
|
|
return cf | pf | af | zf | sf | of; |
|
|
} |
|
|
|
|
1308 |
CCTable cc_table[CC_OP_NB] = { |
CCTable cc_table[CC_OP_NB] = { |
1309 |
[CC_OP_DYNAMIC] = { /* should never happen */ }, |
[CC_OP_DYNAMIC] = { /* should never happen */ }, |
1310 |
|
|
1311 |
[CC_OP_EFLAGS] = { compute_all_eflags, compute_c_eflags }, |
[CC_OP_EFLAGS] = { compute_all_eflags, compute_c_eflags }, |
1312 |
|
|
1313 |
[CC_OP_MUL] = { compute_all_mul, compute_c_mul }, |
[CC_OP_MULB] = { compute_all_mulb, compute_c_mull }, |
1314 |
|
[CC_OP_MULW] = { compute_all_mulw, compute_c_mull }, |
1315 |
|
[CC_OP_MULL] = { compute_all_mull, compute_c_mull }, |
1316 |
|
|
1317 |
[CC_OP_ADDB] = { compute_all_addb, compute_c_addb }, |
[CC_OP_ADDB] = { compute_all_addb, compute_c_addb }, |
1318 |
[CC_OP_ADDW] = { compute_all_addw, compute_c_addw }, |
[CC_OP_ADDW] = { compute_all_addw, compute_c_addw }, |