aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162>2007-06-09 20:50:01 +0000
committerpbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162>2007-06-09 20:50:01 +0000
commit06d92f40a120eca9ba431be5a190186cb8f3fab3 (patch)
tree610098ff042811ebe73d3a07a7b11cd2365c834a
parent0cf5c6771b216793d1fe57d25864d842570f32f6 (diff)
Workaround dyngen problems with m68k conditional branch ops.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2968 c046a42c-6fe2-441c-8c8c-71466251a162
-rw-r--r--target-m68k/op-hacks.h25
-rw-r--r--target-m68k/op.c29
2 files changed, 40 insertions, 14 deletions
diff --git a/target-m68k/op-hacks.h b/target-m68k/op-hacks.h
index 01a158d83e..7bf345c2c9 100644
--- a/target-m68k/op-hacks.h
+++ b/target-m68k/op-hacks.h
@@ -103,3 +103,28 @@ static inline void gen_op_goto_tb(int dummy, int n, long tb)
gen_op_goto_tb1(TBPARAM(tb));
}
}
+
+static inline void gen_op_jmp_z32(int val, int label)
+{
+ gen_op_set_T0_z32(val);
+ gen_op_jmp_T0(label);
+}
+
+static inline void gen_op_jmp_nz32(int val, int label)
+{
+ gen_op_set_T0_nz32(val);
+ gen_op_jmp_T0(label);
+}
+
+static inline void gen_op_jmp_s32(int val, int label)
+{
+ gen_op_set_T0_s32(val);
+ gen_op_jmp_T0(label);
+}
+
+static inline void gen_op_jmp_ns32(int val, int label)
+{
+ gen_op_set_T0_ns32(val);
+ gen_op_jmp_T0(label);
+}
+
diff --git a/target-m68k/op.c b/target-m68k/op.c
index 466fdc2342..e5e39c2fde 100644
--- a/target-m68k/op.c
+++ b/target-m68k/op.c
@@ -487,37 +487,38 @@ OP(jmp)
GOTO_LABEL_PARAM(1);
}
-/* These ops involve a function call, which probably requires a stack frame
- and breaks things on some hosts. */
-OP(jmp_z32)
+OP(set_T0_z32)
{
uint32_t arg = get_op(PARAM1);
- if (arg == 0)
- GOTO_LABEL_PARAM(2);
+ T0 = (arg == 0);
FORCE_RET();
}
-OP(jmp_nz32)
+OP(set_T0_nz32)
{
uint32_t arg = get_op(PARAM1);
- if (arg != 0)
- GOTO_LABEL_PARAM(2);
+ T0 = (arg != 0);
FORCE_RET();
}
-OP(jmp_s32)
+OP(set_T0_s32)
{
int32_t arg = get_op(PARAM1);
- if (arg < 0)
- GOTO_LABEL_PARAM(2);
+ T0 = (arg > 0);
FORCE_RET();
}
-OP(jmp_ns32)
+OP(set_T0_ns32)
{
int32_t arg = get_op(PARAM1);
- if (arg >= 0)
- GOTO_LABEL_PARAM(2);
+ T0 = (arg >= 0);
+ FORCE_RET();
+}
+
+OP(jmp_T0)
+{
+ if (T0)
+ GOTO_LABEL_PARAM(1);
FORCE_RET();
}