Revision 57fec1fe target-i386/op.c
b/target-i386/op.c | ||
---|---|---|
172 | 172 |
|
173 | 173 |
/* operations without flags */ |
174 | 174 |
|
175 |
void OPPROTO op_addl_T0_T1(void) |
|
176 |
{ |
|
177 |
T0 += T1; |
|
178 |
} |
|
179 |
|
|
180 |
void OPPROTO op_orl_T0_T1(void) |
|
181 |
{ |
|
182 |
T0 |= T1; |
|
183 |
} |
|
184 |
|
|
185 |
void OPPROTO op_andl_T0_T1(void) |
|
186 |
{ |
|
187 |
T0 &= T1; |
|
188 |
} |
|
189 |
|
|
190 |
void OPPROTO op_subl_T0_T1(void) |
|
191 |
{ |
|
192 |
T0 -= T1; |
|
193 |
} |
|
194 |
|
|
195 |
void OPPROTO op_xorl_T0_T1(void) |
|
196 |
{ |
|
197 |
T0 ^= T1; |
|
198 |
} |
|
199 |
|
|
200 | 175 |
void OPPROTO op_negl_T0(void) |
201 | 176 |
{ |
202 | 177 |
T0 = -T0; |
... | ... | |
217 | 192 |
T0 = ~T0; |
218 | 193 |
} |
219 | 194 |
|
220 |
void OPPROTO op_bswapl_T0(void) |
|
221 |
{ |
|
222 |
T0 = bswap32(T0); |
|
223 |
} |
|
224 |
|
|
225 |
#ifdef TARGET_X86_64 |
|
226 |
void OPPROTO op_bswapq_T0(void) |
|
227 |
{ |
|
228 |
helper_bswapq_T0(); |
|
229 |
} |
|
230 |
#endif |
|
231 |
|
|
232 | 195 |
/* multiply/divide */ |
233 | 196 |
|
234 | 197 |
/* XXX: add eflags optimizations */ |
... | ... | |
399 | 362 |
EDX = (EDX & ~0xffff) | r; |
400 | 363 |
} |
401 | 364 |
|
402 |
void OPPROTO op_divl_EAX_T0(void) |
|
403 |
{ |
|
404 |
helper_divl_EAX_T0(); |
|
405 |
} |
|
406 |
|
|
407 |
void OPPROTO op_idivl_EAX_T0(void) |
|
408 |
{ |
|
409 |
helper_idivl_EAX_T0(); |
|
410 |
} |
|
411 |
|
|
412 | 365 |
#ifdef TARGET_X86_64 |
413 | 366 |
void OPPROTO op_divq_EAX_T0(void) |
414 | 367 |
{ |
... | ... | |
424 | 377 |
/* constant load & misc op */ |
425 | 378 |
|
426 | 379 |
/* XXX: consistent names */ |
427 |
void OPPROTO op_movl_T0_imu(void) |
|
428 |
{ |
|
429 |
T0 = (uint32_t)PARAM1; |
|
430 |
} |
|
431 |
|
|
432 |
void OPPROTO op_movl_T0_im(void) |
|
433 |
{ |
|
434 |
T0 = (int32_t)PARAM1; |
|
435 |
} |
|
436 |
|
|
437 |
void OPPROTO op_addl_T0_im(void) |
|
438 |
{ |
|
439 |
T0 += PARAM1; |
|
440 |
} |
|
441 |
|
|
442 |
void OPPROTO op_andl_T0_ffff(void) |
|
443 |
{ |
|
444 |
T0 = T0 & 0xffff; |
|
445 |
} |
|
446 |
|
|
447 |
void OPPROTO op_andl_T0_im(void) |
|
448 |
{ |
|
449 |
T0 = T0 & PARAM1; |
|
450 |
} |
|
451 |
|
|
452 |
void OPPROTO op_movl_T0_T1(void) |
|
453 |
{ |
|
454 |
T0 = T1; |
|
455 |
} |
|
456 |
|
|
457 |
void OPPROTO op_movl_T1_imu(void) |
|
458 |
{ |
|
459 |
T1 = (uint32_t)PARAM1; |
|
460 |
} |
|
461 |
|
|
462 |
void OPPROTO op_movl_T1_im(void) |
|
463 |
{ |
|
464 |
T1 = (int32_t)PARAM1; |
|
465 |
} |
|
466 |
|
|
467 | 380 |
void OPPROTO op_addl_T1_im(void) |
468 | 381 |
{ |
469 | 382 |
T1 += PARAM1; |
... | ... | |
474 | 387 |
T1 = A0; |
475 | 388 |
} |
476 | 389 |
|
477 |
void OPPROTO op_movl_A0_im(void) |
|
478 |
{ |
|
479 |
A0 = (uint32_t)PARAM1; |
|
480 |
} |
|
481 |
|
|
482 |
void OPPROTO op_addl_A0_im(void) |
|
483 |
{ |
|
484 |
A0 = (uint32_t)(A0 + PARAM1); |
|
485 |
} |
|
486 |
|
|
487 |
void OPPROTO op_movl_A0_seg(void) |
|
488 |
{ |
|
489 |
A0 = (uint32_t)*(target_ulong *)((char *)env + PARAM1); |
|
490 |
} |
|
491 |
|
|
492 |
void OPPROTO op_addl_A0_seg(void) |
|
493 |
{ |
|
494 |
A0 = (uint32_t)(A0 + *(target_ulong *)((char *)env + PARAM1)); |
|
495 |
} |
|
496 |
|
|
497 | 390 |
void OPPROTO op_addl_A0_AL(void) |
498 | 391 |
{ |
499 | 392 |
A0 = (uint32_t)(A0 + (EAX & 0xff)); |
... | ... | |
523 | 416 |
|
524 | 417 |
#ifdef TARGET_X86_64 |
525 | 418 |
|
526 |
void OPPROTO op_movq_T0_im64(void) |
|
527 |
{ |
|
528 |
T0 = PARAMQ1; |
|
529 |
} |
|
530 |
|
|
531 |
void OPPROTO op_movq_T1_im64(void) |
|
532 |
{ |
|
533 |
T1 = PARAMQ1; |
|
534 |
} |
|
535 |
|
|
536 |
void OPPROTO op_movq_A0_im(void) |
|
537 |
{ |
|
538 |
A0 = (int32_t)PARAM1; |
|
539 |
} |
|
540 |
|
|
541 |
void OPPROTO op_movq_A0_im64(void) |
|
542 |
{ |
|
543 |
A0 = PARAMQ1; |
|
544 |
} |
|
545 |
|
|
546 |
void OPPROTO op_addq_A0_im(void) |
|
547 |
{ |
|
548 |
A0 = (A0 + (int32_t)PARAM1); |
|
549 |
} |
|
550 |
|
|
551 |
void OPPROTO op_addq_A0_im64(void) |
|
552 |
{ |
|
553 |
A0 = (A0 + PARAMQ1); |
|
554 |
} |
|
555 |
|
|
556 |
void OPPROTO op_movq_A0_seg(void) |
|
557 |
{ |
|
558 |
A0 = *(target_ulong *)((char *)env + PARAM1); |
|
559 |
} |
|
560 |
|
|
561 |
void OPPROTO op_addq_A0_seg(void) |
|
562 |
{ |
|
563 |
A0 += *(target_ulong *)((char *)env + PARAM1); |
|
564 |
} |
|
565 |
|
|
566 | 419 |
void OPPROTO op_addq_A0_AL(void) |
567 | 420 |
{ |
568 | 421 |
A0 = (A0 + (EAX & 0xff)); |
... | ... | |
570 | 423 |
|
571 | 424 |
#endif |
572 | 425 |
|
573 |
void OPPROTO op_andl_A0_ffff(void) |
|
574 |
{ |
|
575 |
A0 = A0 & 0xffff; |
|
576 |
} |
|
577 |
|
|
578 | 426 |
/* memory access */ |
579 | 427 |
|
580 | 428 |
#define MEMSUFFIX _raw |
... | ... | |
588 | 436 |
#include "ops_mem.h" |
589 | 437 |
#endif |
590 | 438 |
|
591 |
/* indirect jump */ |
|
592 |
|
|
593 |
void OPPROTO op_jmp_T0(void) |
|
594 |
{ |
|
595 |
EIP = T0; |
|
596 |
} |
|
597 |
|
|
598 |
void OPPROTO op_movl_eip_im(void) |
|
599 |
{ |
|
600 |
EIP = (uint32_t)PARAM1; |
|
601 |
} |
|
602 |
|
|
603 |
#ifdef TARGET_X86_64 |
|
604 |
void OPPROTO op_movq_eip_im(void) |
|
605 |
{ |
|
606 |
EIP = (int32_t)PARAM1; |
|
607 |
} |
|
608 |
|
|
609 |
void OPPROTO op_movq_eip_im64(void) |
|
610 |
{ |
|
611 |
EIP = PARAMQ1; |
|
612 |
} |
|
613 |
#endif |
|
614 |
|
|
615 | 439 |
void OPPROTO op_hlt(void) |
616 | 440 |
{ |
617 | 441 |
helper_hlt(); |
... | ... | |
735 | 559 |
helper_single_step(); |
736 | 560 |
} |
737 | 561 |
|
738 |
void OPPROTO op_movl_T0_0(void) |
|
739 |
{ |
|
740 |
T0 = 0; |
|
741 |
} |
|
742 |
|
|
743 |
void OPPROTO op_exit_tb(void) |
|
744 |
{ |
|
745 |
EXIT_TB(); |
|
746 |
} |
|
747 |
|
|
748 | 562 |
/* multiple size ops */ |
749 | 563 |
|
750 | 564 |
#define ldul ldl |
... | ... | |
879 | 693 |
} |
880 | 694 |
#endif |
881 | 695 |
|
882 |
/* push/pop utils */ |
|
883 |
|
|
884 |
void op_addl_A0_SS(void) |
|
885 |
{ |
|
886 |
A0 = (uint32_t)(A0 + env->segs[R_SS].base); |
|
887 |
} |
|
888 |
|
|
889 |
void op_subl_A0_2(void) |
|
890 |
{ |
|
891 |
A0 = (uint32_t)(A0 - 2); |
|
892 |
} |
|
893 |
|
|
894 |
void op_subl_A0_4(void) |
|
895 |
{ |
|
896 |
A0 = (uint32_t)(A0 - 4); |
|
897 |
} |
|
898 |
|
|
899 |
void op_addl_ESP_4(void) |
|
900 |
{ |
|
901 |
ESP = (uint32_t)(ESP + 4); |
|
902 |
} |
|
903 |
|
|
904 |
void op_addl_ESP_2(void) |
|
905 |
{ |
|
906 |
ESP = (uint32_t)(ESP + 2); |
|
907 |
} |
|
908 |
|
|
909 |
void op_addw_ESP_4(void) |
|
910 |
{ |
|
911 |
ESP = (ESP & ~0xffff) | ((ESP + 4) & 0xffff); |
|
912 |
} |
|
913 |
|
|
914 |
void op_addw_ESP_2(void) |
|
915 |
{ |
|
916 |
ESP = (ESP & ~0xffff) | ((ESP + 2) & 0xffff); |
|
917 |
} |
|
918 |
|
|
919 |
void op_addl_ESP_im(void) |
|
920 |
{ |
|
921 |
ESP = (uint32_t)(ESP + PARAM1); |
|
922 |
} |
|
923 |
|
|
924 |
void op_addw_ESP_im(void) |
|
925 |
{ |
|
926 |
ESP = (ESP & ~0xffff) | ((ESP + PARAM1) & 0xffff); |
|
927 |
} |
|
928 |
|
|
929 |
#ifdef TARGET_X86_64 |
|
930 |
void op_subq_A0_2(void) |
|
931 |
{ |
|
932 |
A0 -= 2; |
|
933 |
} |
|
934 |
|
|
935 |
void op_subq_A0_8(void) |
|
936 |
{ |
|
937 |
A0 -= 8; |
|
938 |
} |
|
939 |
|
|
940 |
void op_addq_ESP_8(void) |
|
941 |
{ |
|
942 |
ESP += 8; |
|
943 |
} |
|
944 |
|
|
945 |
void op_addq_ESP_im(void) |
|
946 |
{ |
|
947 |
ESP += PARAM1; |
|
948 |
} |
|
949 |
#endif |
|
950 |
|
|
951 | 696 |
void OPPROTO op_rdtsc(void) |
952 | 697 |
{ |
953 | 698 |
helper_rdtsc(); |
... | ... | |
1362 | 1107 |
|
1363 | 1108 |
/* flags handling */ |
1364 | 1109 |
|
1365 |
void OPPROTO op_goto_tb0(void) |
|
1366 |
{ |
|
1367 |
GOTO_TB(op_goto_tb0, PARAM1, 0); |
|
1368 |
} |
|
1369 |
|
|
1370 |
void OPPROTO op_goto_tb1(void) |
|
1371 |
{ |
|
1372 |
GOTO_TB(op_goto_tb1, PARAM1, 1); |
|
1373 |
} |
|
1374 |
|
|
1375 | 1110 |
void OPPROTO op_jmp_label(void) |
1376 | 1111 |
{ |
1377 | 1112 |
GOTO_LABEL_PARAM(1); |
... | ... | |
1451 | 1186 |
T0 ^= 1; |
1452 | 1187 |
} |
1453 | 1188 |
|
1454 |
void OPPROTO op_set_cc_op(void) |
|
1455 |
{ |
|
1456 |
CC_OP = PARAM1; |
|
1457 |
} |
|
1458 |
|
|
1459 | 1189 |
void OPPROTO op_mov_T0_cc(void) |
1460 | 1190 |
{ |
1461 | 1191 |
T0 = cc_table[CC_OP].compute_all(); |
Also available in: Unified diff