
void OPPROTO glue(glue(op_movs, SUFFIX), STRING_SUFFIX)(void)
{
    int v, inc;
    inc = (DF << SHIFT);
    v = glue(ldu, SUFFIX)(SI_ADDR);
    glue(st, SUFFIX)(DI_ADDR, v);
    inc = (DF << SHIFT);
    INC_SI();
    INC_DI();
}

void OPPROTO glue(glue(op_rep_movs, SUFFIX), STRING_SUFFIX)(void)
{
    int v, inc;
    inc = (DF << SHIFT);
    while (CX != 0) {
        v = glue(ldu, SUFFIX)(SI_ADDR);
        glue(st, SUFFIX)(DI_ADDR, v);
        INC_SI();
        INC_DI();
        DEC_CX();
    }
    FORCE_RET();
}

void OPPROTO glue(glue(op_stos, SUFFIX), STRING_SUFFIX)(void)
{
    int inc;
    glue(st, SUFFIX)(DI_ADDR, EAX);
    inc = (DF << SHIFT);
    INC_DI();
}

void OPPROTO glue(glue(op_rep_stos, SUFFIX), STRING_SUFFIX)(void)
{
    int inc;
    inc = (DF << SHIFT);
    while (CX != 0) {
        glue(st, SUFFIX)(DI_ADDR, EAX);
        INC_DI();
        DEC_CX();
    }
    FORCE_RET();
}

void OPPROTO glue(glue(op_lods, SUFFIX), STRING_SUFFIX)(void)
{
    int v, inc;
    v = glue(ldu, SUFFIX)(SI_ADDR);
#if SHIFT == 0
    EAX = (EAX & ~0xff) | v;
#elif SHIFT == 1
    EAX = (EAX & ~0xffff) | v;
#else
    EAX = v;
#endif
    inc = (DF << SHIFT);
    INC_SI();
}

/* don't know if it is used */
void OPPROTO glue(glue(op_rep_lods, SUFFIX), STRING_SUFFIX)(void)
{
    int v, inc;
    inc = (DF << SHIFT);
    while (CX != 0) {
        v = glue(ldu, SUFFIX)(SI_ADDR);
#if SHIFT == 0
        EAX = (EAX & ~0xff) | v;
#elif SHIFT == 1
        EAX = (EAX & ~0xffff) | v;
#else
        EAX = v;
#endif
        INC_SI();
        DEC_CX();
    }
    FORCE_RET();
}

void OPPROTO glue(glue(op_scas, SUFFIX), STRING_SUFFIX)(void)
{
    int v, inc;

    v = glue(ldu, SUFFIX)(DI_ADDR);
    inc = (DF << SHIFT);
    INC_DI();
    CC_SRC = EAX;
    CC_DST = EAX - v;
}

void OPPROTO glue(glue(op_repz_scas, SUFFIX), STRING_SUFFIX)(void)
{
    int v1, v2, inc;

    if (CX != 0) {
        /* NOTE: the flags are not modified if CX == 0 */
        v1 = EAX & DATA_MASK;
        inc = (DF << SHIFT);
        do {
            v2 = glue(ldu, SUFFIX)(DI_ADDR);
            INC_DI();
            DEC_CX();
            if (v1 != v2)
                break;
        } while (CX != 0);
        CC_SRC = v1;
        CC_DST = v1 - v2;
        CC_OP = CC_OP_SUBB + SHIFT;
    }
    FORCE_RET();
}

void OPPROTO glue(glue(op_repnz_scas, SUFFIX), STRING_SUFFIX)(void)
{
    int v1, v2, inc;

    if (CX != 0) {
        /* NOTE: the flags are not modified if CX == 0 */
        v1 = EAX & DATA_MASK;
        inc = (DF << SHIFT);
        do {
            v2 = glue(ldu, SUFFIX)(DI_ADDR);
            INC_DI();
            DEC_CX();
            if (v1 == v2)
                break;
        } while (CX != 0);
        CC_SRC = v1;
        CC_DST = v1 - v2;
        CC_OP = CC_OP_SUBB + SHIFT;
    }
    FORCE_RET();
}

void OPPROTO glue(glue(op_cmps, SUFFIX), STRING_SUFFIX)(void)
{
    int v1, v2, inc;
    v1 = glue(ldu, SUFFIX)(SI_ADDR);
    v2 = glue(ldu, SUFFIX)(DI_ADDR);
    inc = (DF << SHIFT);
    INC_SI();
    INC_DI();
    CC_SRC = v1;
    CC_DST = v1 - v2;
}

void OPPROTO glue(glue(op_repz_cmps, SUFFIX), STRING_SUFFIX)(void)
{
    int v1, v2, inc;
    if (CX != 0) {
        inc = (DF << SHIFT);
        do {
            v1 = glue(ldu, SUFFIX)(SI_ADDR);
            v2 = glue(ldu, SUFFIX)(DI_ADDR);
            INC_SI();
            INC_DI();
            DEC_CX();
            if (v1 != v2)
                break;
        } while (CX != 0);
        CC_SRC = v1;
        CC_DST = v1 - v2;
        CC_OP = CC_OP_SUBB + SHIFT;
    }
    FORCE_RET();
}

void OPPROTO glue(glue(op_repnz_cmps, SUFFIX), STRING_SUFFIX)(void)
{
    int v1, v2, inc;
    if (CX != 0) {
        inc = (DF << SHIFT);
        do {
            v1 = glue(ldu, SUFFIX)(SI_ADDR);
            v2 = glue(ldu, SUFFIX)(DI_ADDR);
            INC_SI();
            INC_DI();
            DEC_CX();
            if (v1 == v2)
                break;
        } while (CX != 0);
        CC_SRC = v1;
        CC_DST = v1 - v2;
        CC_OP = CC_OP_SUBB + SHIFT;
    }
    FORCE_RET();
}

void OPPROTO glue(glue(op_outs, SUFFIX), STRING_SUFFIX)(void)
{
    int v, dx, inc;
    dx = EDX & 0xffff;
    v = glue(ldu, SUFFIX)(SI_ADDR);
    glue(cpu_x86_out, SUFFIX)(dx, v);
    inc = (DF << SHIFT);
    INC_SI();
}

void OPPROTO glue(glue(op_rep_outs, SUFFIX), STRING_SUFFIX)(void)
{
    int v, dx, inc;
    inc = (DF << SHIFT);
    dx = EDX & 0xffff;
    while (CX != 0) {
        v = glue(ldu, SUFFIX)(SI_ADDR);
        glue(cpu_x86_out, SUFFIX)(dx, v);
        INC_SI();
        DEC_CX();
    }
    FORCE_RET();
}

void OPPROTO glue(glue(op_ins, SUFFIX), STRING_SUFFIX)(void)
{
    int v, dx, inc;
    dx = EDX & 0xffff;
    v = glue(cpu_x86_in, SUFFIX)(dx);
    glue(st, SUFFIX)(DI_ADDR, v);
    inc = (DF << SHIFT);
    INC_DI();
}

void OPPROTO glue(glue(op_rep_ins, SUFFIX), STRING_SUFFIX)(void)
{
    int v, dx, inc;
    inc = (DF << SHIFT);
    dx = EDX & 0xffff;
    while (CX != 0) {
        v = glue(cpu_x86_in, SUFFIX)(dx);
        glue(st, SUFFIX)(DI_ADDR, v);
        INC_DI();
        DEC_CX();
    }
    FORCE_RET();
}

#undef STRING_SUFFIX
#undef SI_ADDR
#undef DI_ADDR
#undef INC_SI
#undef INC_DI
#undef CX
#undef DEC_CX
