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