Revision f513a41a
b/op-i386.c | ||
---|---|---|
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 | 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 |
{ |
/dev/null | ||
---|---|---|
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 |
b/ops_template.h | ||
---|---|---|
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 | 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 | 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 */ |
Also available in: Unified diff