Revision f513a41a ops_template.h

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