*/
#define DATA_BITS (1 << (3 + SHIFT))
#define SHIFT_MASK (DATA_BITS - 1)
-#define SIGN_MASK (1 << (DATA_BITS - 1))
+#define SIGN_MASK (((target_ulong)1) << (DATA_BITS - 1))
+#if DATA_BITS <= 32
+#define SHIFT1_MASK 0x1f
+#else
+#define SHIFT1_MASK 0x3f
+#endif
#if DATA_BITS == 8
#define SUFFIX b
#define DATA_TYPE uint32_t
#define DATA_STYPE int32_t
#define DATA_MASK 0xffffffff
+#elif DATA_BITS == 64
+#define SUFFIX q
+#define DATA_TYPE uint64_t
+#define DATA_STYPE int64_t
+#define DATA_MASK 0xffffffffffffffffULL
#else
#error unhandled operand size
#endif
static int glue(compute_all_add, SUFFIX)(void)
{
int cf, pf, af, zf, sf, of;
- int src1, src2;
+ target_long src1, src2;
src1 = CC_SRC;
src2 = CC_DST - CC_SRC;
cf = (DATA_TYPE)CC_DST < (DATA_TYPE)src1;
static int glue(compute_c_add, SUFFIX)(void)
{
- int src1, cf;
+ int cf;
+ target_long src1;
src1 = CC_SRC;
cf = (DATA_TYPE)CC_DST < (DATA_TYPE)src1;
return cf;
static int glue(compute_all_adc, SUFFIX)(void)
{
int cf, pf, af, zf, sf, of;
- int src1, src2;
+ target_long src1, src2;
src1 = CC_SRC;
src2 = CC_DST - CC_SRC - 1;
cf = (DATA_TYPE)CC_DST <= (DATA_TYPE)src1;
static int glue(compute_c_adc, SUFFIX)(void)
{
- int src1, cf;
+ int cf;
+ target_long src1;
src1 = CC_SRC;
cf = (DATA_TYPE)CC_DST <= (DATA_TYPE)src1;
return cf;
static int glue(compute_all_sub, SUFFIX)(void)
{
int cf, pf, af, zf, sf, of;
- int src1, src2;
+ target_long src1, src2;
src1 = CC_DST + CC_SRC;
src2 = CC_SRC;
cf = (DATA_TYPE)src1 < (DATA_TYPE)src2;
static int glue(compute_c_sub, SUFFIX)(void)
{
- int src1, src2, cf;
+ int cf;
+ target_long src1, src2;
src1 = CC_DST + CC_SRC;
src2 = CC_SRC;
cf = (DATA_TYPE)src1 < (DATA_TYPE)src2;
static int glue(compute_all_sbb, SUFFIX)(void)
{
int cf, pf, af, zf, sf, of;
- int src1, src2;
+ target_long src1, src2;
src1 = CC_DST + CC_SRC + 1;
src2 = CC_SRC;
cf = (DATA_TYPE)src1 <= (DATA_TYPE)src2;
static int glue(compute_c_sbb, SUFFIX)(void)
{
- int src1, src2, cf;
+ int cf;
+ target_long src1, src2;
src1 = CC_DST + CC_SRC + 1;
src2 = CC_SRC;
cf = (DATA_TYPE)src1 <= (DATA_TYPE)src2;
static int glue(compute_all_inc, SUFFIX)(void)
{
int cf, pf, af, zf, sf, of;
- int src1, src2;
+ target_long src1, src2;
src1 = CC_DST - 1;
src2 = 1;
cf = CC_SRC;
static int glue(compute_all_dec, SUFFIX)(void)
{
int cf, pf, af, zf, sf, of;
- int src1, src2;
+ target_long src1, src2;
src1 = CC_DST + 1;
src2 = 1;
cf = CC_SRC;
af = (CC_DST ^ src1 ^ src2) & 0x10;
zf = ((DATA_TYPE)CC_DST == 0) << 6;
sf = lshift(CC_DST, 8 - DATA_BITS) & 0x80;
- of = ((CC_DST & DATA_MASK) == ((uint32_t)SIGN_MASK - 1)) << 11;
+ of = ((CC_DST & DATA_MASK) == ((target_ulong)SIGN_MASK - 1)) << 11;
return cf | pf | af | zf | sf | of;
}
void OPPROTO glue(op_jb_sub, SUFFIX)(void)
{
- int src1, src2;
+ target_long src1, src2;
src1 = CC_DST + CC_SRC;
src2 = CC_SRC;
if ((DATA_TYPE)src1 < (DATA_TYPE)src2)
- JUMP_TB(glue(op_jb_sub, SUFFIX), PARAM1, 0, PARAM2);
- else
- JUMP_TB(glue(op_jb_sub, SUFFIX), PARAM1, 1, PARAM3);
+ GOTO_LABEL_PARAM(1);
FORCE_RET();
}
void OPPROTO glue(op_jz_sub, SUFFIX)(void)
{
if ((DATA_TYPE)CC_DST == 0)
- JUMP_TB(glue(op_jz_sub, SUFFIX), PARAM1, 0, PARAM2);
- else
- JUMP_TB(glue(op_jz_sub, SUFFIX), PARAM1, 1, PARAM3);
+ GOTO_LABEL_PARAM(1);
+ FORCE_RET();
+}
+
+void OPPROTO glue(op_jnz_sub, SUFFIX)(void)
+{
+ if ((DATA_TYPE)CC_DST != 0)
+ GOTO_LABEL_PARAM(1);
FORCE_RET();
}
void OPPROTO glue(op_jbe_sub, SUFFIX)(void)
{
- int src1, src2;
+ target_long src1, src2;
src1 = CC_DST + CC_SRC;
src2 = CC_SRC;
if ((DATA_TYPE)src1 <= (DATA_TYPE)src2)
- JUMP_TB(glue(op_jbe_sub, SUFFIX), PARAM1, 0, PARAM2);
- else
- JUMP_TB(glue(op_jbe_sub, SUFFIX), PARAM1, 1, PARAM3);
+ GOTO_LABEL_PARAM(1);
FORCE_RET();
}
void OPPROTO glue(op_js_sub, SUFFIX)(void)
{
if (CC_DST & SIGN_MASK)
- JUMP_TB(glue(op_js_sub, SUFFIX), PARAM1, 0, PARAM2);
- else
- JUMP_TB(glue(op_js_sub, SUFFIX), PARAM1, 1, PARAM3);
+ GOTO_LABEL_PARAM(1);
FORCE_RET();
}
void OPPROTO glue(op_jl_sub, SUFFIX)(void)
{
- int src1, src2;
+ target_long src1, src2;
src1 = CC_DST + CC_SRC;
src2 = CC_SRC;
if ((DATA_STYPE)src1 < (DATA_STYPE)src2)
- JUMP_TB(glue(op_jl_sub, SUFFIX), PARAM1, 0, PARAM2);
- else
- JUMP_TB(glue(op_jl_sub, SUFFIX), PARAM1, 1, PARAM3);
+ GOTO_LABEL_PARAM(1);
FORCE_RET();
}
void OPPROTO glue(op_jle_sub, SUFFIX)(void)
{
- int src1, src2;
+ target_long src1, src2;
src1 = CC_DST + CC_SRC;
src2 = CC_SRC;
if ((DATA_STYPE)src1 <= (DATA_STYPE)src2)
- JUMP_TB(glue(op_jle_sub, SUFFIX), PARAM1, 0, PARAM2);
- else
- JUMP_TB(glue(op_jle_sub, SUFFIX), PARAM1, 1, PARAM3);
+ GOTO_LABEL_PARAM(1);
FORCE_RET();
}
void OPPROTO glue(op_loopnz, SUFFIX)(void)
{
- unsigned int tmp;
- int eflags;
- eflags = cc_table[CC_OP].compute_all();
- tmp = (ECX - 1) & DATA_MASK;
- ECX = (ECX & ~DATA_MASK) | tmp;
- if (tmp != 0 && !(eflags & CC_Z))
- EIP = PARAM1;
- else
- EIP = PARAM2;
+ if ((DATA_TYPE)ECX != 0 && !(T0 & CC_Z))
+ GOTO_LABEL_PARAM(1);
FORCE_RET();
}
void OPPROTO glue(op_loopz, SUFFIX)(void)
{
- unsigned int tmp;
- int eflags;
- eflags = cc_table[CC_OP].compute_all();
- tmp = (ECX - 1) & DATA_MASK;
- ECX = (ECX & ~DATA_MASK) | tmp;
- if (tmp != 0 && (eflags & CC_Z))
- EIP = PARAM1;
- else
- EIP = PARAM2;
+ if ((DATA_TYPE)ECX != 0 && (T0 & CC_Z))
+ GOTO_LABEL_PARAM(1);
FORCE_RET();
}
-void OPPROTO glue(op_loop, SUFFIX)(void)
+void OPPROTO glue(op_jz_ecx, SUFFIX)(void)
{
- unsigned int tmp;
- tmp = (ECX - 1) & DATA_MASK;
- ECX = (ECX & ~DATA_MASK) | tmp;
- if (tmp != 0)
- EIP = PARAM1;
- else
- EIP = PARAM2;
+ if ((DATA_TYPE)ECX == 0)
+ GOTO_LABEL_PARAM(1);
FORCE_RET();
}
-void OPPROTO glue(op_jecxz, SUFFIX)(void)
+void OPPROTO glue(op_jnz_ecx, SUFFIX)(void)
{
- if ((DATA_TYPE)ECX == 0)
- EIP = PARAM1;
- else
- EIP = PARAM2;
+ if ((DATA_TYPE)ECX != 0)
+ GOTO_LABEL_PARAM(1);
FORCE_RET();
}
void OPPROTO glue(op_setb_T0_sub, SUFFIX)(void)
{
- int src1, src2;
+ target_long src1, src2;
src1 = CC_DST + CC_SRC;
src2 = CC_SRC;
void OPPROTO glue(op_setbe_T0_sub, SUFFIX)(void)
{
- int src1, src2;
+ target_long src1, src2;
src1 = CC_DST + CC_SRC;
src2 = CC_SRC;
void OPPROTO glue(op_setl_T0_sub, SUFFIX)(void)
{
- int src1, src2;
+ target_long src1, src2;
src1 = CC_DST + CC_SRC;
src2 = CC_SRC;
void OPPROTO glue(op_setle_T0_sub, SUFFIX)(void)
{
- int src1, src2;
+ target_long src1, src2;
src1 = CC_DST + CC_SRC;
src2 = CC_SRC;
void OPPROTO glue(glue(op_shl, SUFFIX), _T0_T1)(void)
{
int count;
- count = T1 & 0x1f;
+ count = T1 & SHIFT1_MASK;
T0 = T0 << count;
FORCE_RET();
}
void OPPROTO glue(glue(op_shr, SUFFIX), _T0_T1)(void)
{
int count;
- count = T1 & 0x1f;
+ count = T1 & SHIFT1_MASK;
T0 &= DATA_MASK;
T0 = T0 >> count;
FORCE_RET();
void OPPROTO glue(glue(op_sar, SUFFIX), _T0_T1)(void)
{
- int count, src;
- count = T1 & 0x1f;
+ int count;
+ target_long src;
+
+ count = T1 & SHIFT1_MASK;
src = (DATA_STYPE)T0;
T0 = src >> count;
FORCE_RET();
int count;
count = T1 & SHIFT_MASK;
T1 = T0 >> count;
- T0 |= (1 << count);
+ T0 |= (((target_long)1) << count);
}
void OPPROTO glue(glue(op_btr, SUFFIX), _T0_T1_cc)(void)
int count;
count = T1 & SHIFT_MASK;
T1 = T0 >> count;
- T0 &= ~(1 << count);
+ T0 &= ~(((target_long)1) << count);
}
void OPPROTO glue(glue(op_btc, SUFFIX), _T0_T1_cc)(void)
int count;
count = T1 & SHIFT_MASK;
T1 = T0 >> count;
- T0 ^= (1 << count);
+ T0 ^= (((target_long)1) << count);
+}
+
+void OPPROTO glue(glue(op_add_bit, SUFFIX), _A0_T1)(void)
+{
+ A0 += ((DATA_STYPE)T1 >> (3 + SHIFT)) << SHIFT;
}
void OPPROTO glue(glue(op_bsf, SUFFIX), _T0_cc)(void)
{
- int res, count;
+ int count;
+ target_long res;
+
res = T0 & DATA_MASK;
if (res != 0) {
count = 0;
count++;
res >>= 1;
}
- T0 = count;
- CC_DST = 1; /* ZF = 1 */
+ T1 = count;
+ CC_DST = 1; /* ZF = 0 */
} else {
CC_DST = 0; /* ZF = 1 */
}
void OPPROTO glue(glue(op_bsr, SUFFIX), _T0_cc)(void)
{
- int res, count;
+ int count;
+ target_long res;
+
res = T0 & DATA_MASK;
if (res != 0) {
count = DATA_BITS - 1;
count--;
res <<= 1;
}
- T0 = count;
- CC_DST = 1; /* ZF = 1 */
+ T1 = count;
+ CC_DST = 1; /* ZF = 0 */
} else {
CC_DST = 0; /* ZF = 1 */
}
T0 = DF << SHIFT;
}
-void OPPROTO glue(op_string_jz_sub, SUFFIX)(void)
-{
- if ((DATA_TYPE)CC_DST == 0)
- JUMP_TB2(glue(op_string_jz_sub, SUFFIX), PARAM1, 3);
- FORCE_RET();
-}
-
-void OPPROTO glue(op_string_jnz_sub, SUFFIX)(void)
-{
- if ((DATA_TYPE)CC_DST != 0)
- JUMP_TB2(glue(op_string_jnz_sub, SUFFIX), PARAM1, 3);
- FORCE_RET();
-}
-
-void OPPROTO glue(glue(op_string_jz_sub, SUFFIX), _im)(void)
-{
- if ((DATA_TYPE)CC_DST == 0) {
- EIP = PARAM1;
- if (env->eflags & TF_MASK) {
- raise_exception(EXCP01_SSTP);
- }
- T0 = 0;
- EXIT_TB();
- }
- FORCE_RET();
-}
-
-void OPPROTO glue(glue(op_string_jnz_sub, SUFFIX), _im)(void)
-{
- if ((DATA_TYPE)CC_DST != 0) {
- EIP = PARAM1;
- if (env->eflags & TF_MASK) {
- raise_exception(EXCP01_SSTP);
- }
- T0 = 0;
- EXIT_TB();
- }
- FORCE_RET();
-}
-
-#if DATA_BITS >= 16
-void OPPROTO glue(op_jz_ecx, SUFFIX)(void)
-{
- if ((DATA_TYPE)ECX == 0)
- JUMP_TB(glue(op_jz_ecx, SUFFIX), PARAM1, 1, PARAM2);
- FORCE_RET();
-}
-
-void OPPROTO glue(glue(op_jz_ecx, SUFFIX), _im)(void)
-{
- if ((DATA_TYPE)ECX == 0) {
- EIP = PARAM1;
- if (env->eflags & TF_MASK) {
- raise_exception(EXCP01_SSTP);
- }
- T0 = 0;
- EXIT_TB();
- }
- FORCE_RET();
-}
-#endif
-
/* port I/O */
-
+#if DATA_BITS <= 32
void OPPROTO glue(glue(op_out, SUFFIX), _T0_T1)(void)
{
glue(cpu_out, SUFFIX)(env, T0, T1 & DATA_MASK);
{
glue(glue(check_io, SUFFIX), _DX)();
}
+#endif
#undef DATA_BITS
#undef SHIFT_MASK
+#undef SHIFT1_MASK
#undef SIGN_MASK
#undef DATA_TYPE
#undef DATA_STYPE