Commit f513a41a3db60c27c25147730e3a2bd6290bf622
1 parent
c106152d
finished simplifying string operations
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@379 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
52 additions
and
126 deletions
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 */ | ... | ... |