mirror of https://gitee.com/openkylin/qemu.git
246 lines
5.1 KiB
C
246 lines
5.1 KiB
C
|
|
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
|