Commit f513a41a3db60c27c25147730e3a2bd6290bf622

Authored by bellard
1 parent c106152d

finished simplifying string operations


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@379 c046a42c-6fe2-441c-8c8c-71466251a162
op-i386.c
@@ -516,9 +516,9 @@ void OPPROTO op_cmpxchg8b(void) @@ -516,9 +516,9 @@ void OPPROTO op_cmpxchg8b(void)
516 helper_cmpxchg8b(); 516 helper_cmpxchg8b();
517 } 517 }
518 518
519 -void OPPROTO op_jmp_tb_next(void) 519 +void OPPROTO op_jmp(void)
520 { 520 {
521 - JUMP_TB(op_jmp_tb_next, PARAM1, 0, PARAM2); 521 + JUMP_TB(op_jmp, PARAM1, 0, PARAM2);
522 } 522 }
523 523
524 void OPPROTO op_movl_T0_0(void) 524 void OPPROTO op_movl_T0_0(void)
@@ -1033,6 +1033,15 @@ void OPPROTO op_jcc(void) @@ -1033,6 +1033,15 @@ void OPPROTO op_jcc(void)
1033 FORCE_RET(); 1033 FORCE_RET();
1034 } 1034 }
1035 1035
  1036 +void OPPROTO op_jcc_im(void)
  1037 +{
  1038 + if (T0)
  1039 + EIP = PARAM1;
  1040 + else
  1041 + EIP = PARAM2;
  1042 + FORCE_RET();
  1043 +}
  1044 +
