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 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 524 void OPPROTO op_movl_T0_0(void)
... ... @@ -1033,6 +1033,15 @@ void OPPROTO op_jcc(void)
1033 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 1045 /* slow set cases (compute x86 flags) */
1037 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 518 #endif
519 519  
520 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 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 527 void OPPROTO glue(op_string_jz_sub, SUFFIX)(void)
556 528 {
557 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 531 FORCE_RET();
560 532 }
561 533  
562 534 void OPPROTO glue(op_string_jnz_sub, SUFFIX)(void)
563 535 {
564 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 564 FORCE_RET();
567 565 }
568 566  
... ... @@ -573,6 +571,19 @@ void OPPROTO glue(op_jz_ecx, SUFFIX)(void)
573 571 JUMP_TB(glue(op_jz_ecx, SUFFIX), PARAM1, 1, PARAM2);
574 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 587 #endif
577 588  
578 589 /* port I/O */
... ...