Mercurial > repos > blastem
comparison m68k_to_x86.c @ 172:c61507f897e4
Implement movep
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 06 Jan 2013 14:41:26 -0800 |
parents | f03db3db48fb |
children | 47b2796fb277 |
comparison
equal
deleted
inserted
replaced
171:f03db3db48fb | 172:c61507f897e4 |
---|---|
2256 dst = mov_rrdisp8(dst, opts->aregs[7], CONTEXT, reg_offset(&(inst->src)), SZ_D); | 2256 dst = mov_rrdisp8(dst, opts->aregs[7], CONTEXT, reg_offset(&(inst->src)), SZ_D); |
2257 } | 2257 } |
2258 dst = add_ir(dst, inst->dst.params.immed, opts->aregs[7], SZ_D); | 2258 dst = add_ir(dst, inst->dst.params.immed, opts->aregs[7], SZ_D); |
2259 //prefetch | 2259 //prefetch |
2260 dst = cycles(dst, BUS); | 2260 dst = cycles(dst, BUS); |
2261 return dst; | |
2262 } | |
2263 | |
2264 uint8_t * translate_m68k_movep(uint8_t * dst, m68kinst * inst, x86_68k_options * opts) | |
2265 { | |
2266 int8_t reg; | |
2267 dst = cycles(dst, BUS*2); | |
2268 if (inst->src.addr_mode == MODE_REG) { | |
2269 if (opts->aregs[inst->dst.params.regs.pri] >= 0) { | |
2270 dst = mov_rr(dst, opts->aregs[inst->dst.params.regs.pri], SCRATCH2, SZ_D); | |
2271 } else { | |
2272 dst = mov_rdisp8r(dst, CONTEXT, reg_offset(&(inst->dst)), SCRATCH2, SZ_D); | |
2273 } | |
2274 if (inst->dst.params.regs.displacement) { | |
2275 dst = add_ir(dst, inst->dst.params.regs.displacement, SCRATCH2, SZ_D); | |
2276 } | |
2277 reg = native_reg(&(inst->src), opts); | |
2278 if (inst->extra.size == OPSIZE_LONG) { | |
2279 if (reg >= 0) { | |
2280 dst = mov_rr(dst, reg, SCRATCH1, SZ_D); | |
2281 dst = shr_ir(dst, 24, SCRATCH1, SZ_D); | |
2282 dst = push_r(dst, SCRATCH2); | |
2283 dst = call(dst, (uint8_t *)m68k_write_byte); | |
2284 dst = pop_r(dst, SCRATCH2); | |
2285 dst = mov_rr(dst, reg, SCRATCH1, SZ_D); | |
2286 dst = shr_ir(dst, 16, SCRATCH1, SZ_D); | |
2287 | |
2288 } else { | |
2289 dst = mov_rdisp8r(dst, CONTEXT, reg_offset(&(inst->src))+3, SCRATCH1, SZ_B); | |
2290 dst = push_r(dst, SCRATCH2); | |
2291 dst = call(dst, (uint8_t *)m68k_write_byte); | |
2292 dst = pop_r(dst, SCRATCH2); | |
2293 dst = mov_rdisp8r(dst, CONTEXT, reg_offset(&(inst->src))+2, SCRATCH1, SZ_B); | |
2294 } | |
2295 dst = add_ir(dst, 2, SCRATCH2, SZ_D); | |
2296 dst = push_r(dst, SCRATCH2); | |
2297 dst = call(dst, (uint8_t *)m68k_write_byte); | |
2298 dst = pop_r(dst, SCRATCH2); | |
2299 dst = add_ir(dst, 2, SCRATCH2, SZ_D); | |
2300 } | |
2301 if (reg >= 0) { | |
2302 dst = mov_rr(dst, reg, SCRATCH1, SZ_W); | |
2303 dst = shr_ir(dst, 8, SCRATCH1, SZ_W); | |
2304 dst = push_r(dst, SCRATCH2); | |
2305 dst = call(dst, (uint8_t *)m68k_write_byte); | |
2306 dst = pop_r(dst, SCRATCH2); | |
2307 dst = mov_rr(dst, reg, SCRATCH1, SZ_W); | |
2308 } else { | |
2309 dst = mov_rdisp8r(dst, CONTEXT, reg_offset(&(inst->src))+1, SCRATCH1, SZ_B); | |
2310 dst = push_r(dst, SCRATCH2); | |
2311 dst = call(dst, (uint8_t *)m68k_write_byte); | |
2312 dst = pop_r(dst, SCRATCH2); | |
2313 dst = mov_rdisp8r(dst, CONTEXT, reg_offset(&(inst->src)), SCRATCH1, SZ_B); | |
2314 } | |
2315 dst = add_ir(dst, 2, SCRATCH2, SZ_D); | |
2316 dst = call(dst, (uint8_t *)m68k_write_byte); | |
2317 } else { | |
2318 if (opts->aregs[inst->src.params.regs.pri] >= 0) { | |
2319 dst = mov_rr(dst, opts->aregs[inst->src.params.regs.pri], SCRATCH1, SZ_D); | |
2320 } else { | |
2321 dst = mov_rdisp8r(dst, CONTEXT, reg_offset(&(inst->src)), SCRATCH1, SZ_D); | |
2322 } | |
2323 if (inst->src.params.regs.displacement) { | |
2324 dst = add_ir(dst, inst->src.params.regs.displacement, SCRATCH1, SZ_D); | |
2325 } | |
2326 reg = native_reg(&(inst->dst), opts); | |
2327 if (inst->extra.size == OPSIZE_LONG) { | |
2328 if (reg >= 0) { | |
2329 dst = push_r(dst, SCRATCH1); | |
2330 dst = call(dst, (uint8_t *)m68k_read_byte_scratch1); | |
2331 dst = shl_ir(dst, 24, SCRATCH1, SZ_D); | |
2332 dst = mov_rr(dst, SCRATCH1, reg, SZ_D); | |
2333 dst = pop_r(dst, SCRATCH1); | |
2334 dst = add_ir(dst, 2, SCRATCH1, SZ_D); | |
2335 dst = push_r(dst, SCRATCH1); | |
2336 dst = call(dst, (uint8_t *)m68k_read_byte_scratch1); | |
2337 dst = shl_ir(dst, 16, SCRATCH1, SZ_D); | |
2338 dst = or_rr(dst, SCRATCH1, reg, SZ_D); | |
2339 } else { | |
2340 dst = push_r(dst, SCRATCH1); | |
2341 dst = call(dst, (uint8_t *)m68k_read_byte_scratch1); | |
2342 dst = mov_rrdisp8(dst, SCRATCH1, CONTEXT, reg_offset(&(inst->dst))+3, SZ_B); | |
2343 dst = pop_r(dst, SCRATCH1); | |
2344 dst = add_ir(dst, 2, SCRATCH1, SZ_D); | |
2345 dst = push_r(dst, SCRATCH1); | |
2346 dst = call(dst, (uint8_t *)m68k_read_byte_scratch1); | |
2347 dst = mov_rrdisp8(dst, SCRATCH1, CONTEXT, reg_offset(&(inst->dst))+2, SZ_B); | |
2348 } | |
2349 dst = pop_r(dst, SCRATCH1); | |
2350 dst = add_ir(dst, 2, SCRATCH1, SZ_D); | |
2351 } | |
2352 dst = push_r(dst, SCRATCH1); | |
2353 dst = call(dst, (uint8_t *)m68k_read_byte_scratch1); | |
2354 if (reg >= 0) { | |
2355 | |
2356 dst = shl_ir(dst, 8, SCRATCH1, SZ_W); | |
2357 dst = mov_rr(dst, SCRATCH1, reg, SZ_W); | |
2358 dst = pop_r(dst, SCRATCH1); | |
2359 dst = add_ir(dst, 2, SCRATCH1, SZ_D); | |
2360 dst = call(dst, (uint8_t *)m68k_read_byte_scratch1); | |
2361 dst = mov_rr(dst, SCRATCH1, reg, SZ_B); | |
2362 } else { | |
2363 dst = mov_rrdisp8(dst, SCRATCH1, CONTEXT, reg_offset(&(inst->dst))+1, SZ_B); | |
2364 dst = pop_r(dst, SCRATCH1); | |
2365 dst = add_ir(dst, 2, SCRATCH1, SZ_D); | |
2366 dst = call(dst, (uint8_t *)m68k_read_byte_scratch1); | |
2367 dst = mov_rrdisp8(dst, SCRATCH1, CONTEXT, reg_offset(&(inst->dst)), SZ_B); | |
2368 } | |
2369 } | |
2261 return dst; | 2370 return dst; |
2262 } | 2371 } |
2263 | 2372 |
2264 typedef uint8_t * (*shift_ir_t)(uint8_t * out, uint8_t val, uint8_t dst, uint8_t size); | 2373 typedef uint8_t * (*shift_ir_t)(uint8_t * out, uint8_t val, uint8_t dst, uint8_t size); |
2265 typedef uint8_t * (*shift_irdisp8_t)(uint8_t * out, uint8_t val, uint8_t dst_base, int8_t disp, uint8_t size); | 2374 typedef uint8_t * (*shift_irdisp8_t)(uint8_t * out, uint8_t val, uint8_t dst_base, int8_t disp, uint8_t size); |
2395 return translate_m68k_link(dst, inst, opts); | 2504 return translate_m68k_link(dst, inst, opts); |
2396 } else if(inst->op == M68K_EXT) { | 2505 } else if(inst->op == M68K_EXT) { |
2397 return translate_m68k_ext(dst, inst, opts); | 2506 return translate_m68k_ext(dst, inst, opts); |
2398 } else if(inst->op == M68K_SCC) { | 2507 } else if(inst->op == M68K_SCC) { |
2399 return translate_m68k_scc(dst, inst, opts); | 2508 return translate_m68k_scc(dst, inst, opts); |
2509 } else if(inst->op == M68K_MOVEP) { | |
2510 return translate_m68k_movep(dst, inst, opts); | |
2400 } | 2511 } |
2401 x86_ea src_op, dst_op; | 2512 x86_ea src_op, dst_op; |
2402 if (inst->src.addr_mode != MODE_UNUSED) { | 2513 if (inst->src.addr_mode != MODE_UNUSED) { |
2403 dst = translate_m68k_src(inst, &src_op, dst, opts); | 2514 dst = translate_m68k_src(inst, &src_op, dst, opts); |
2404 } | 2515 } |