1036 /* slow set cases (compute x86 flags) */ 1045 /* slow set cases (compute x86 flags) */
1037 void OPPROTO op_seto_T0_cc(void) 1046 void OPPROTO op_seto_T0_cc(void)
1038 { 1047 {
op_string.h deleted 100644 → 0
1 -  
2 -void OPPROTO glue(glue(op_repz_scas, SUFFIX), STRING_SUFFIX)(void)  
3 -{  
4 - int v1, v2, inc;  
5 -  
6 - if (CX != 0) {  
7 - /* NOTE: the flags are not modified if CX == 0 */  
8 - v1 = EAX & DATA_MASK;  
9 - inc = (DF << SHIFT);  
10 - do {  
11 - v2 = glue(ldu, SUFFIX)(DI_ADDR);  
12 - INC_DI();  
13 - DEC_CX();  
14 - if (v1 != v2)  
15 - break;  
16 - } while (CX != 0);  
17 - CC_SRC = v2;  
18 - CC_DST = v1 - v2;  
19 - CC_OP = CC_OP_SUBB + SHIFT;  
20 - }  
21 - FORCE_RET();  
22 -}  
23 -  
24 -void OPPROTO glue(glue(op_repnz_scas, SUFFIX), STRING_SUFFIX)(void)  
25 -{  
26 - int v1, v2, inc;  
27 -  
28 - if (CX != 0) {  
29 - /* NOTE: the flags are not modified if CX == 0 */  
30 - v1 = EAX & DATA_MASK;  
31 - inc = (DF << SHIFT);  
32 - do {  
33 - v2 = glue(ldu, SUFFIX)(DI_ADDR);  
34 - INC_DI();  
35 - DEC_CX();  
36 - if (v1 == v2)  
37 - break;  
38 - } while (CX != 0);  
39 - CC_SRC = v2;  
40 - CC_DST = v1 - v2;  
41 - CC_OP = CC_OP_SUBB + SHIFT;  
42 - }  
43 - FORCE_RET();  
44 -}  
45 -  
46 -void OPPROTO glue(glue(op_repz_cmps, SUFFIX), STRING_SUFFIX)(void)  
47 -{  
48 - int v1, v2, inc;  
49 - if (CX != 0) {  
50 - inc = (DF << SHIFT);  
51 - do {  
52 - v1 = glue(ldu, SUFFIX)(SI_ADDR);  
53 - v2 = glue(ldu, SUFFIX)(DI_ADDR);  
54 - INC_SI();  
55 - INC_DI();  
56 - DEC_CX();  
57 - if (v1 != v2)  
58 - break;  
59 - } while (CX != 0);  
60 - CC_SRC = v2;  
61 - CC_DST = v1 - v2;  
62 - CC_OP = CC_OP_SUBB + SHIFT;  
63 - }  
64 - FORCE_RET();  
65 -}  
66 -  
67 -void OPPROTO glue(glue(op_repnz_cmps, SUFFIX), STRING_SUFFIX)(void)  
68 -{  
69 - int v1, v2, inc;  
70 - if (CX != 0) {  
71 - inc = (DF << SHIFT);  
72 - do {  
73 - v1 = glue(ldu, SUFFIX)(SI_ADDR);  
74 - v2 = glue(ldu, SUFFIX)(DI_ADDR);  
75 - INC_SI();  
76 - INC_DI();  
77 - DEC_CX();  
78 - if (v1 == v2)  
79 - break;  
80 - } while (CX != 0);  
81 - CC_SRC = v2;  
82 - CC_DST = v1 - v2;  
83 - CC_OP = CC_OP_SUBB + SHIFT;  
84 - }  
85 - FORCE_RET();  
86 -}  
87 -  
88 -#undef STRING_SUFFIX  
89 -#undef SI_ADDR  
90 -#undef DI_ADDR  
91 -#undef INC_SI  
92 -#undef INC_DI  
93 -#undef CX  
94 -#undef DEC_CX  
ops_template.h
@@ -518,34 +518,6 @@ void OPPROTO op_update_bt_cc(void) @@ -518,34 +518,6 @@ void OPPROTO op_update_bt_cc(void)
518 #endif 518 #endif
519 519
520 /* string operations */ 520 /* string operations */
521 -/* XXX: maybe use lower level instructions to ease 16 bit / segment handling */  
522 -  
523 -#define STRING_SUFFIX _fast  
524 -#define SI_ADDR (void *)ESI  
525 -#define DI_ADDR (void *)EDI  
526 -#define INC_SI() ESI += inc  
527 -#define INC_DI() EDI += inc  
528 -#define CX ECX  
529 -#define DEC_CX() ECX--  
530 -#include "op_string.h"  
531 -  
532 -#define STRING_SUFFIX _a32  
533 -#define SI_ADDR (uint8_t *)A0 + ESI  
534 -#define DI_ADDR env->segs[R_ES].base + EDI  
535 -#define INC_SI() ESI += inc  
536 -#define INC_DI() EDI += inc  
537 -#define CX ECX  
538 -#define DEC_CX() ECX--  
539 -#include "op_string.h"  
540 -  
541 -#define STRING_SUFFIX _a16  
542 -#define SI_ADDR (uint8_t *)A0 + (ESI & 0xffff)  
543 -#define DI_ADDR env->segs[R_ES].base + (EDI & 0xffff)  
544 -#define INC_SI() ESI = (ESI & ~0xffff) | ((ESI + inc) & 0xffff)  
545 -#define INC_DI() EDI = (EDI & ~0xffff) | ((EDI + inc) & 0xffff)  
546 -#define CX (ECX & 0xffff)  
547 -#define DEC_CX() ECX = (ECX & ~0xffff) | ((ECX - 1) & 0xffff)  
548 -#include "op_string.h"  
549 521
550 void OPPROTO glue(op_movl_T0_Dshift, SUFFIX)(void) 522 void OPPROTO glue(op_movl_T0_Dshift, SUFFIX)(void)
551 { 523 {
@@ -555,14 +527,40 @@ void OPPROTO glue(op_movl_T0_Dshift, SUFFIX)(void) @@ -555,14 +527,40 @@ void OPPROTO glue(op_movl_T0_Dshift, SUFFIX)(void)
555 void OPPROTO glue(op_string_jz_sub, SUFFIX)(void) 527 void OPPROTO glue(op_string_jz_sub, SUFFIX)(void)
556 { 528 {
557 if ((DATA_TYPE)CC_DST == 0) 529 if ((DATA_TYPE)CC_DST == 0)
558 - JUMP_TB(glue(op_string_jz_sub, SUFFIX), PARAM1, 1, PARAM2); 530 + JUMP_TB2(glue(op_string_jz_sub, SUFFIX), PARAM1, 1);
559 FORCE_RET(); 531 FORCE_RET();
560 } 532 }
561 533
562 void OPPROTO glue(op_string_jnz_sub, SUFFIX)(void) 534 void OPPROTO glue(op_string_jnz_sub, SUFFIX)(void)
563 { 535 {
564 if ((DATA_TYPE)CC_DST != 0) 536 if ((DATA_TYPE)CC_DST != 0)
565 - JUMP_TB(glue(op_string_jnz_sub, SUFFIX), PARAM1, 1, PARAM2); 537 + JUMP_TB2(glue(op_string_jnz_sub, SUFFIX), PARAM1, 1);
  538 + FORCE_RET();
  539 +}
  540 +
  541 +void OPPROTO glue(glue(op_string_jz_sub, SUFFIX), _im)(void)
  542 +{
  543 + if ((DATA_TYPE)CC_DST == 0) {
  544 + EIP = PARAM1;
  545 + if (env->eflags & TF_MASK) {
  546 + raise_exception(EXCP01_SSTP);
  547 + }
  548 + T0 = 0;
  549 + EXIT_TB();
  550 + }
  551 + FORCE_RET();
  552 +}
  553 +
  554 +void OPPROTO glue(glue(op_string_jnz_sub, SUFFIX), _im)(void)
  555 +{
  556 + if ((DATA_TYPE)CC_DST != 0) {
  557 + EIP = PARAM1;
  558 + if (env->eflags & TF_MASK) {
  559 + raise_exception(EXCP01_SSTP);
  560 + }
  561 + T0 = 0;
  562 + EXIT_TB();
  563 + }
566 FORCE_RET(); 564 FORCE_RET();
567 } 565 }
568 566
@@ -573,6 +571,19 @@ void OPPROTO glue(op_jz_ecx, SUFFIX)(void) @@ -573,6 +571,19 @@ void OPPROTO glue(op_jz_ecx, SUFFIX)(void)
573 JUMP_TB(glue(op_jz_ecx, SUFFIX), PARAM1, 1, PARAM2); 571 JUMP_TB(glue(op_jz_ecx, SUFFIX), PARAM1, 1, PARAM2);
574 FORCE_RET(); 572 FORCE_RET();
575 } 573 }
  574 +
  575 +void OPPROTO glue(glue(op_jz_ecx, SUFFIX), _im)(void)
  576 +{
  577 + if ((DATA_TYPE)ECX == 0) {
  578 + EIP = PARAM1;
  579 + if (env->eflags & TF_MASK) {
  580 + raise_exception(EXCP01_SSTP);
  581 + }
  582 + T0 = 0;
  583 + EXIT_TB();
  584 + }
  585 + FORCE_RET();
  586 +}
576 #endif 587 #endif
577 588
578 /* port I/O */ 589 /* port I/O */