Mercurial > repos > blastem
comparison gen_x86.c @ 899:07bfbbbb4b2e
Fix for Z80 retranslation post alignment rework
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 26 Nov 2015 22:30:41 -0800 |
parents | a7774fc2de4b |
children | dc71e32091d8 |
comparison
equal
deleted
inserted
replaced
898:2f1157f00dc6 | 899:07bfbbbb4b2e |
---|---|
1966 *(out++) = OP_SINGLE_EA; | 1966 *(out++) = OP_SINGLE_EA; |
1967 *(out++) = MODE_REG_INDIRECT | dst | (OP_EX_JMP_EA << 3); | 1967 *(out++) = MODE_REG_INDIRECT | dst | (OP_EX_JMP_EA << 3); |
1968 code->cur = out; | 1968 code->cur = out; |
1969 } | 1969 } |
1970 | 1970 |
1971 void call(code_info *code, code_ptr fun) | 1971 void call_noalign(code_info *code, code_ptr fun) |
1972 { | 1972 { |
1973 code->stack_off += sizeof(void *); | |
1974 int32_t adjust = 0; | |
1975 if (code->stack_off & 0xF) { | |
1976 adjust = 16 - (code->stack_off & 0xF); | |
1977 code->stack_off += adjust; | |
1978 sub_ir(code, adjust, RSP, SZ_PTR); | |
1979 } | |
1980 check_alloc_code(code, 5); | 1973 check_alloc_code(code, 5); |
1981 code_ptr out = code->cur; | 1974 code_ptr out = code->cur; |
1982 ptrdiff_t disp = fun-(out+5); | 1975 ptrdiff_t disp = fun-(out+5); |
1983 if (disp <= 0x7FFFFFFF && disp >= -2147483648) { | 1976 if (disp <= 0x7FFFFFFF && disp >= -2147483648) { |
1984 *(out++) = OP_CALL; | 1977 *(out++) = OP_CALL; |
1992 } else { | 1985 } else { |
1993 //TODO: Implement far call??? | 1986 //TODO: Implement far call??? |
1994 fatal_error("call: %p - %p = %lX which is out of range for a 32-bit displacement\n", fun, out + 5, (long)disp); | 1987 fatal_error("call: %p - %p = %lX which is out of range for a 32-bit displacement\n", fun, out + 5, (long)disp); |
1995 } | 1988 } |
1996 code->cur = out; | 1989 code->cur = out; |
1990 } | |
1991 | |
1992 | |
1993 void call(code_info *code, code_ptr fun) | |
1994 { | |
1995 code->stack_off += sizeof(void *); | |
1996 int32_t adjust = 0; | |
1997 if (code->stack_off & 0xF) { | |
1998 adjust = 16 - (code->stack_off & 0xF); | |
1999 code->stack_off += adjust; | |
2000 sub_ir(code, adjust, RSP, SZ_PTR); | |
2001 } | |
2002 call_noalign(code, fun); | |
1997 if (adjust) { | 2003 if (adjust) { |
1998 add_ir(code, adjust, RSP, SZ_PTR); | 2004 add_ir(code, adjust, RSP, SZ_PTR); |
1999 } | 2005 } |
2000 code->stack_off -= sizeof(void *) + adjust; | 2006 code->stack_off -= sizeof(void *) + adjust; |
2001 } | 2007 } |
2002 | |
2003 void call_raxfallback(code_info *code, code_ptr fun) | 2008 void call_raxfallback(code_info *code, code_ptr fun) |
2004 { | 2009 { |
2005 check_alloc_code(code, 5); | 2010 check_alloc_code(code, 5); |
2006 code_ptr out = code->cur; | 2011 code_ptr out = code->cur; |
2007 ptrdiff_t disp = fun-(out+5); | 2012 ptrdiff_t disp = fun-(out+5); |