comparison m68k_core_x86.c @ 2269:6677afe78a6f

Hopefully make older versions of gcc happy
author Michael Pavone <pavone@retrodev.com>
date Mon, 26 Dec 2022 07:17:29 -0800
parents 5b308c7b098c
children 3b5fef896475
comparison
equal deleted inserted replaced
2268:5b308c7b098c 2269:6677afe78a6f
359 cc = CC_NS; 359 cc = CC_NS;
360 } else { 360 } else {
361 cmp_rr(code, opts->gen.cycles, opts->gen.limit, SZ_D); 361 cmp_rr(code, opts->gen.cycles, opts->gen.limit, SZ_D);
362 cc = CC_A; 362 cc = CC_A;
363 } 363 }
364 code_ptr jmp_off;
364 ALLOC_CODE_RETRY_POINT 365 ALLOC_CODE_RETRY_POINT
365 code_ptr jmp_off = code->cur+1; 366 jmp_off = code->cur+1;
366 jcc(code, cc, jmp_off+1); 367 jcc(code, cc, jmp_off+1);
367 call(code, opts->handle_int_latch); 368 call(code, opts->handle_int_latch);
368 CHECK_BRANCH_DEST(jmp_off) 369 CHECK_BRANCH_DEST(jmp_off)
369 } 370 }
370 371
864 } else { 865 } else {
865 mov_irdisp(code, cond == COND_TRUE ? 0xFF : 0, dst_op.base, dst_op.disp, SZ_B); 866 mov_irdisp(code, cond == COND_TRUE ? 0xFF : 0, dst_op.base, dst_op.disp, SZ_B);
866 } 867 }
867 } else { 868 } else {
868 uint8_t cc = m68k_eval_cond(opts, cond); 869 uint8_t cc = m68k_eval_cond(opts, cond);
870 code_ptr true_off;
869 ALLOC_CODE_RETRY_POINT 871 ALLOC_CODE_RETRY_POINT
870 code_ptr true_off = code->cur + 1; 872 true_off = code->cur + 1;
871 jcc(code, cc, code->cur+2); 873 jcc(code, cc, code->cur+2);
872 cycles(&opts->gen, BUS); 874 cycles(&opts->gen, BUS);
873 if (dst_op.mode == MODE_REG_DIRECT) { 875 if (dst_op.mode == MODE_REG_DIRECT) {
874 mov_ir(code, 0, dst_op.base, SZ_B); 876 mov_ir(code, 0, dst_op.base, SZ_B);
875 } else { 877 } else {
1349 } 1351 }
1350 } 1352 }
1351 if (inst->dst.addr_mode != MODE_AREG || inst->op == M68K_CMP) { 1353 if (inst->dst.addr_mode != MODE_AREG || inst->op == M68K_CMP) {
1352 update_flags(opts, flag_mask); 1354 update_flags(opts, flag_mask);
1353 if (inst->op == M68K_ADDX || inst->op == M68K_SUBX) { 1355 if (inst->op == M68K_ADDX || inst->op == M68K_SUBX) {
1356 code_ptr after_flag_set;
1354 ALLOC_CODE_RETRY_POINT 1357 ALLOC_CODE_RETRY_POINT
1355 code_ptr after_flag_set = code->cur + 1; 1358 after_flag_set = code->cur + 1;
1356 jcc(code, CC_Z, code->cur + 2); 1359 jcc(code, CC_Z, code->cur + 2);
1357 set_flag(opts, 0, FLAG_Z); 1360 set_flag(opts, 0, FLAG_Z);
1358 CHECK_BRANCH_DEST(after_flag_set); 1361 CHECK_BRANCH_DEST(after_flag_set);
1359 } 1362 }
1360 } 1363 }
1723 isize = 6; 1726 isize = 6;
1724 break; 1727 break;
1725 default: 1728 default:
1726 isize = 2; 1729 isize = 2;
1727 } 1730 }
1731 code_ptr passed;
1728 ALLOC_CODE_RETRY_POINT 1732 ALLOC_CODE_RETRY_POINT
1729 code_ptr passed = code->cur + 1; 1733 passed = code->cur + 1;
1730 jcc(code, CC_GE, code->cur + 2); 1734 jcc(code, CC_GE, code->cur + 2);
1731 set_flag(opts, 1, FLAG_N); 1735 set_flag(opts, 1, FLAG_N);
1732 mov_ir(code, VECTOR_CHK, opts->gen.scratch2, SZ_D); 1736 mov_ir(code, VECTOR_CHK, opts->gen.scratch2, SZ_D);
1733 mov_ir(code, inst->address+isize, opts->gen.scratch1, SZ_D); 1737 mov_ir(code, inst->address+isize, opts->gen.scratch1, SZ_D);
1734 jmp(code, opts->trap); 1738 jmp(code, opts->trap);
1896 movzx_rr(code, src_op->base, opts->gen.scratch1, SZ_W, SZ_D); 1900 movzx_rr(code, src_op->base, opts->gen.scratch1, SZ_W, SZ_D);
1897 } 1901 }
1898 shl_ir(code, 16, opts->gen.scratch1, SZ_D); 1902 shl_ir(code, 16, opts->gen.scratch1, SZ_D);
1899 } 1903 }
1900 cmp_ir(code, 0, opts->gen.scratch1, SZ_D); 1904 cmp_ir(code, 0, opts->gen.scratch1, SZ_D);
1905 code_ptr not_zero;
1901 ALLOC_CODE_RETRY_POINT 1906 ALLOC_CODE_RETRY_POINT
1902 code_ptr not_zero = code->cur+1; 1907 not_zero = code->cur+1;
1903 jcc(code, CC_NZ, not_zero); 1908 jcc(code, CC_NZ, not_zero);
1904 1909
1905 //TODO: Check that opts->trap includes the cycles conumed by the first trap0 microinstruction 1910 //TODO: Check that opts->trap includes the cycles conumed by the first trap0 microinstruction
1906 cycles(&opts->gen, 4); 1911 cycles(&opts->gen, 4);
1907 uint32_t isize = 2; 1912 uint32_t isize = 2;