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