Revision f68dd770
b/target-i386/op.c | ||
---|---|---|
17 | 17 |
* License along with this library; if not, write to the Free Software |
18 | 18 |
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
19 | 19 |
*/ |
20 |
|
|
21 |
/* XXX: must use this define because the soft mmu macros have huge |
|
22 |
register constraints so they cannot be used in any C code */ |
|
23 |
#define ASM_SOFTMMU |
|
20 | 24 |
#include "exec.h" |
21 | 25 |
|
22 | 26 |
/* n must be a constant to be efficient */ |
... | ... | |
392 | 396 |
#include "ops_mem.h" |
393 | 397 |
|
394 | 398 |
#if !defined(CONFIG_USER_ONLY) |
395 |
#define MEMSUFFIX _user
|
|
399 |
#define MEMSUFFIX _kernel
|
|
396 | 400 |
#include "ops_mem.h" |
397 | 401 |
|
398 |
#define MEMSUFFIX _kernel
|
|
402 |
#define MEMSUFFIX _user
|
|
399 | 403 |
#include "ops_mem.h" |
400 | 404 |
#endif |
401 | 405 |
|
... | ... | |
403 | 407 |
|
404 | 408 |
void OPPROTO op_add_bitw_A0_T1(void) |
405 | 409 |
{ |
406 |
A0 += ((int32_t)T1 >> 4) << 1;
|
|
410 |
A0 += ((int16_t)T1 >> 4) << 1;
|
|
407 | 411 |
} |
408 | 412 |
|
409 | 413 |
void OPPROTO op_add_bitl_A0_T1(void) |
... | ... | |
635 | 639 |
ECX = (ECX & ~0xffff) | ((ECX - 1) & 0xffff); |
636 | 640 |
} |
637 | 641 |
|
638 |
/* push/pop */ |
|
639 |
|
|
640 |
void op_pushl_T0(void) |
|
641 |
{ |
|
642 |
uint32_t offset; |
|
643 |
offset = ESP - 4; |
|
644 |
stl((void *)offset, T0); |
|
645 |
/* modify ESP after to handle exceptions correctly */ |
|
646 |
ESP = offset; |
|
647 |
} |
|
648 |
|
|
649 |
void op_pushw_T0(void) |
|
650 |
{ |
|
651 |
uint32_t offset; |
|
652 |
offset = ESP - 2; |
|
653 |
stw((void *)offset, T0); |
|
654 |
/* modify ESP after to handle exceptions correctly */ |
|
655 |
ESP = offset; |
|
656 |
} |
|
657 |
|
|
658 |
void op_pushl_ss32_T0(void) |
|
659 |
{ |
|
660 |
uint32_t offset; |
|
661 |
offset = ESP - 4; |
|
662 |
stl(env->segs[R_SS].base + offset, T0); |
|
663 |
/* modify ESP after to handle exceptions correctly */ |
|
664 |
ESP = offset; |
|
665 |
} |
|
666 |
|
|
667 |
void op_pushw_ss32_T0(void) |
|
668 |
{ |
|
669 |
uint32_t offset; |
|
670 |
offset = ESP - 2; |
|
671 |
stw(env->segs[R_SS].base + offset, T0); |
|
672 |
/* modify ESP after to handle exceptions correctly */ |
|
673 |
ESP = offset; |
|
674 |
} |
|
675 |
|
|
676 |
void op_pushl_ss16_T0(void) |
|
677 |
{ |
|
678 |
uint32_t offset; |
|
679 |
offset = (ESP - 4) & 0xffff; |
|
680 |
stl(env->segs[R_SS].base + offset, T0); |
|
681 |
/* modify ESP after to handle exceptions correctly */ |
|
682 |
ESP = (ESP & ~0xffff) | offset; |
|
683 |
} |
|
684 |
|
|
685 |
void op_pushw_ss16_T0(void) |
|
686 |
{ |
|
687 |
uint32_t offset; |
|
688 |
offset = (ESP - 2) & 0xffff; |
|
689 |
stw(env->segs[R_SS].base + offset, T0); |
|
690 |
/* modify ESP after to handle exceptions correctly */ |
|
691 |
ESP = (ESP & ~0xffff) | offset; |
|
692 |
} |
|
693 |
|
|
694 |
/* NOTE: ESP update is done after */ |
|
695 |
void op_popl_T0(void) |
|
696 |
{ |
|
697 |
T0 = ldl((void *)ESP); |
|
698 |
} |
|
699 |
|
|
700 |
void op_popw_T0(void) |
|
701 |
{ |
|
702 |
T0 = lduw((void *)ESP); |
|
703 |
} |
|
704 |
|
|
705 |
void op_popl_ss32_T0(void) |
|
706 |
{ |
|
707 |
T0 = ldl(env->segs[R_SS].base + ESP); |
|
708 |
} |
|
642 |
/* push/pop utils */ |
|
709 | 643 |
|
710 |
void op_popw_ss32_T0(void)
|
|
644 |
void op_addl_A0_SS(void)
|
|
711 | 645 |
{ |
712 |
T0 = lduw(env->segs[R_SS].base + ESP);
|
|
646 |
A0 += (long)env->segs[R_SS].base;
|
|
713 | 647 |
} |
714 | 648 |
|
715 |
void op_popl_ss16_T0(void)
|
|
649 |
void op_subl_A0_2(void)
|
|
716 | 650 |
{ |
717 |
T0 = ldl(env->segs[R_SS].base + (ESP & 0xffff));
|
|
651 |
A0 -= 2;
|
|
718 | 652 |
} |
719 | 653 |
|
720 |
void op_popw_ss16_T0(void)
|
|
654 |
void op_subl_A0_4(void)
|
|
721 | 655 |
{ |
722 |
T0 = lduw(env->segs[R_SS].base + (ESP & 0xffff));
|
|
656 |
A0 -= 4;
|
|
723 | 657 |
} |
724 | 658 |
|
725 | 659 |
void op_addl_ESP_4(void) |
Also available in: Unified diff