comparison m68k_core_x86.c @ 1332:87bbc4bec958

Fix timing for branch not taken case in the M68K BCC intruction
author Michael Pavone <pavone@retrodev.com>
date Wed, 26 Apr 2017 21:55:12 -0700
parents 85a90964b557
children df6af7187b36
comparison
equal deleted inserted replaced
1331:9bba5ff5beb8 1332:87bbc4bec958
792 } 792 }
793 793
794 void translate_m68k_bcc(m68k_options * opts, m68kinst * inst) 794 void translate_m68k_bcc(m68k_options * opts, m68kinst * inst)
795 { 795 {
796 code_info *code = &opts->gen.code; 796 code_info *code = &opts->gen.code;
797 cycles(&opts->gen, 10);//TODO: Adjust this for branch not taken case 797
798 int32_t disp = inst->src.params.immed; 798 int32_t disp = inst->src.params.immed;
799 uint32_t after = inst->address + 2; 799 uint32_t after = inst->address + 2;
800 if (inst->extra.cond == COND_TRUE) { 800 if (inst->extra.cond == COND_TRUE) {
801 cycles(&opts->gen, 10);
801 jump_m68k_abs(opts, after + disp); 802 jump_m68k_abs(opts, after + disp);
802 } else { 803 } else {
804 uint8_t cond = m68k_eval_cond(opts, inst->extra.cond);
805 code_ptr do_branch = code->cur + 1;
806 jcc(code, cond, do_branch);
807
808 cycles(&opts->gen, inst->variant == VAR_BYTE ? 8 : 12);
809 code_ptr done = code->cur + 1;
810 jmp(code, done);
811
812 *do_branch = code->cur - (do_branch + 1);
813 cycles(&opts->gen, 10);
803 code_ptr dest_addr = get_native_address(opts, after + disp); 814 code_ptr dest_addr = get_native_address(opts, after + disp);
804 uint8_t cond = m68k_eval_cond(opts, inst->extra.cond);
805 if (!dest_addr) { 815 if (!dest_addr) {
806 opts->gen.deferred = defer_address(opts->gen.deferred, after + disp, code->cur + 2); 816 opts->gen.deferred = defer_address(opts->gen.deferred, after + disp, code->cur + 1);
807 //dummy address to be replaced later, make sure it generates a 4-byte displacement 817 //dummy address to be replaced later, make sure it generates a 4-byte displacement
808 dest_addr = code->cur + 256; 818 dest_addr = code->cur + 256;
809 } 819 }
810 jcc(code, cond, dest_addr); 820 jmp(code, dest_addr);
821
822 *done = code->cur - (done + 1);
811 } 823 }
812 } 824 }
813 825
814 void translate_m68k_scc(m68k_options * opts, m68kinst * inst) 826 void translate_m68k_scc(m68k_options * opts, m68kinst * inst)
815 { 827 {