Mercurial > repos > blastem
comparison m68k_to_x86.c @ 154:4791c0204410
Small fix for bit instructions
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Fri, 04 Jan 2013 22:51:01 -0800 |
parents | 79958b95526f |
children | 94a65fb4e1c7 |
comparison
equal
deleted
inserted
replaced
153:42c031184e8a | 154:4791c0204410 |
---|---|
345 ea->mode = MODE_IMMED; | 345 ea->mode = MODE_IMMED; |
346 ea->disp = inst->src.params.immed; | 346 ea->disp = inst->src.params.immed; |
347 break; | 347 break; |
348 default: | 348 default: |
349 m68k_disasm(inst, disasm_buf); | 349 m68k_disasm(inst, disasm_buf); |
350 printf("%s\naddress mode %d not implemented (src)\n", disasm_buf, inst->src.addr_mode); | 350 printf("%X: %s\naddress mode %d not implemented (src)\n", inst->address, disasm_buf, inst->src.addr_mode); |
351 exit(1); | 351 exit(1); |
352 } | 352 } |
353 return out; | 353 return out; |
354 } | 354 } |
355 | 355 |
611 ea->mode = MODE_REG_DIRECT; | 611 ea->mode = MODE_REG_DIRECT; |
612 ea->base = SCRATCH1; | 612 ea->base = SCRATCH1; |
613 break; | 613 break; |
614 default: | 614 default: |
615 m68k_disasm(inst, disasm_buf); | 615 m68k_disasm(inst, disasm_buf); |
616 printf("%s\naddress mode %d not implemented (dst)\n", disasm_buf, inst->dst.addr_mode); | 616 printf("%X: %s\naddress mode %d not implemented (dst)\n", inst->address, disasm_buf, inst->dst.addr_mode); |
617 exit(1); | 617 exit(1); |
618 } | 618 } |
619 return out; | 619 return out; |
620 } | 620 } |
621 | 621 |
959 break; | 959 break; |
960 } | 960 } |
961 break; | 961 break; |
962 default: | 962 default: |
963 m68k_disasm(inst, disasm_buf); | 963 m68k_disasm(inst, disasm_buf); |
964 printf("%s\naddress mode %d not implemented (move dst)\n", disasm_buf, inst->dst.addr_mode); | 964 printf("%X: %s\naddress mode %d not implemented (move dst)\n", inst->address, disasm_buf, inst->dst.addr_mode); |
965 exit(1); | 965 exit(1); |
966 } | 966 } |
967 | 967 |
968 //add cycles for prefetch | 968 //add cycles for prefetch |
969 dst = cycles(dst, BUS); | 969 dst = cycles(dst, BUS); |
1000 early_cycles += 4; | 1000 early_cycles += 4; |
1001 dst = mov_ir(dst, inst->dst.params.immed, SCRATCH2, SZ_D); | 1001 dst = mov_ir(dst, inst->dst.params.immed, SCRATCH2, SZ_D); |
1002 break; | 1002 break; |
1003 default: | 1003 default: |
1004 m68k_disasm(inst, disasm_buf); | 1004 m68k_disasm(inst, disasm_buf); |
1005 printf("%s\naddress mode %d not implemented (movem dst)\n", disasm_buf, inst->dst.addr_mode); | 1005 printf("%X: %s\naddress mode %d not implemented (movem dst)\n", inst->address, disasm_buf, inst->dst.addr_mode); |
1006 exit(1); | 1006 exit(1); |
1007 } | 1007 } |
1008 dst = cycles(dst, early_cycles); | 1008 dst = cycles(dst, early_cycles); |
1009 for(bit=0; reg < 16 && reg >= 0; reg += dir, bit++) { | 1009 for(bit=0; reg < 16 && reg >= 0; reg += dir, bit++) { |
1010 if (inst->src.params.immed & (1 << bit)) { | 1010 if (inst->src.params.immed & (1 << bit)) { |
1062 early_cycles += 4; | 1062 early_cycles += 4; |
1063 dst = mov_ir(dst, inst->src.params.immed, SCRATCH1, SZ_D); | 1063 dst = mov_ir(dst, inst->src.params.immed, SCRATCH1, SZ_D); |
1064 break; | 1064 break; |
1065 default: | 1065 default: |
1066 m68k_disasm(inst, disasm_buf); | 1066 m68k_disasm(inst, disasm_buf); |
1067 printf("%s\naddress mode %d not implemented (movem src)\n", disasm_buf, inst->src.addr_mode); | 1067 printf("%X: %s\naddress mode %d not implemented (movem src)\n", inst->address, disasm_buf, inst->src.addr_mode); |
1068 exit(1); | 1068 exit(1); |
1069 } | 1069 } |
1070 dst = cycles(dst, early_cycles); | 1070 dst = cycles(dst, early_cycles); |
1071 for(reg = 0; reg < 16; reg ++) { | 1071 for(reg = 0; reg < 16; reg ++) { |
1072 if (inst->dst.params.immed & (1 << reg)) { | 1072 if (inst->dst.params.immed & (1 << reg)) { |
1299 dst = mov_irdisp8(dst, inst->src.params.immed, CONTEXT, reg_offset(&(inst->dst)), SZ_D); | 1299 dst = mov_irdisp8(dst, inst->src.params.immed, CONTEXT, reg_offset(&(inst->dst)), SZ_D); |
1300 } | 1300 } |
1301 break; | 1301 break; |
1302 default: | 1302 default: |
1303 m68k_disasm(inst, disasm_buf); | 1303 m68k_disasm(inst, disasm_buf); |
1304 printf("%s\naddress mode %d not implemented (lea src)\n", disasm_buf, inst->src.addr_mode); | 1304 printf("%X: %s\naddress mode %d not implemented (lea src)\n", inst->address, disasm_buf, inst->src.addr_mode); |
1305 exit(1); | 1305 exit(1); |
1306 } | 1306 } |
1307 return dst; | 1307 return dst; |
1308 } | 1308 } |
1309 | 1309 |
1380 dst = cycles(dst, (inst->src.addr_mode == MODE_ABSOLUTE) ? BUS * 3 : BUS * 2); | 1380 dst = cycles(dst, (inst->src.addr_mode == MODE_ABSOLUTE) ? BUS * 3 : BUS * 2); |
1381 dst = mov_ir(dst, inst->src.params.immed, SCRATCH1, SZ_D); | 1381 dst = mov_ir(dst, inst->src.params.immed, SCRATCH1, SZ_D); |
1382 break; | 1382 break; |
1383 default: | 1383 default: |
1384 m68k_disasm(inst, disasm_buf); | 1384 m68k_disasm(inst, disasm_buf); |
1385 printf("%s\naddress mode %d not implemented (lea src)\n", disasm_buf, inst->src.addr_mode); | 1385 printf("%X: %s\naddress mode %d not implemented (lea src)\n", inst->address, disasm_buf, inst->src.addr_mode); |
1386 exit(1); | 1386 exit(1); |
1387 } | 1387 } |
1388 dst = sub_ir(dst, 4, opts->aregs[7], SZ_D); | 1388 dst = sub_ir(dst, 4, opts->aregs[7], SZ_D); |
1389 dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); | 1389 dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); |
1390 dst = call(dst, (uint8_t *)m68k_write_long_lowfirst); | 1390 dst = call(dst, (uint8_t *)m68k_write_long_lowfirst); |
1392 } | 1392 } |
1393 | 1393 |
1394 uint8_t * translate_m68k_bsr(uint8_t * dst, m68kinst * inst, x86_68k_options * opts) | 1394 uint8_t * translate_m68k_bsr(uint8_t * dst, m68kinst * inst, x86_68k_options * opts) |
1395 { | 1395 { |
1396 int32_t disp = inst->src.params.immed; | 1396 int32_t disp = inst->src.params.immed; |
1397 uint32_t after = inst->address + 2; | 1397 uint32_t after = inst->address + (inst->variant == VAR_BYTE ? 2 : 4); |
1398 //TODO: Add cycles in the right place relative to pushing the return address on the stack | 1398 //TODO: Add cycles in the right place relative to pushing the return address on the stack |
1399 dst = cycles(dst, 10); | 1399 dst = cycles(dst, 10); |
1400 dst = mov_ir(dst, after, SCRATCH1, SZ_D); | 1400 dst = mov_ir(dst, after, SCRATCH1, SZ_D); |
1401 dst = push_r(dst, SCRATCH1); | 1401 dst = push_r(dst, SCRATCH1); |
1402 dst = sub_ir(dst, 4, opts->aregs[7], SZ_D); | 1402 dst = sub_ir(dst, 4, opts->aregs[7], SZ_D); |
1403 dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); | 1403 dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); |
1404 dst = call(dst, (char *)m68k_write_long_highfirst); | 1404 dst = call(dst, (char *)m68k_write_long_highfirst); |
1405 uint8_t * dest_addr = get_native_address(opts->native_code_map, after + disp); | 1405 uint8_t * dest_addr = get_native_address(opts->native_code_map, (inst->address+2) + disp); |
1406 if (!dest_addr) { | 1406 if (!dest_addr) { |
1407 opts->deferred = defer_address(opts->deferred, after + disp, dst + 1); | 1407 opts->deferred = defer_address(opts->deferred, (inst->address+2) + disp, dst + 1); |
1408 //dummy address to be replaced later | 1408 //dummy address to be replaced later |
1409 dest_addr = dst + 5; | 1409 dest_addr = dst + 5; |
1410 } | 1410 } |
1411 dst = call(dst, (char *)dest_addr); | 1411 dst = call(dst, (char *)dest_addr); |
1412 //would add_ir(dst, 8, RSP, SZ_Q) be faster here? | 1412 //would add_ir(dst, 8, RSP, SZ_Q) be faster here? |
2319 } else { | 2319 } else { |
2320 dst = mov_rdisp8r(dst, src_op.base, src_op.disp, SCRATCH1, SZ_B); | 2320 dst = mov_rdisp8r(dst, src_op.base, src_op.disp, SCRATCH1, SZ_B); |
2321 src_op.base = SCRATCH1; | 2321 src_op.base = SCRATCH1; |
2322 } | 2322 } |
2323 } | 2323 } |
2324 if (dst_op.mode == MODE_REG_DISPLACE8) { | |
2325 if (src_op.base != SCRATCH1 && src_op.base != SCRATCH2) { | |
2326 if (src_op.mode == MODE_REG_DIRECT) { | |
2327 dst = mov_rr(dst, src_op.base, SCRATCH1, SZ_D); | |
2328 } else { | |
2329 dst = mov_rdisp8r(dst, src_op.base, src_op.disp, SCRATCH1, SZ_D); | |
2330 src_op.mode = MODE_REG_DIRECT; | |
2331 } | |
2332 src_op.base = SCRATCH1; | |
2333 } | |
2334 dst = and_ir(dst, 31, SCRATCH1, SZ_D); | |
2335 } | |
2324 if (inst->op == M68K_BTST) { | 2336 if (inst->op == M68K_BTST) { |
2325 if (dst_op.mode == MODE_REG_DIRECT) { | 2337 if (dst_op.mode == MODE_REG_DIRECT) { |
2326 dst = bt_rr(dst, src_op.base, dst_op.base, inst->extra.size); | 2338 dst = bt_rr(dst, src_op.base, dst_op.base, inst->extra.size); |
2327 } else { | 2339 } else { |
2328 dst = bt_rrdisp8(dst, src_op.base, dst_op.base, dst_op.disp, inst->extra.size); | 2340 dst = bt_rrdisp8(dst, src_op.base, dst_op.base, dst_op.disp, inst->extra.size); |