Commit f68dd770075ca35630f8070ddbcef50ceb3b5a27

Authored by bellard
1 parent 436d8b89

fixed word bit operations with memory offset - suppressed push/pop micro operations


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@507 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 14 additions and 80 deletions
target-i386/op.c
@@ -17,6 +17,10 @@ @@ -17,6 +17,10 @@
17 * License along with this library; if not, write to the Free Software 17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 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 #include "exec.h" 24 #include "exec.h"
21 25
22 /* n must be a constant to be efficient */ 26 /* n must be a constant to be efficient */
@@ -392,10 +396,10 @@ void OPPROTO op_andl_A0_ffff(void) @@ -392,10 +396,10 @@ void OPPROTO op_andl_A0_ffff(void)
392 #include "ops_mem.h" 396 #include "ops_mem.h"
393 397
394 #if !defined(CONFIG_USER_ONLY) 398 #if !defined(CONFIG_USER_ONLY)
395 -#define MEMSUFFIX _user 399 +#define MEMSUFFIX _kernel
396 #include "ops_mem.h" 400 #include "ops_mem.h"
397 401
398 -#define MEMSUFFIX _kernel 402 +#define MEMSUFFIX _user
399 #include "ops_mem.h" 403 #include "ops_mem.h"
400 #endif 404 #endif
401 405
@@ -403,7 +407,7 @@ void OPPROTO op_andl_A0_ffff(void) @@ -403,7 +407,7 @@ void OPPROTO op_andl_A0_ffff(void)
403 407
404 void OPPROTO op_add_bitw_A0_T1(void) 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 void OPPROTO op_add_bitl_A0_T1(void) 413 void OPPROTO op_add_bitl_A0_T1(void)
@@ -635,91 +639,21 @@ void OPPROTO op_decw_ECX(void) @@ -635,91 +639,21 @@ void OPPROTO op_decw_ECX(void)
635 ECX = (ECX & ~0xffff) | ((ECX - 1) & 0xffff); 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 void op_addl_ESP_4(void) 659 void op_addl_ESP_4(void)