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