diff options
author | pbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-06-09 20:50:01 +0000 |
---|---|---|
committer | pbrook <pbrook@c046a42c-6fe2-441c-8c8c-71466251a162> | 2007-06-09 20:50:01 +0000 |
commit | 06d92f40a120eca9ba431be5a190186cb8f3fab3 (patch) | |
tree | 610098ff042811ebe73d3a07a7b11cd2365c834a /target-m68k | |
parent | 0cf5c6771b216793d1fe57d25864d842570f32f6 (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
Diffstat (limited to 'target-m68k')
-rw-r--r-- | target-m68k/op-hacks.h | 25 | ||||
-rw-r--r-- | target-m68k/op.c | 29 |
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(); } |