// The OS/K Team licenses this file to you under the MIT license. // See the LICENSE file in the project root for more information. #include //----------------------------------------------------------------------------// #define STR_MOVE(reg, len) \ if ((rfx & DF) == 0) \ R(reg) += len; \ else \ R(reg) -= len; //----------------------------------------------------------------------------// static void stos_impl(ctx_t *ctx, acc_t *p1, acc_t *p2, uint len) { DECV(v2, p2); writemem(ctx, v2, R(p1->reg), len); STR_MOVE(p1->reg, len); } IMPL_START_0(stosb) { stos_impl(ctx, p1, p2, 1); } IMPL_END; IMPL_START_0(stosw) { stos_impl(ctx, p1, p2, 2); } IMPL_END; IMPL_START_0(stosl) { stos_impl(ctx, p1, p2, 4); } IMPL_END; IMPL_START_0(stosq) { stos_impl(ctx, p1, p2, 8); } IMPL_END; //----------------------------------------------------------------------------// static void lods_impl(ctx_t *ctx, acc_t *p1, acc_t *p2, uint len) { R(p1->reg) = readmem(ctx, R(p2->reg), len); R(RFX) = (R(p1->reg) == 0 ? R(RFX)|ZF : R(RFX)&~ZF); STR_MOVE(p2->reg, len); } IMPL_START_0(lodsb) { lods_impl(ctx, p1, p2, 1); } IMPL_END; IMPL_START_0(lodsw) { lods_impl(ctx, p1, p2, 2); } IMPL_END; IMPL_START_0(lodsl) { lods_impl(ctx, p1, p2, 4); } IMPL_END; IMPL_START_0(lodsq) { lods_impl(ctx, p1, p2, 8); } IMPL_END; //----------------------------------------------------------------------------// static void scas_impl(ctx_t *ctx, acc_t *p1, acc_t *p2, uint len) { DECV(v2, p2); ulong x = readmem(ctx, R(p1->reg), len); COMPARE(x, v2); if (x == 0) { R(RFX) |= ZF; } else if (!(R(RFX)&ZF)) { STR_MOVE(p1->reg, len); } } IMPL_START_0(scasb) { scas_impl(ctx, p1, p2, 1); } IMPL_END; IMPL_START_0(scasw) { scas_impl(ctx, p1, p2, 2); } IMPL_END; IMPL_START_0(scasl) { scas_impl(ctx, p1, p2, 4); } IMPL_END; IMPL_START_0(scasq) { scas_impl(ctx, p1, p2, 8); } IMPL_END; //----------------------------------------------------------------------------// static void cmps_impl(ctx_t *ctx, acc_t *p1, acc_t *p2, uint len) { ulong x1 = readmem(ctx, R(p1->reg), len); ulong x2 = readmem(ctx, R(p2->reg), len); COMPARE(x1, x2); STR_MOVE(p1->reg, len); STR_MOVE(p2->reg, len); } IMPL_START_0(cmpsb) { cmps_impl(ctx, p1, p2, 1); } IMPL_END; IMPL_START_0(cmpsw) { cmps_impl(ctx, p1, p2, 2); } IMPL_END; IMPL_START_0(cmpsl) { cmps_impl(ctx, p1, p2, 4); } IMPL_END; IMPL_START_0(cmpsq) { cmps_impl(ctx, p1, p2, 8); } IMPL_END; //----------------------------------------------------------------------------// static void cmpzs_impl(ctx_t *ctx, acc_t *p1, acc_t *p2, uint len) { ulong x1 = readmem(ctx, R(p1->reg), len); ulong x2 = readmem(ctx, R(p2->reg), len); COMPARE(x1, x2); if (!x1 && !x2) R(RFX) &= ~ZF; STR_MOVE(p1->reg, len); STR_MOVE(p2->reg, len); } IMPL_START_0(cmpzsb) { cmpzs_impl(ctx, p1, p2, 1); } IMPL_END; IMPL_START_0(cmpzsw) { cmpzs_impl(ctx, p1, p2, 2); } IMPL_END; IMPL_START_0(cmpzsl) { cmpzs_impl(ctx, p1, p2, 4); } IMPL_END; IMPL_START_0(cmpzsq) { cmpzs_impl(ctx, p1, p2, 8); } IMPL_END; //----------------------------------------------------------------------------// static void movs_impl(ctx_t *ctx, acc_t *p1, acc_t *p2, uint len) { ulong x = readmem(ctx, R(p2->reg), len); writemem(ctx, x, R(p1->reg), len); R(RFX) = (x == 0 ? R(RFX)|ZF : R(RFX)&~ZF); STR_MOVE(p1->reg, len); STR_MOVE(p2->reg, len); } IMPL_START_0(movsb) { movs_impl(ctx, p1, p2, 1); } IMPL_END; IMPL_START_0(movsw) { movs_impl(ctx, p1, p2, 2); } IMPL_END; IMPL_START_0(movsl) { movs_impl(ctx, p1, p2, 4); } IMPL_END; IMPL_START_0(movsq) { movs_impl(ctx, p1, p2, 8); } IMPL_END; //----------------------------------------------------------------------------//