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 = v2; 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 = v2; CC_DST = v1 - v2; CC_OP = CC_OP_SUBB + SHIFT; } FORCE_RET(); } 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 = v2; 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 = v2; CC_DST = v1 - v2; CC_OP = CC_OP_SUBB + SHIFT; } FORCE_RET(); } #undef STRING_SUFFIX #undef SI_ADDR #undef DI_ADDR #undef INC_SI #undef INC_DI #undef CX #undef DEC_CX