Revision 14ce26e7 target-i386/op.c
b/target-i386/op.c | ||
---|---|---|
22 | 22 |
#include "exec.h" |
23 | 23 |
|
24 | 24 |
/* n must be a constant to be efficient */ |
25 |
static inline int lshift(int x, int n)
|
|
25 |
static inline target_long lshift(target_long x, int n)
|
|
26 | 26 |
{ |
27 | 27 |
if (n >= 0) |
28 | 28 |
return x << n; |
... | ... | |
80 | 80 |
#undef REG |
81 | 81 |
#undef REGNAME |
82 | 82 |
|
83 |
#ifdef TARGET_X86_64 |
|
84 |
|
|
85 |
#define REG (env->regs[8]) |
|
86 |
#define REGNAME _R8 |
|
87 |
#include "opreg_template.h" |
|
88 |
#undef REG |
|
89 |
#undef REGNAME |
|
90 |
|
|
91 |
#define REG (env->regs[9]) |
|
92 |
#define REGNAME _R9 |
|
93 |
#include "opreg_template.h" |
|
94 |
#undef REG |
|
95 |
#undef REGNAME |
|
96 |
|
|
97 |
#define REG (env->regs[10]) |
|
98 |
#define REGNAME _R10 |
|
99 |
#include "opreg_template.h" |
|
100 |
#undef REG |
|
101 |
#undef REGNAME |
|
102 |
|
|
103 |
#define REG (env->regs[11]) |
|
104 |
#define REGNAME _R11 |
|
105 |
#include "opreg_template.h" |
|
106 |
#undef REG |
|
107 |
#undef REGNAME |
|
108 |
|
|
109 |
#define REG (env->regs[12]) |
|
110 |
#define REGNAME _R12 |
|
111 |
#include "opreg_template.h" |
|
112 |
#undef REG |
|
113 |
#undef REGNAME |
|
114 |
|
|
115 |
#define REG (env->regs[13]) |
|
116 |
#define REGNAME _R13 |
|
117 |
#include "opreg_template.h" |
|
118 |
#undef REG |
|
119 |
#undef REGNAME |
|
120 |
|
|
121 |
#define REG (env->regs[14]) |
|
122 |
#define REGNAME _R14 |
|
123 |
#include "opreg_template.h" |
|
124 |
#undef REG |
|
125 |
#undef REGNAME |
|
126 |
|
|
127 |
#define REG (env->regs[15]) |
|
128 |
#define REGNAME _R15 |
|
129 |
#include "opreg_template.h" |
|
130 |
#undef REG |
|
131 |
#undef REGNAME |
|
132 |
|
|
133 |
#endif |
|
134 |
|
|
83 | 135 |
/* operations with flags */ |
84 | 136 |
|
85 | 137 |
/* update flags with T0 and T1 (add/sub case) */ |
... | ... | |
170 | 222 |
T0 = bswap32(T0); |
171 | 223 |
} |
172 | 224 |
|
225 |
#ifdef TARGET_X86_64 |
|
226 |
void OPPROTO op_bswapq_T0(void) |
|
227 |
{ |
|
228 |
T0 = bswap64(T0); |
|
229 |
} |
|
230 |
#endif |
|
231 |
|
|
173 | 232 |
/* multiply/divide */ |
174 | 233 |
|
175 | 234 |
/* XXX: add eflags optimizations */ |
... | ... | |
179 | 238 |
{ |
180 | 239 |
unsigned int res; |
181 | 240 |
res = (uint8_t)EAX * (uint8_t)T0; |
182 |
EAX = (EAX & 0xffff0000) | res;
|
|
241 |
EAX = (EAX & ~0xffff) | res;
|
|
183 | 242 |
CC_DST = res; |
184 | 243 |
CC_SRC = (res & 0xff00); |
185 | 244 |
} |
... | ... | |
188 | 247 |
{ |
189 | 248 |
int res; |
190 | 249 |
res = (int8_t)EAX * (int8_t)T0; |
191 |
EAX = (EAX & 0xffff0000) | (res & 0xffff);
|
|
250 |
EAX = (EAX & ~0xffff) | (res & 0xffff);
|
|
192 | 251 |
CC_DST = res; |
193 | 252 |
CC_SRC = (res != (int8_t)res); |
194 | 253 |
} |
... | ... | |
197 | 256 |
{ |
198 | 257 |
unsigned int res; |
199 | 258 |
res = (uint16_t)EAX * (uint16_t)T0; |
200 |
EAX = (EAX & 0xffff0000) | (res & 0xffff);
|
|
201 |
EDX = (EDX & 0xffff0000) | ((res >> 16) & 0xffff);
|
|
259 |
EAX = (EAX & ~0xffff) | (res & 0xffff);
|
|
260 |
EDX = (EDX & ~0xffff) | ((res >> 16) & 0xffff);
|
|
202 | 261 |
CC_DST = res; |
203 | 262 |
CC_SRC = res >> 16; |
204 | 263 |
} |
... | ... | |
207 | 266 |
{ |
208 | 267 |
int res; |
209 | 268 |
res = (int16_t)EAX * (int16_t)T0; |
210 |
EAX = (EAX & 0xffff0000) | (res & 0xffff);
|
|
211 |
EDX = (EDX & 0xffff0000) | ((res >> 16) & 0xffff);
|
|
269 |
EAX = (EAX & ~0xffff) | (res & 0xffff);
|
|
270 |
EDX = (EDX & ~0xffff) | ((res >> 16) & 0xffff);
|
|
212 | 271 |
CC_DST = res; |
213 | 272 |
CC_SRC = (res != (int16_t)res); |
214 | 273 |
} |
... | ... | |
217 | 276 |
{ |
218 | 277 |
uint64_t res; |
219 | 278 |
res = (uint64_t)((uint32_t)EAX) * (uint64_t)((uint32_t)T0); |
220 |
EAX = res; |
|
221 |
EDX = res >> 32;
|
|
222 |
CC_DST = res; |
|
223 |
CC_SRC = res >> 32;
|
|
279 |
EAX = (uint32_t)res;
|
|
280 |
EDX = (uint32_t)(res >> 32);
|
|
281 |
CC_DST = (uint32_t)res;
|
|
282 |
CC_SRC = (uint32_t)(res >> 32);
|
|
224 | 283 |
} |
225 | 284 |
|
226 | 285 |
void OPPROTO op_imull_EAX_T0(void) |
... | ... | |
251 | 310 |
CC_SRC = (res != (int32_t)res); |
252 | 311 |
} |
253 | 312 |
|
313 |
#ifdef TARGET_X86_64 |
|
314 |
void OPPROTO op_mulq_EAX_T0(void) |
|
315 |
{ |
|
316 |
helper_mulq_EAX_T0(); |
|
317 |
} |
|
318 |
|
|
319 |
void OPPROTO op_imulq_EAX_T0(void) |
|
320 |
{ |
|
321 |
helper_imulq_EAX_T0(); |
|
322 |
} |
|
323 |
|
|
324 |
void OPPROTO op_imulq_T0_T1(void) |
|
325 |
{ |
|
326 |
helper_imulq_T0_T1(); |
|
327 |
} |
|
328 |
#endif |
|
329 |
|
|
254 | 330 |
/* division, flags are undefined */ |
255 | 331 |
/* XXX: add exceptions for overflow */ |
256 | 332 |
|
... | ... | |
261 | 337 |
num = (EAX & 0xffff); |
262 | 338 |
den = (T0 & 0xff); |
263 | 339 |
if (den == 0) { |
264 |
EIP = PARAM1; |
|
265 | 340 |
raise_exception(EXCP00_DIVZ); |
266 | 341 |
} |
267 | 342 |
q = (num / den) & 0xff; |
268 | 343 |
r = (num % den) & 0xff; |
269 |
EAX = (EAX & 0xffff0000) | (r << 8) | q;
|
|
344 |
EAX = (EAX & ~0xffff) | (r << 8) | q;
|
|
270 | 345 |
} |
271 | 346 |
|
272 | 347 |
void OPPROTO op_idivb_AL_T0(void) |
... | ... | |
276 | 351 |
num = (int16_t)EAX; |
277 | 352 |
den = (int8_t)T0; |
278 | 353 |
if (den == 0) { |
279 |
EIP = PARAM1; |
|
280 | 354 |
raise_exception(EXCP00_DIVZ); |
281 | 355 |
} |
282 | 356 |
q = (num / den) & 0xff; |
283 | 357 |
r = (num % den) & 0xff; |
284 |
EAX = (EAX & 0xffff0000) | (r << 8) | q;
|
|
358 |
EAX = (EAX & ~0xffff) | (r << 8) | q;
|
|
285 | 359 |
} |
286 | 360 |
|
287 | 361 |
void OPPROTO op_divw_AX_T0(void) |
... | ... | |
291 | 365 |
num = (EAX & 0xffff) | ((EDX & 0xffff) << 16); |
292 | 366 |
den = (T0 & 0xffff); |
293 | 367 |
if (den == 0) { |
294 |
EIP = PARAM1; |
|
295 | 368 |
raise_exception(EXCP00_DIVZ); |
296 | 369 |
} |
297 | 370 |
q = (num / den) & 0xffff; |
298 | 371 |
r = (num % den) & 0xffff; |
299 |
EAX = (EAX & 0xffff0000) | q;
|
|
300 |
EDX = (EDX & 0xffff0000) | r;
|
|
372 |
EAX = (EAX & ~0xffff) | q;
|
|
373 |
EDX = (EDX & ~0xffff) | r;
|
|
301 | 374 |
} |
302 | 375 |
|
303 | 376 |
void OPPROTO op_idivw_AX_T0(void) |
... | ... | |
307 | 380 |
num = (EAX & 0xffff) | ((EDX & 0xffff) << 16); |
308 | 381 |
den = (int16_t)T0; |
309 | 382 |
if (den == 0) { |
310 |
EIP = PARAM1; |
|
311 | 383 |
raise_exception(EXCP00_DIVZ); |
312 | 384 |
} |
313 | 385 |
q = (num / den) & 0xffff; |
314 | 386 |
r = (num % den) & 0xffff; |
315 |
EAX = (EAX & 0xffff0000) | q;
|
|
316 |
EDX = (EDX & 0xffff0000) | r;
|
|
387 |
EAX = (EAX & ~0xffff) | q;
|
|
388 |
EDX = (EDX & ~0xffff) | r;
|
|
317 | 389 |
} |
318 | 390 |
|
319 | 391 |
void OPPROTO op_divl_EAX_T0(void) |
320 | 392 |
{ |
321 |
helper_divl_EAX_T0(PARAM1);
|
|
393 |
helper_divl_EAX_T0(); |
|
322 | 394 |
} |
323 | 395 |
|
324 | 396 |
void OPPROTO op_idivl_EAX_T0(void) |
325 | 397 |
{ |
326 |
helper_idivl_EAX_T0(PARAM1);
|
|
398 |
helper_idivl_EAX_T0(); |
|
327 | 399 |
} |
328 | 400 |
|
401 |
#ifdef TARGET_X86_64 |
|
402 |
void OPPROTO op_divq_EAX_T0(void) |
|
403 |
{ |
|
404 |
helper_divq_EAX_T0(); |
|
405 |
} |
|
406 |
|
|
407 |
void OPPROTO op_idivq_EAX_T0(void) |
|
408 |
{ |
|
409 |
helper_idivq_EAX_T0(); |
|
410 |
} |
|
411 |
#endif |
|
412 |
|
|
329 | 413 |
/* constant load & misc op */ |
330 | 414 |
|
415 |
/* XXX: consistent names */ |
|
416 |
void OPPROTO op_movl_T0_imu(void) |
|
417 |
{ |
|
418 |
T0 = (uint32_t)PARAM1; |
|
419 |
} |
|
420 |
|
|
331 | 421 |
void OPPROTO op_movl_T0_im(void) |
332 | 422 |
{ |
333 |
T0 = PARAM1; |
|
423 |
T0 = (int32_t)PARAM1;
|
|
334 | 424 |
} |
335 | 425 |
|
336 | 426 |
void OPPROTO op_addl_T0_im(void) |
... | ... | |
353 | 443 |
T0 = T1; |
354 | 444 |
} |
355 | 445 |
|
446 |
void OPPROTO op_movl_T1_imu(void) |
|
447 |
{ |
|
448 |
T1 = (uint32_t)PARAM1; |
|
449 |
} |
|
450 |
|
|
356 | 451 |
void OPPROTO op_movl_T1_im(void) |
357 | 452 |
{ |
358 |
T1 = PARAM1; |
|
453 |
T1 = (int32_t)PARAM1;
|
|
359 | 454 |
} |
360 | 455 |
|
361 | 456 |
void OPPROTO op_addl_T1_im(void) |
... | ... | |
370 | 465 |
|
371 | 466 |
void OPPROTO op_movl_A0_im(void) |
372 | 467 |
{ |
373 |
A0 = PARAM1; |
|
468 |
A0 = (uint32_t)PARAM1;
|
|
374 | 469 |
} |
375 | 470 |
|
376 | 471 |
void OPPROTO op_addl_A0_im(void) |
377 | 472 |
{ |
378 |
A0 += PARAM1; |
|
473 |
A0 = (uint32_t)(A0 + PARAM1); |
|
474 |
} |
|
475 |
|
|
476 |
void OPPROTO op_movl_A0_seg(void) |
|
477 |
{ |
|
478 |
A0 = (uint32_t)*(target_ulong *)((char *)env + PARAM1); |
|
479 |
} |
|
480 |
|
|
481 |
void OPPROTO op_addl_A0_seg(void) |
|
482 |
{ |
|
483 |
A0 = (uint32_t)(A0 + *(target_ulong *)((char *)env + PARAM1)); |
|
379 | 484 |
} |
380 | 485 |
|
381 | 486 |
void OPPROTO op_addl_A0_AL(void) |
382 | 487 |
{ |
383 |
A0 += (EAX & 0xff); |
|
488 |
A0 = (uint32_t)(A0 + (EAX & 0xff)); |
|
489 |
} |
|
490 |
|
|
491 |
#ifdef WORDS_BIGENDIAN |
|
492 |
typedef union UREG64 { |
|
493 |
struct { uint16_t v3, v2, v1, v0; } w; |
|
494 |
struct { uint32_t v1, v0; } l; |
|
495 |
uint64_t q; |
|
496 |
} UREG64; |
|
497 |
#else |
|
498 |
typedef union UREG64 { |
|
499 |
struct { uint16_t v0, v1, v2, v3; } w; |
|
500 |
struct { uint32_t v0, v1; } l; |
|
501 |
uint64_t q; |
|
502 |
} UREG64; |
|
503 |
#endif |
|
504 |
|
|
505 |
#ifdef TARGET_X86_64 |
|
506 |
|
|
507 |
#define PARAMQ1 \ |
|
508 |
({\ |
|
509 |
UREG64 __p;\ |
|
510 |
__p.l.v1 = PARAM1;\ |
|
511 |
__p.l.v0 = PARAM2;\ |
|
512 |
__p.q;\ |
|
513 |
}) |
|
514 |
|
|
515 |
void OPPROTO op_movq_T0_im64(void) |
|
516 |
{ |
|
517 |
T0 = PARAMQ1; |
|
384 | 518 |
} |
385 | 519 |
|
520 |
void OPPROTO op_movq_A0_im(void) |
|
521 |
{ |
|
522 |
A0 = (int32_t)PARAM1; |
|
523 |
} |
|
524 |
|
|
525 |
void OPPROTO op_movq_A0_im64(void) |
|
526 |
{ |
|
527 |
A0 = PARAMQ1; |
|
528 |
} |
|
529 |
|
|
530 |
void OPPROTO op_addq_A0_im(void) |
|
531 |
{ |
|
532 |
A0 = (A0 + (int32_t)PARAM1); |
|
533 |
} |
|
534 |
|
|
535 |
void OPPROTO op_addq_A0_im64(void) |
|
536 |
{ |
|
537 |
A0 = (A0 + PARAMQ1); |
|
538 |
} |
|
539 |
|
|
540 |
void OPPROTO op_movq_A0_seg(void) |
|
541 |
{ |
|
542 |
A0 = *(target_ulong *)((char *)env + PARAM1); |
|
543 |
} |
|
544 |
|
|
545 |
void OPPROTO op_addq_A0_seg(void) |
|
546 |
{ |
|
547 |
A0 += *(target_ulong *)((char *)env + PARAM1); |
|
548 |
} |
|
549 |
|
|
550 |
void OPPROTO op_addq_A0_AL(void) |
|
551 |
{ |
|
552 |
A0 = (A0 + (EAX & 0xff)); |
|
553 |
} |
|
554 |
|
|
555 |
#endif |
|
556 |
|
|
386 | 557 |
void OPPROTO op_andl_A0_ffff(void) |
387 | 558 |
{ |
388 | 559 |
A0 = A0 & 0xffff; |
... | ... | |
401 | 572 |
#include "ops_mem.h" |
402 | 573 |
#endif |
403 | 574 |
|
404 |
/* used for bit operations */
|
|
575 |
/* indirect jump */
|
|
405 | 576 |
|
406 |
void OPPROTO op_add_bitw_A0_T1(void)
|
|
577 |
void OPPROTO op_jmp_T0(void)
|
|
407 | 578 |
{ |
408 |
A0 += ((int16_t)T1 >> 4) << 1;
|
|
579 |
EIP = T0;
|
|
409 | 580 |
} |
410 | 581 |
|
411 |
void OPPROTO op_add_bitl_A0_T1(void)
|
|
582 |
void OPPROTO op_movl_eip_im(void)
|
|
412 | 583 |
{ |
413 |
A0 += ((int32_t)T1 >> 5) << 2;
|
|
584 |
EIP = (uint32_t)PARAM1;
|
|
414 | 585 |
} |
415 | 586 |
|
416 |
/* indirect jump */ |
|
417 |
|
|
418 |
void OPPROTO op_jmp_T0(void) |
|
587 |
#ifdef TARGET_X86_64 |
|
588 |
void OPPROTO op_movq_eip_im(void) |
|
419 | 589 |
{ |
420 |
EIP = T0;
|
|
590 |
EIP = (int32_t)PARAM1;
|
|
421 | 591 |
} |
422 | 592 |
|
423 |
void OPPROTO op_jmp_im(void)
|
|
593 |
void OPPROTO op_movq_eip_im64(void)
|
|
424 | 594 |
{ |
425 |
EIP = PARAM1; |
|
595 |
EIP = PARAMQ1;
|
|
426 | 596 |
} |
597 |
#endif |
|
427 | 598 |
|
428 | 599 |
void OPPROTO op_hlt(void) |
429 | 600 |
{ |
... | ... | |
505 | 676 |
void OPPROTO op_boundw(void) |
506 | 677 |
{ |
507 | 678 |
int low, high, v; |
508 |
low = ldsw((uint8_t *)A0);
|
|
509 |
high = ldsw((uint8_t *)A0 + 2);
|
|
679 |
low = ldsw(A0); |
|
680 |
high = ldsw(A0 + 2); |
|
510 | 681 |
v = (int16_t)T0; |
511 | 682 |
if (v < low || v > high) { |
512 |
EIP = PARAM1; |
|
513 | 683 |
raise_exception(EXCP05_BOUND); |
514 | 684 |
} |
515 | 685 |
FORCE_RET(); |
... | ... | |
518 | 688 |
void OPPROTO op_boundl(void) |
519 | 689 |
{ |
520 | 690 |
int low, high, v; |
521 |
low = ldl((uint8_t *)A0);
|
|
522 |
high = ldl((uint8_t *)A0 + 4);
|
|
691 |
low = ldl(A0); |
|
692 |
high = ldl(A0 + 4); |
|
523 | 693 |
v = T0; |
524 | 694 |
if (v < low || v > high) { |
525 |
EIP = PARAM1; |
|
526 | 695 |
raise_exception(EXCP05_BOUND); |
527 | 696 |
} |
528 | 697 |
FORCE_RET(); |
... | ... | |
533 | 702 |
helper_cmpxchg8b(); |
534 | 703 |
} |
535 | 704 |
|
536 |
void OPPROTO op_jmp(void) |
|
537 |
{ |
|
538 |
JUMP_TB(op_jmp, PARAM1, 0, PARAM2); |
|
539 |
} |
|
540 |
|
|
541 | 705 |
void OPPROTO op_movl_T0_0(void) |
542 | 706 |
{ |
543 | 707 |
T0 = 0; |
... | ... | |
564 | 728 |
#include "ops_template.h" |
565 | 729 |
#undef SHIFT |
566 | 730 |
|
731 |
#ifdef TARGET_X86_64 |
|
732 |
|
|
733 |
#define SHIFT 3 |
|
734 |
#include "ops_template.h" |
|
735 |
#undef SHIFT |
|
736 |
|
|
737 |
#endif |
|
738 |
|
|
567 | 739 |
/* sign extend */ |
568 | 740 |
|
569 | 741 |
void OPPROTO op_movsbl_T0_T0(void) |
... | ... | |
581 | 753 |
T0 = (int16_t)T0; |
582 | 754 |
} |
583 | 755 |
|
756 |
void OPPROTO op_movslq_T0_T0(void) |
|
757 |
{ |
|
758 |
T0 = (int32_t)T0; |
|
759 |
} |
|
760 |
|
|
584 | 761 |
void OPPROTO op_movzwl_T0_T0(void) |
585 | 762 |
{ |
586 | 763 |
T0 = (uint16_t)T0; |
... | ... | |
591 | 768 |
EAX = (int16_t)EAX; |
592 | 769 |
} |
593 | 770 |
|
771 |
#ifdef TARGET_X86_64 |
|
772 |
void OPPROTO op_movslq_RAX_EAX(void) |
|
773 |
{ |
|
774 |
EAX = (int32_t)EAX; |
|
775 |
} |
|
776 |
#endif |
|
777 |
|
|
594 | 778 |
void OPPROTO op_movsbw_AX_AL(void) |
595 | 779 |
{ |
596 |
EAX = (EAX & 0xffff0000) | ((int8_t)EAX & 0xffff);
|
|
780 |
EAX = (EAX & ~0xffff) | ((int8_t)EAX & 0xffff);
|
|
597 | 781 |
} |
598 | 782 |
|
599 | 783 |
void OPPROTO op_movslq_EDX_EAX(void) |
... | ... | |
603 | 787 |
|
604 | 788 |
void OPPROTO op_movswl_DX_AX(void) |
605 | 789 |
{ |
606 |
EDX = (EDX & 0xffff0000) | (((int16_t)EAX >> 15) & 0xffff); |
|
790 |
EDX = (EDX & ~0xffff) | (((int16_t)EAX >> 15) & 0xffff); |
|
791 |
} |
|
792 |
|
|
793 |
#ifdef TARGET_X86_64 |
|
794 |
void OPPROTO op_movsqo_RDX_RAX(void) |
|
795 |
{ |
|
796 |
EDX = (int64_t)EAX >> 63; |
|
607 | 797 |
} |
798 |
#endif |
|
608 | 799 |
|
609 | 800 |
/* string ops helpers */ |
610 | 801 |
|
611 | 802 |
void OPPROTO op_addl_ESI_T0(void) |
612 | 803 |
{ |
613 |
ESI += T0;
|
|
804 |
ESI = (uint32_t)(ESI + T0);
|
|
614 | 805 |
} |
615 | 806 |
|
616 | 807 |
void OPPROTO op_addw_ESI_T0(void) |
... | ... | |
620 | 811 |
|
621 | 812 |
void OPPROTO op_addl_EDI_T0(void) |
622 | 813 |
{ |
623 |
EDI += T0;
|
|
814 |
EDI = (uint32_t)(EDI + T0);
|
|
624 | 815 |
} |
625 | 816 |
|
626 | 817 |
void OPPROTO op_addw_EDI_T0(void) |
... | ... | |
630 | 821 |
|
631 | 822 |
void OPPROTO op_decl_ECX(void) |
632 | 823 |
{ |
633 |
ECX--;
|
|
824 |
ECX = (uint32_t)(ECX - 1);
|
|
634 | 825 |
} |
635 | 826 |
|
636 | 827 |
void OPPROTO op_decw_ECX(void) |
... | ... | |
638 | 829 |
ECX = (ECX & ~0xffff) | ((ECX - 1) & 0xffff); |
639 | 830 |
} |
640 | 831 |
|
832 |
#ifdef TARGET_X86_64 |
|
833 |
void OPPROTO op_addq_ESI_T0(void) |
|
834 |
{ |
|
835 |
ESI = (ESI + T0); |
|
836 |
} |
|
837 |
|
|
838 |
void OPPROTO op_addq_EDI_T0(void) |
|
839 |
{ |
|
840 |
EDI = (EDI + T0); |
|
841 |
} |
|
842 |
|
|
843 |
void OPPROTO op_decq_ECX(void) |
|
844 |
{ |
|
845 |
ECX--; |
|
846 |
} |
|
847 |
#endif |
|
848 |
|
|
641 | 849 |
/* push/pop utils */ |
642 | 850 |
|
643 | 851 |
void op_addl_A0_SS(void) |
... | ... | |
647 | 855 |
|
648 | 856 |
void op_subl_A0_2(void) |
649 | 857 |
{ |
650 |
A0 -= 2;
|
|
858 |
A0 = (uint32_t)(A0 - 2);
|
|
651 | 859 |
} |
652 | 860 |
|
653 | 861 |
void op_subl_A0_4(void) |
654 | 862 |
{ |
655 |
A0 -= 4;
|
|
863 |
A0 = (uint32_t)(A0 - 4);
|
|
656 | 864 |
} |
657 | 865 |
|
658 | 866 |
void op_addl_ESP_4(void) |
659 | 867 |
{ |
660 |
ESP += 4;
|
|
868 |
ESP = (uint32_t)(ESP + 4);
|
|
661 | 869 |
} |
662 | 870 |
|
663 | 871 |
void op_addl_ESP_2(void) |
664 | 872 |
{ |
665 |
ESP += 2;
|
|
873 |
ESP = (uint32_t)(ESP + 2);
|
|
666 | 874 |
} |
667 | 875 |
|
668 | 876 |
void op_addw_ESP_4(void) |
... | ... | |
677 | 885 |
|
678 | 886 |
void op_addl_ESP_im(void) |
679 | 887 |
{ |
680 |
ESP += PARAM1;
|
|
888 |
ESP = (uint32_t)(ESP + PARAM1);
|
|
681 | 889 |
} |
682 | 890 |
|
683 | 891 |
void op_addw_ESP_im(void) |
... | ... | |
685 | 893 |
ESP = (ESP & ~0xffff) | ((ESP + PARAM1) & 0xffff); |
686 | 894 |
} |
687 | 895 |
|
896 |
#ifdef TARGET_X86_64 |
|
897 |
void op_subq_A0_8(void) |
|
898 |
{ |
|
899 |
A0 -= 8; |
|
900 |
} |
|
901 |
|
|
902 |
void op_addq_ESP_8(void) |
|
903 |
{ |
|
904 |
ESP += 8; |
|
905 |
} |
|
906 |
|
|
907 |
void op_addq_ESP_im(void) |
|
908 |
{ |
|
909 |
ESP += PARAM1; |
|
910 |
} |
|
911 |
#endif |
|
912 |
|
|
688 | 913 |
void OPPROTO op_rdtsc(void) |
689 | 914 |
{ |
690 | 915 |
helper_rdtsc(); |
... | ... | |
710 | 935 |
helper_sysexit(); |
711 | 936 |
} |
712 | 937 |
|
938 |
#ifdef TARGET_X86_64 |
|
939 |
void OPPROTO op_syscall(void) |
|
940 |
{ |
|
941 |
helper_syscall(); |
|
942 |
} |
|
943 |
|
|
944 |
void OPPROTO op_sysret(void) |
|
945 |
{ |
|
946 |
helper_sysret(PARAM1); |
|
947 |
} |
|
948 |
#endif |
|
949 |
|
|
713 | 950 |
void OPPROTO op_rdmsr(void) |
714 | 951 |
{ |
715 | 952 |
helper_rdmsr(); |
... | ... | |
868 | 1105 |
/* env->segs[] access */ |
869 | 1106 |
sc = (SegmentCache *)((char *)env + PARAM1); |
870 | 1107 |
sc->selector = selector; |
871 |
sc->base = (void *)(selector << 4);
|
|
1108 |
sc->base = (selector << 4); |
|
872 | 1109 |
} |
873 | 1110 |
|
874 | 1111 |
void OPPROTO op_movl_T0_seg(void) |
... | ... | |
876 | 1113 |
T0 = env->segs[PARAM1].selector; |
877 | 1114 |
} |
878 | 1115 |
|
879 |
void OPPROTO op_movl_A0_seg(void) |
|
880 |
{ |
|
881 |
A0 = *(unsigned long *)((char *)env + PARAM1); |
|
882 |
} |
|
883 |
|
|
884 |
void OPPROTO op_addl_A0_seg(void) |
|
885 |
{ |
|
886 |
A0 += *(unsigned long *)((char *)env + PARAM1); |
|
887 |
} |
|
888 |
|
|
889 | 1116 |
void OPPROTO op_lsl(void) |
890 | 1117 |
{ |
891 | 1118 |
helper_lsl(); |
... | ... | |
1006 | 1233 |
*(uint32_t *)((char *)env + PARAM1) = T1; |
1007 | 1234 |
} |
1008 | 1235 |
|
1236 |
void OPPROTO op_movtl_T0_env(void) |
|
1237 |
{ |
|
1238 |
T0 = *(target_ulong *)((char *)env + PARAM1); |
|
1239 |
} |
|
1240 |
|
|
1241 |
void OPPROTO op_movtl_env_T0(void) |
|
1242 |
{ |
|
1243 |
*(target_ulong *)((char *)env + PARAM1) = T0; |
|
1244 |
} |
|
1245 |
|
|
1246 |
void OPPROTO op_movtl_T1_env(void) |
|
1247 |
{ |
|
1248 |
T1 = *(target_ulong *)((char *)env + PARAM1); |
|
1249 |
} |
|
1250 |
|
|
1251 |
void OPPROTO op_movtl_env_T1(void) |
|
1252 |
{ |
|
1253 |
*(target_ulong *)((char *)env + PARAM1) = T1; |
|
1254 |
} |
|
1255 |
|
|
1009 | 1256 |
void OPPROTO op_clts(void) |
1010 | 1257 |
{ |
1011 | 1258 |
env->cr[0] &= ~CR0_TS_MASK; |
... | ... | |
1014 | 1261 |
|
1015 | 1262 |
/* flags handling */ |
1016 | 1263 |
|
1017 |
/* slow jumps cases : in order to avoid calling a function with a |
|
1018 |
pointer (which can generate a stack frame on PowerPC), we use |
|
1019 |
op_setcc to set T0 and then call op_jcc. */ |
|
1020 |
void OPPROTO op_jcc(void) |
|
1264 |
void OPPROTO op_goto_tb0(void) |
|
1021 | 1265 |
{ |
1022 |
if (T0) |
|
1023 |
JUMP_TB(op_jcc, PARAM1, 0, PARAM2); |
|
1024 |
else |
|
1025 |
JUMP_TB(op_jcc, PARAM1, 1, PARAM3); |
|
1026 |
FORCE_RET(); |
|
1266 |
GOTO_TB(op_goto_tb0, 0); |
|
1267 |
} |
|
1268 |
|
|
1269 |
void OPPROTO op_goto_tb1(void) |
|
1270 |
{ |
|
1271 |
GOTO_TB(op_goto_tb1, 1); |
|
1272 |
} |
|
1273 |
|
|
1274 |
void OPPROTO op_jmp_label(void) |
|
1275 |
{ |
|
1276 |
GOTO_LABEL_PARAM(1); |
|
1027 | 1277 |
} |
1028 | 1278 |
|
1029 |
void OPPROTO op_jcc_im(void)
|
|
1279 |
void OPPROTO op_jnz_T0_label(void)
|
|
1030 | 1280 |
{ |
1031 | 1281 |
if (T0) |
1032 |
EIP = PARAM1; |
|
1033 |
else |
|
1034 |
EIP = PARAM2; |
|
1035 |
FORCE_RET(); |
|
1282 |
GOTO_LABEL_PARAM(1); |
|
1283 |
} |
|
1284 |
|
|
1285 |
void OPPROTO op_jz_T0_label(void) |
|
1286 |
{ |
|
1287 |
if (!T0) |
|
1288 |
GOTO_LABEL_PARAM(1); |
|
1036 | 1289 |
} |
1037 | 1290 |
|
1038 | 1291 |
/* slow set cases (compute x86 flags) */ |
... | ... | |
1299 | 1552 |
[CC_OP_SARB] = { compute_all_sarb, compute_c_sarl }, |
1300 | 1553 |
[CC_OP_SARW] = { compute_all_sarw, compute_c_sarl }, |
1301 | 1554 |
[CC_OP_SARL] = { compute_all_sarl, compute_c_sarl }, |
1555 |
|
|
1556 |
#ifdef TARGET_X86_64 |
|
1557 |
[CC_OP_MULQ] = { compute_all_mulq, compute_c_mull }, |
|
1558 |
|
|
1559 |
[CC_OP_ADDQ] = { compute_all_addq, compute_c_addq }, |
|
1560 |
|
|
1561 |
[CC_OP_ADCQ] = { compute_all_adcq, compute_c_adcq }, |
|
1562 |
|
|
1563 |
[CC_OP_SUBQ] = { compute_all_subq, compute_c_subq }, |
|
1564 |
|
|
1565 |
[CC_OP_SBBQ] = { compute_all_sbbq, compute_c_sbbq }, |
|
1566 |
|
|
1567 |
[CC_OP_LOGICQ] = { compute_all_logicq, compute_c_logicq }, |
|
1568 |
|
|
1569 |
[CC_OP_INCQ] = { compute_all_incq, compute_c_incl }, |
|
1570 |
|
|
1571 |
[CC_OP_DECQ] = { compute_all_decq, compute_c_incl }, |
|
1572 |
|
|
1573 |
[CC_OP_SHLQ] = { compute_all_shlq, compute_c_shlq }, |
|
1574 |
|
|
1575 |
[CC_OP_SARQ] = { compute_all_sarq, compute_c_sarl }, |
|
1576 |
#endif |
|
1302 | 1577 |
}; |
1303 | 1578 |
|
1304 | 1579 |
/* floating point support. Some of the code for complicated x87 |
... | ... | |
1330 | 1605 |
void OPPROTO op_flds_FT0_A0(void) |
1331 | 1606 |
{ |
1332 | 1607 |
#ifdef USE_FP_CONVERT |
1333 |
FP_CONVERT.i32 = ldl((void *)A0);
|
|
1608 |
FP_CONVERT.i32 = ldl(A0); |
|
1334 | 1609 |
FT0 = FP_CONVERT.f; |
1335 | 1610 |
#else |
1336 |
FT0 = ldfl((void *)A0);
|
|
1611 |
FT0 = ldfl(A0); |
|
1337 | 1612 |
#endif |
1338 | 1613 |
} |
1339 | 1614 |
|
1340 | 1615 |
void OPPROTO op_fldl_FT0_A0(void) |
1341 | 1616 |
{ |
1342 | 1617 |
#ifdef USE_FP_CONVERT |
1343 |
FP_CONVERT.i64 = ldq((void *)A0);
|
|
1618 |
FP_CONVERT.i64 = ldq(A0); |
|
1344 | 1619 |
FT0 = FP_CONVERT.d; |
1345 | 1620 |
#else |
1346 |
FT0 = ldfq((void *)A0);
|
|
1621 |
FT0 = ldfq(A0); |
|
1347 | 1622 |
#endif |
1348 | 1623 |
} |
1349 | 1624 |
|
... | ... | |
1352 | 1627 |
|
1353 | 1628 |
void helper_fild_FT0_A0(void) |
1354 | 1629 |
{ |
1355 |
FT0 = (CPU86_LDouble)ldsw((void *)A0);
|
|
1630 |
FT0 = (CPU86_LDouble)ldsw(A0); |
|
1356 | 1631 |
} |
1357 | 1632 |
|
1358 | 1633 |
void helper_fildl_FT0_A0(void) |
1359 | 1634 |
{ |
1360 |
FT0 = (CPU86_LDouble)((int32_t)ldl((void *)A0));
|
|
1635 |
FT0 = (CPU86_LDouble)((int32_t)ldl(A0)); |
|
1361 | 1636 |
} |
1362 | 1637 |
|
1363 | 1638 |
void helper_fildll_FT0_A0(void) |
1364 | 1639 |
{ |
1365 |
FT0 = (CPU86_LDouble)((int64_t)ldq((void *)A0));
|
|
1640 |
FT0 = (CPU86_LDouble)((int64_t)ldq(A0)); |
|
1366 | 1641 |
} |
1367 | 1642 |
|
1368 | 1643 |
void OPPROTO op_fild_FT0_A0(void) |
... | ... | |
1385 | 1660 |
void OPPROTO op_fild_FT0_A0(void) |
1386 | 1661 |
{ |
1387 | 1662 |
#ifdef USE_FP_CONVERT |
1388 |
FP_CONVERT.i32 = ldsw((void *)A0);
|
|
1663 |
FP_CONVERT.i32 = ldsw(A0); |
|
1389 | 1664 |
FT0 = (CPU86_LDouble)FP_CONVERT.i32; |
1390 | 1665 |
#else |
1391 |
FT0 = (CPU86_LDouble)ldsw((void *)A0);
|
|
1666 |
FT0 = (CPU86_LDouble)ldsw(A0); |
|
1392 | 1667 |
#endif |
1393 | 1668 |
} |
1394 | 1669 |
|
1395 | 1670 |
void OPPROTO op_fildl_FT0_A0(void) |
1396 | 1671 |
{ |
1397 | 1672 |
#ifdef USE_FP_CONVERT |
1398 |
FP_CONVERT.i32 = (int32_t) ldl((void *)A0);
|
|
1673 |
FP_CONVERT.i32 = (int32_t) ldl(A0); |
|
1399 | 1674 |
FT0 = (CPU86_LDouble)FP_CONVERT.i32; |
1400 | 1675 |
#else |
1401 |
FT0 = (CPU86_LDouble)((int32_t)ldl((void *)A0));
|
|
1676 |
FT0 = (CPU86_LDouble)((int32_t)ldl(A0)); |
|
1402 | 1677 |
#endif |
1403 | 1678 |
} |
1404 | 1679 |
|
1405 | 1680 |
void OPPROTO op_fildll_FT0_A0(void) |
1406 | 1681 |
{ |
1407 | 1682 |
#ifdef USE_FP_CONVERT |
1408 |
FP_CONVERT.i64 = (int64_t) ldq((void *)A0);
|
|
1683 |
FP_CONVERT.i64 = (int64_t) ldq(A0); |
|
1409 | 1684 |
FT0 = (CPU86_LDouble)FP_CONVERT.i64; |
1410 | 1685 |
#else |
1411 |
FT0 = (CPU86_LDouble)((int64_t)ldq((void *)A0));
|
|
1686 |
FT0 = (CPU86_LDouble)((int64_t)ldq(A0)); |
|
1412 | 1687 |
#endif |
1413 | 1688 |
} |
1414 | 1689 |
#endif |
... | ... | |
1420 | 1695 |
int new_fpstt; |
1421 | 1696 |
new_fpstt = (env->fpstt - 1) & 7; |
1422 | 1697 |
#ifdef USE_FP_CONVERT |
1423 |
FP_CONVERT.i32 = ldl((void *)A0);
|
|
1698 |
FP_CONVERT.i32 = ldl(A0); |
|
1424 | 1699 |
env->fpregs[new_fpstt] = FP_CONVERT.f; |
1425 | 1700 |
#else |
1426 |
env->fpregs[new_fpstt] = ldfl((void *)A0);
|
|
1701 |
env->fpregs[new_fpstt] = ldfl(A0); |
|
1427 | 1702 |
#endif |
1428 | 1703 |
env->fpstt = new_fpstt; |
1429 | 1704 |
env->fptags[new_fpstt] = 0; /* validate stack entry */ |
... | ... | |
1434 | 1709 |
int new_fpstt; |
1435 | 1710 |
new_fpstt = (env->fpstt - 1) & 7; |
1436 | 1711 |
#ifdef USE_FP_CONVERT |
1437 |
FP_CONVERT.i64 = ldq((void *)A0);
|
|
1712 |
FP_CONVERT.i64 = ldq(A0); |
|
1438 | 1713 |
env->fpregs[new_fpstt] = FP_CONVERT.d; |
1439 | 1714 |
#else |
1440 |
env->fpregs[new_fpstt] = ldfq((void *)A0);
|
|
1715 |
env->fpregs[new_fpstt] = ldfq(A0); |
|
1441 | 1716 |
#endif |
1442 | 1717 |
env->fpstt = new_fpstt; |
1443 | 1718 |
env->fptags[new_fpstt] = 0; /* validate stack entry */ |
... | ... | |
1455 | 1730 |
{ |
1456 | 1731 |
int new_fpstt; |
1457 | 1732 |
new_fpstt = (env->fpstt - 1) & 7; |
1458 |
env->fpregs[new_fpstt] = (CPU86_LDouble)ldsw((void *)A0);
|
|
1733 |
env->fpregs[new_fpstt] = (CPU86_LDouble)ldsw(A0); |
|
1459 | 1734 |
env->fpstt = new_fpstt; |
1460 | 1735 |
env->fptags[new_fpstt] = 0; /* validate stack entry */ |
1461 | 1736 |
} |
... | ... | |
1464 | 1739 |
{ |
1465 | 1740 |
int new_fpstt; |
1466 | 1741 |
new_fpstt = (env->fpstt - 1) & 7; |
1467 |
env->fpregs[new_fpstt] = (CPU86_LDouble)((int32_t)ldl((void *)A0));
|
|
1742 |
env->fpregs[new_fpstt] = (CPU86_LDouble)((int32_t)ldl(A0)); |
|
1468 | 1743 |
env->fpstt = new_fpstt; |
1469 | 1744 |
env->fptags[new_fpstt] = 0; /* validate stack entry */ |
1470 | 1745 |
} |
... | ... | |
1473 | 1748 |
{ |
1474 | 1749 |
int new_fpstt; |
1475 | 1750 |
new_fpstt = (env->fpstt - 1) & 7; |
1476 |
env->fpregs[new_fpstt] = (CPU86_LDouble)((int64_t)ldq((void *)A0));
|
|
1751 |
env->fpregs[new_fpstt] = (CPU86_LDouble)((int64_t)ldq(A0)); |
|
1477 | 1752 |
env->fpstt = new_fpstt; |
1478 | 1753 |
env->fptags[new_fpstt] = 0; /* validate stack entry */ |
1479 | 1754 |
} |
... | ... | |
1500 | 1775 |
int new_fpstt; |
1501 | 1776 |
new_fpstt = (env->fpstt - 1) & 7; |
1502 | 1777 |
#ifdef USE_FP_CONVERT |
1503 |
FP_CONVERT.i32 = ldsw((void *)A0);
|
|
1778 |
FP_CONVERT.i32 = ldsw(A0); |
|
1504 | 1779 |
env->fpregs[new_fpstt] = (CPU86_LDouble)FP_CONVERT.i32; |
1505 | 1780 |
#else |
1506 |
env->fpregs[new_fpstt] = (CPU86_LDouble)ldsw((void *)A0);
|
|
1781 |
env->fpregs[new_fpstt] = (CPU86_LDouble)ldsw(A0); |
|
1507 | 1782 |
#endif |
1508 | 1783 |
env->fpstt = new_fpstt; |
1509 | 1784 |
env->fptags[new_fpstt] = 0; /* validate stack entry */ |
... | ... | |
1514 | 1789 |
int new_fpstt; |
1515 | 1790 |
new_fpstt = (env->fpstt - 1) & 7; |
1516 | 1791 |
#ifdef USE_FP_CONVERT |
1517 |
FP_CONVERT.i32 = (int32_t) ldl((void *)A0);
|
|
1792 |
FP_CONVERT.i32 = (int32_t) ldl(A0); |
|
1518 | 1793 |
env->fpregs[new_fpstt] = (CPU86_LDouble)FP_CONVERT.i32; |
1519 | 1794 |
#else |
1520 |
env->fpregs[new_fpstt] = (CPU86_LDouble)((int32_t)ldl((void *)A0));
|
|
1795 |
env->fpregs[new_fpstt] = (CPU86_LDouble)((int32_t)ldl(A0)); |
|
1521 | 1796 |
#endif |
1522 | 1797 |
env->fpstt = new_fpstt; |
1523 | 1798 |
env->fptags[new_fpstt] = 0; /* validate stack entry */ |
... | ... | |
1528 | 1803 |
int new_fpstt; |
1529 | 1804 |
new_fpstt = (env->fpstt - 1) & 7; |
1530 | 1805 |
#ifdef USE_FP_CONVERT |
1531 |
FP_CONVERT.i64 = (int64_t) ldq((void *)A0);
|
|
1806 |
FP_CONVERT.i64 = (int64_t) ldq(A0); |
|
1532 | 1807 |
env->fpregs[new_fpstt] = (CPU86_LDouble)FP_CONVERT.i64; |
1533 | 1808 |
#else |
1534 |
env->fpregs[new_fpstt] = (CPU86_LDouble)((int64_t)ldq((void *)A0));
|
|
1809 |
env->fpregs[new_fpstt] = (CPU86_LDouble)((int64_t)ldq(A0)); |
|
1535 | 1810 |
#endif |
1536 | 1811 |
env->fpstt = new_fpstt; |
1537 | 1812 |
env->fptags[new_fpstt] = 0; /* validate stack entry */ |
... | ... | |
1545 | 1820 |
{ |
1546 | 1821 |
#ifdef USE_FP_CONVERT |
1547 | 1822 |
FP_CONVERT.f = (float)ST0; |
1548 |
stfl((void *)A0, FP_CONVERT.f);
|
|
1823 |
stfl(A0, FP_CONVERT.f); |
|
1549 | 1824 |
#else |
1550 |
stfl((void *)A0, (float)ST0);
|
|
1825 |
stfl(A0, (float)ST0); |
|
1551 | 1826 |
#endif |
1552 | 1827 |
} |
1553 | 1828 |
|
1554 | 1829 |
void OPPROTO op_fstl_ST0_A0(void) |
1555 | 1830 |
{ |
1556 |
stfq((void *)A0, (double)ST0);
|
|
1831 |
stfq(A0, (double)ST0); |
|
1557 | 1832 |
} |
1558 | 1833 |
|
1559 | 1834 |
void OPPROTO op_fstt_ST0_A0(void) |
... | ... | |
1574 | 1849 |
val = lrint(d); |
1575 | 1850 |
if (val != (int16_t)val) |
1576 | 1851 |
val = -32768; |
1577 |
stw((void *)A0, val);
|
|
1852 |
stw(A0, val); |
|
1578 | 1853 |
} |
1579 | 1854 |
|
1580 | 1855 |
void OPPROTO op_fistl_ST0_A0(void) |
... | ... | |
1588 | 1863 |
|
1589 | 1864 |
d = ST0; |
1590 | 1865 |
val = lrint(d); |
1591 |
stl((void *)A0, val);
|
|
1866 |
stl(A0, val); |
|
1592 | 1867 |
} |
1593 | 1868 |
|
1594 | 1869 |
void OPPROTO op_fistll_ST0_A0(void) |
... | ... | |
1602 | 1877 |
|
1603 | 1878 |
d = ST0; |
1604 | 1879 |
val = llrint(d); |
1605 |
stq((void *)A0, val);
|
|
1880 |
stq(A0, val); |
|
1606 | 1881 |
} |
1607 | 1882 |
|
1608 | 1883 |
void OPPROTO op_fbld_ST0_A0(void) |
... | ... | |
1934 | 2209 |
{ |
1935 | 2210 |
int fpus; |
1936 | 2211 |
fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11; |
1937 |
stw((void *)A0, fpus);
|
|
2212 |
stw(A0, fpus); |
|
1938 | 2213 |
} |
1939 | 2214 |
|
1940 | 2215 |
void OPPROTO op_fnstsw_EAX(void) |
1941 | 2216 |
{ |
1942 | 2217 |
int fpus; |
1943 | 2218 |
fpus = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11; |
1944 |
EAX = (EAX & 0xffff0000) | fpus;
|
|
2219 |
EAX = (EAX & ~0xffff) | fpus;
|
|
1945 | 2220 |
} |
1946 | 2221 |
|
1947 | 2222 |
void OPPROTO op_fnstcw_A0(void) |
1948 | 2223 |
{ |
1949 |
stw((void *)A0, env->fpuc);
|
|
2224 |
stw(A0, env->fpuc); |
|
1950 | 2225 |
} |
1951 | 2226 |
|
1952 | 2227 |
void OPPROTO op_fldcw_A0(void) |
1953 | 2228 |
{ |
1954 | 2229 |
int rnd_type; |
1955 |
env->fpuc = lduw((void *)A0);
|
|
2230 |
env->fpuc = lduw(A0); |
|
1956 | 2231 |
/* set rounding mode */ |
1957 | 2232 |
switch(env->fpuc & RC_MASK) { |
1958 | 2233 |
default: |
... | ... | |
2001 | 2276 |
|
2002 | 2277 |
void OPPROTO op_fnstenv_A0(void) |
2003 | 2278 |
{ |
2004 |
helper_fstenv((uint8_t *)A0, PARAM1);
|
|
2279 |
helper_fstenv(A0, PARAM1); |
|
2005 | 2280 |
} |
2006 | 2281 |
|
2007 | 2282 |
void OPPROTO op_fldenv_A0(void) |
2008 | 2283 |
{ |
2009 |
helper_fldenv((uint8_t *)A0, PARAM1);
|
|
2284 |
helper_fldenv(A0, PARAM1); |
|
2010 | 2285 |
} |
2011 | 2286 |
|
2012 | 2287 |
void OPPROTO op_fnsave_A0(void) |
2013 | 2288 |
{ |
2014 |
helper_fsave((uint8_t *)A0, PARAM1);
|
|
2289 |
helper_fsave(A0, PARAM1); |
|
2015 | 2290 |
} |
2016 | 2291 |
|
2017 | 2292 |
void OPPROTO op_frstor_A0(void) |
2018 | 2293 |
{ |
2019 |
helper_frstor((uint8_t *)A0, PARAM1);
|
|
2294 |
helper_frstor(A0, PARAM1); |
|
2020 | 2295 |
} |
2021 | 2296 |
|
2022 | 2297 |
/* threading support */ |
... | ... | |
2030 | 2305 |
cpu_unlock(); |
2031 | 2306 |
} |
2032 | 2307 |
|
2308 |
/* SSE support */ |
|
2309 |
static inline void memcpy16(void *d, void *s) |
|
2310 |
{ |
|
2311 |
((uint32_t *)d)[0] = ((uint32_t *)s)[0]; |
|
2312 |
((uint32_t *)d)[1] = ((uint32_t *)s)[1]; |
|
2313 |
((uint32_t *)d)[2] = ((uint32_t *)s)[2]; |
|
2314 |
((uint32_t *)d)[3] = ((uint32_t *)s)[3]; |
|
2315 |
} |
|
2316 |
|
|
2317 |
void OPPROTO op_movo(void) |
|
2318 |
{ |
|
2319 |
/* XXX: badly generated code */ |
|
2320 |
XMMReg *d, *s; |
|
2321 |
d = (XMMReg *)((char *)env + PARAM1); |
|
2322 |
s = (XMMReg *)((char *)env + PARAM2); |
|
2323 |
memcpy16(d, s); |
|
2324 |
} |
|
2325 |
|
|
2326 |
void OPPROTO op_fxsave_A0(void) |
|
2327 |
{ |
|
2328 |
helper_fxsave(A0, PARAM1); |
|
2329 |
} |
|
2330 |
|
|
2331 |
void OPPROTO op_fxrstor_A0(void) |
|
2332 |
{ |
|
2333 |
helper_fxrstor(A0, PARAM1); |
|
2334 |
} |
Also available in: Unified diff