aboutsummaryrefslogtreecommitdiff
path: root/target-i386/ops_template.h
diff options
context:
space:
mode:
authorbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2005-01-03 23:50:08 +0000
committerbellard <bellard@c046a42c-6fe2-441c-8c8c-71466251a162>2005-01-03 23:50:08 +0000
commit14ce26e755135e80f3726d42a5a887723d615291 (patch)
tree6d8f3631c3489af3d64182a016e64e55179ab53a /target-i386/ops_template.h
parentc46878786af930f8f06695371ee80ffa8acf98ef (diff)
x86_64 target support
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@1197 c046a42c-6fe2-441c-8c8c-71466251a162
Diffstat (limited to 'target-i386/ops_template.h')
-rw-r--r--target-i386/ops_template.h217
1 files changed, 80 insertions, 137 deletions
diff --git a/target-i386/ops_template.h b/target-i386/ops_template.h
index 2ff1f66648..044968a2ca 100644
--- a/target-i386/ops_template.h
+++ b/target-i386/ops_template.h
@@ -20,7 +20,12 @@
*/
#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
@@ -37,6 +42,11 @@
#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 0xffffffffffffffff
#else
#error unhandled operand size
#endif
@@ -46,7 +56,7 @@
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;
@@ -60,7 +70,8 @@ static int glue(compute_all_add, SUFFIX)(void)
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;
@@ -69,7 +80,7 @@ static int glue(compute_c_add, SUFFIX)(void)
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;
@@ -83,7 +94,8 @@ static int glue(compute_all_adc, SUFFIX)(void)
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;
@@ -92,7 +104,7 @@ static int glue(compute_c_adc, SUFFIX)(void)
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;
@@ -106,7 +118,8 @@ static int glue(compute_all_sub, SUFFIX)(void)
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;
@@ -116,7 +129,7 @@ static int glue(compute_c_sub, SUFFIX)(void)
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;
@@ -130,7 +143,8 @@ static int glue(compute_all_sbb, SUFFIX)(void)
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;
@@ -157,7 +171,7 @@ static int glue(compute_c_logic, SUFFIX)(void)
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;
@@ -179,7 +193,7 @@ static int glue(compute_c_inc, SUFFIX)(void)
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;
@@ -187,7 +201,7 @@ static int glue(compute_all_dec, SUFFIX)(void)
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;
}
@@ -256,71 +270,66 @@ static int glue(compute_all_mul, SUFFIX)(void)
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();
}
@@ -330,50 +339,33 @@ void OPPROTO glue(op_jle_sub, SUFFIX)(void)
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 && !(eflags & 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 && (eflags & 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();
}
@@ -383,7 +375,7 @@ void OPPROTO glue(op_jecxz, SUFFIX)(void)
void OPPROTO glue(op_setb_T0_sub, SUFFIX)(void)
{
- int src1, src2;
+ target_long src1, src2;
src1 = CC_DST + CC_SRC;
src2 = CC_SRC;
@@ -397,7 +389,7 @@ void OPPROTO glue(op_setz_T0_sub, SUFFIX)(void)
void OPPROTO glue(op_setbe_T0_sub, SUFFIX)(void)
{
- int src1, src2;
+ target_long src1, src2;
src1 = CC_DST + CC_SRC;
src2 = CC_SRC;
@@ -411,7 +403,7 @@ void OPPROTO glue(op_sets_T0_sub, SUFFIX)(void)
void OPPROTO glue(op_setl_T0_sub, SUFFIX)(void)
{
- int src1, src2;
+ target_long src1, src2;
src1 = CC_DST + CC_SRC;
src2 = CC_SRC;
@@ -420,7 +412,7 @@ void OPPROTO glue(op_setl_T0_sub, SUFFIX)(void)
void OPPROTO glue(op_setle_T0_sub, SUFFIX)(void)
{
- int src1, src2;
+ target_long src1, src2;
src1 = CC_DST + CC_SRC;
src2 = CC_SRC;
@@ -432,7 +424,7 @@ void OPPROTO glue(op_setle_T0_sub, SUFFIX)(void)
void OPPROTO glue(glue(op_shl, SUFFIX), _T0_T1)(void)
{
int count;
- count = T1 & 0x1f;
+ count = T1 & SHIFT1_MASK;
T0 = T0 << count;
FORCE_RET();
}
@@ -440,7 +432,7 @@ void OPPROTO glue(glue(op_shl, SUFFIX), _T0_T1)(void)
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();
@@ -448,8 +440,10 @@ void OPPROTO glue(glue(op_shr, SUFFIX), _T0_T1)(void)
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();
@@ -484,7 +478,7 @@ void OPPROTO glue(glue(op_bts, 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_btr, SUFFIX), _T0_T1_cc)(void)
@@ -492,7 +486,7 @@ 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)
@@ -500,12 +494,19 @@ 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;
@@ -523,7 +524,9 @@ void OPPROTO glue(glue(op_bsf, SUFFIX), _T0_cc)(void)
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;
@@ -555,70 +558,8 @@ void OPPROTO glue(op_movl_T0_Dshift, SUFFIX)(void)
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);
@@ -648,9 +589,11 @@ void OPPROTO glue(glue(op_check_io, SUFFIX), _DX)(void)
{
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