Commit 06d92f40a120eca9ba431be5a190186cb8f3fab3

Authored by pbrook
1 parent 0cf5c677

Workaround dyngen problems with m68k conditional branch ops.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2968 c046a42c-6fe2-441c-8c8c-71466251a162
target-m68k/op-hacks.h
@@ -103,3 +103,28 @@ static inline void gen_op_goto_tb(int dummy, int n, long tb) @@ -103,3 +103,28 @@ static inline void gen_op_goto_tb(int dummy, int n, long tb)
103 gen_op_goto_tb1(TBPARAM(tb)); 103 gen_op_goto_tb1(TBPARAM(tb));
104 } 104 }
105 } 105 }
  106 +
  107 +static inline void gen_op_jmp_z32(int val, int label)
  108 +{
  109 + gen_op_set_T0_z32(val);
  110 + gen_op_jmp_T0(label);
  111 +}
  112 +
  113 +static inline void gen_op_jmp_nz32(int val, int label)
  114 +{
  115 + gen_op_set_T0_nz32(val);
  116 + gen_op_jmp_T0(label);
  117 +}
  118 +
  119 +static inline void gen_op_jmp_s32(int val, int label)
  120 +{
  121 + gen_op_set_T0_s32(val);
  122 + gen_op_jmp_T0(label);
  123 +}
  124 +
  125 +static inline void gen_op_jmp_ns32(int val, int label)
  126 +{
  127 + gen_op_set_T0_ns32(val);
  128 + gen_op_jmp_T0(label);
  129 +}
  130 +
target-m68k/op.c
@@ -487,37 +487,38 @@ OP(jmp) @@ -487,37 +487,38 @@ OP(jmp)
487 GOTO_LABEL_PARAM(1); 487 GOTO_LABEL_PARAM(1);
488 } 488 }
489 489
490 -/* These ops involve a function call, which probably requires a stack frame  
491 - and breaks things on some hosts. */  
492 -OP(jmp_z32) 490 +OP(set_T0_z32)
493 { 491 {
494 uint32_t arg = get_op(PARAM1); 492 uint32_t arg = get_op(PARAM1);
495 - if (arg == 0)  
496 - GOTO_LABEL_PARAM(2); 493 + T0 = (arg == 0);
497 FORCE_RET(); 494 FORCE_RET();
498 } 495 }
499 496
500 -OP(jmp_nz32) 497 +OP(set_T0_nz32)
501 { 498 {
502 uint32_t arg = get_op(PARAM1); 499 uint32_t arg = get_op(PARAM1);
503 - if (arg != 0)  
504 - GOTO_LABEL_PARAM(2); 500 + T0 = (arg != 0);
505 FORCE_RET(); 501 FORCE_RET();
506 } 502 }
507 503
508 -OP(jmp_s32) 504 +OP(set_T0_s32)
509 { 505 {
510 int32_t arg = get_op(PARAM1); 506 int32_t arg = get_op(PARAM1);
511 - if (arg < 0)  
512 - GOTO_LABEL_PARAM(2); 507 + T0 = (arg > 0);
513 FORCE_RET(); 508 FORCE_RET();
514 } 509 }
515 510
516 -OP(jmp_ns32) 511 +OP(set_T0_ns32)
517 { 512 {
518 int32_t arg = get_op(PARAM1); 513 int32_t arg = get_op(PARAM1);
519 - if (arg >= 0)  
520 - GOTO_LABEL_PARAM(2); 514 + T0 = (arg >= 0);
  515 + FORCE_RET();
  516 +}
  517 +
  518 +OP(jmp_T0)
  519 +{
  520 + if (T0)
  521 + GOTO_LABEL_PARAM(1);
521 FORCE_RET(); 522 FORCE_RET();
522 } 523 }
523 524