518 |
#endif |
#endif |
519 |
|
|
520 |
/* string operations */ |
/* string operations */ |
|
/* XXX: maybe use lower level instructions to ease 16 bit / segment handling */ |
|
|
|
|
|
#define STRING_SUFFIX _fast |
|
|
#define SI_ADDR (void *)ESI |
|
|
#define DI_ADDR (void *)EDI |
|
|
#define INC_SI() ESI += inc |
|
|
#define INC_DI() EDI += inc |
|
|
#define CX ECX |
|
|
#define DEC_CX() ECX-- |
|
|
#include "op_string.h" |
|
|
|
|
|
#define STRING_SUFFIX _a32 |
|
|
#define SI_ADDR (uint8_t *)A0 + ESI |
|
|
#define DI_ADDR env->segs[R_ES].base + EDI |
|
|
#define INC_SI() ESI += inc |
|
|
#define INC_DI() EDI += inc |
|
|
#define CX ECX |
|
|
#define DEC_CX() ECX-- |
|
|
#include "op_string.h" |
|
|
|
|
|
#define STRING_SUFFIX _a16 |
|
|
#define SI_ADDR (uint8_t *)A0 + (ESI & 0xffff) |
|
|
#define DI_ADDR env->segs[R_ES].base + (EDI & 0xffff) |
|
|
#define INC_SI() ESI = (ESI & ~0xffff) | ((ESI + inc) & 0xffff) |
|
|
#define INC_DI() EDI = (EDI & ~0xffff) | ((EDI + inc) & 0xffff) |
|
|
#define CX (ECX & 0xffff) |
|
|
#define DEC_CX() ECX = (ECX & ~0xffff) | ((ECX - 1) & 0xffff) |
|
|
#include "op_string.h" |
|
521 |
|
|
522 |
void OPPROTO glue(op_movl_T0_Dshift, SUFFIX)(void) |
void OPPROTO glue(op_movl_T0_Dshift, SUFFIX)(void) |
523 |
{ |
{ |
527 |
void OPPROTO glue(op_string_jz_sub, SUFFIX)(void) |
void OPPROTO glue(op_string_jz_sub, SUFFIX)(void) |
528 |
{ |
{ |
529 |
if ((DATA_TYPE)CC_DST == 0) |
if ((DATA_TYPE)CC_DST == 0) |
530 |
JUMP_TB(glue(op_string_jz_sub, SUFFIX), PARAM1, 1, PARAM2); |
JUMP_TB2(glue(op_string_jz_sub, SUFFIX), PARAM1, 1); |
531 |
FORCE_RET(); |
FORCE_RET(); |
532 |
} |
} |
533 |
|
|
534 |
void OPPROTO glue(op_string_jnz_sub, SUFFIX)(void) |
void OPPROTO glue(op_string_jnz_sub, SUFFIX)(void) |
535 |
{ |
{ |
536 |
if ((DATA_TYPE)CC_DST != 0) |
if ((DATA_TYPE)CC_DST != 0) |
537 |
JUMP_TB(glue(op_string_jnz_sub, SUFFIX), PARAM1, 1, PARAM2); |
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 |
|
} |
564 |
FORCE_RET(); |
FORCE_RET(); |
565 |
} |
} |
566 |
|
|
571 |
JUMP_TB(glue(op_jz_ecx, SUFFIX), PARAM1, 1, PARAM2); |
JUMP_TB(glue(op_jz_ecx, SUFFIX), PARAM1, 1, PARAM2); |
572 |
FORCE_RET(); |
FORCE_RET(); |
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 |
|
} |
587 |
#endif |
#endif |
588 |
|
|
589 |
/* port I/O */ |
/* port I/O */ |