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);