Mercurial > repos > blastem
comparison m68k_to_x86.c @ 174:a1c3ecb4823f
Implement areg displacement mode for jsr
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Sun, 06 Jan 2013 18:31:17 -0800 |
parents | 47b2796fb277 |
children | 7504200cac86 |
comparison
equal
deleted
inserted
replaced
173:47b2796fb277 | 174:a1c3ecb4823f |
---|---|
1934 if (opts->aregs[inst->src.params.regs.pri] >= 0) { | 1934 if (opts->aregs[inst->src.params.regs.pri] >= 0) { |
1935 dst = mov_rr(dst, opts->aregs[inst->src.params.regs.pri], SCRATCH1, SZ_D); | 1935 dst = mov_rr(dst, opts->aregs[inst->src.params.regs.pri], SCRATCH1, SZ_D); |
1936 } else { | 1936 } else { |
1937 dst = mov_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + 4 * inst->src.params.regs.pri, SCRATCH1, SZ_D); | 1937 dst = mov_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + 4 * inst->src.params.regs.pri, SCRATCH1, SZ_D); |
1938 } | 1938 } |
1939 dst = call(dst, (uint8_t *)m68k_native_addr); | |
1940 if (opts->flags & OPT_NATIVE_CALL_STACK) { | |
1941 dst = call_r(dst, SCRATCH1); | |
1942 //would add_ir(dst, 8, RSP, SZ_Q) be faster here? | |
1943 dst = pop_r(dst, SCRATCH1); | |
1944 } else { | |
1945 dst = jmp_r(dst, SCRATCH1); | |
1946 } | |
1947 break; | |
1948 case MODE_AREG_DISPLACE: | |
1949 dst = cycles(dst, BUS*2); | |
1950 dst = mov_ir(dst, inst->address + 2, SCRATCH1, SZ_D); | |
1951 if (opts->flags & OPT_NATIVE_CALL_STACK) { | |
1952 dst = push_r(dst, SCRATCH1); | |
1953 } | |
1954 dst = sub_ir(dst, 4, opts->aregs[7], SZ_D); | |
1955 dst = mov_rr(dst, opts->aregs[7], SCRATCH2, SZ_D); | |
1956 dst = call(dst, (char *)m68k_write_long_highfirst); | |
1957 if (opts->aregs[inst->src.params.regs.pri] >= 0) { | |
1958 dst = mov_rr(dst, opts->aregs[inst->src.params.regs.pri], SCRATCH1, SZ_D); | |
1959 } else { | |
1960 dst = mov_rdisp8r(dst, CONTEXT, offsetof(m68k_context, aregs) + 4 * inst->src.params.regs.pri, SCRATCH1, SZ_D); | |
1961 } | |
1962 dst = add_ir(dst, inst->src.params.regs.displacement, SCRATCH1, SZ_D); | |
1939 dst = call(dst, (uint8_t *)m68k_native_addr); | 1963 dst = call(dst, (uint8_t *)m68k_native_addr); |
1940 if (opts->flags & OPT_NATIVE_CALL_STACK) { | 1964 if (opts->flags & OPT_NATIVE_CALL_STACK) { |
1941 dst = call_r(dst, SCRATCH1); | 1965 dst = call_r(dst, SCRATCH1); |
1942 //would add_ir(dst, 8, RSP, SZ_Q) be faster here? | 1966 //would add_ir(dst, 8, RSP, SZ_Q) be faster here? |
1943 dst = pop_r(dst, SCRATCH1); | 1967 dst = pop_r(dst, SCRATCH1); |