Mercurial > repos > blastem
comparison gen_x86.c @ 754:cfa402c6ced8
Handle far calls in call_args and call_args_abi
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 27 Jun 2015 11:39:55 -0700 |
parents | cb1c005880e7 |
children | 7306b3967c51 |
comparison
equal
deleted
inserted
replaced
753:cee1275f5d08 | 754:cfa402c6ced8 |
---|---|
2001 exit(1); | 2001 exit(1); |
2002 } | 2002 } |
2003 code->cur = out; | 2003 code->cur = out; |
2004 } | 2004 } |
2005 | 2005 |
2006 void call_raxfallback(code_info *code, code_ptr fun) | |
2007 { | |
2008 check_alloc_code(code, 5); | |
2009 code_ptr out = code->cur; | |
2010 ptrdiff_t disp = fun-(out+5); | |
2011 if (disp <= 0x7FFFFFFF && disp >= -2147483648) { | |
2012 *(out++) = OP_CALL; | |
2013 *(out++) = disp; | |
2014 disp >>= 8; | |
2015 *(out++) = disp; | |
2016 disp >>= 8; | |
2017 *(out++) = disp; | |
2018 disp >>= 8; | |
2019 *(out++) = disp; | |
2020 } else { | |
2021 mov_ir(code, fun, RAX, SZ_PTR); | |
2022 call_r(code, RAX); | |
2023 } | |
2024 code->cur = out; | |
2025 } | |
2026 | |
2006 void call_r(code_info *code, uint8_t dst) | 2027 void call_r(code_info *code, uint8_t dst) |
2007 { | 2028 { |
2008 check_alloc_code(code, 2); | 2029 check_alloc_code(code, 2); |
2009 code_ptr out = code->cur; | 2030 code_ptr out = code->cur; |
2010 *(out++) = OP_SINGLE_EA; | 2031 *(out++) = OP_SINGLE_EA; |
2089 { | 2110 { |
2090 va_list args; | 2111 va_list args; |
2091 va_start(args, num_args); | 2112 va_start(args, num_args); |
2092 uint32_t adjust = prep_args(code, num_args, args); | 2113 uint32_t adjust = prep_args(code, num_args, args); |
2093 va_end(args); | 2114 va_end(args); |
2094 call(code, fun); | 2115 call_raxfallback(code, fun); |
2095 if (adjust) { | 2116 if (adjust) { |
2096 add_ir(code, adjust, RSP, SZ_PTR); | 2117 add_ir(code, adjust, RSP, SZ_PTR); |
2097 } | 2118 } |
2098 } | 2119 } |
2099 | 2120 |
2106 #ifdef X86_64 | 2127 #ifdef X86_64 |
2107 test_ir(code, 8, RSP, SZ_PTR); //check stack alignment | 2128 test_ir(code, 8, RSP, SZ_PTR); //check stack alignment |
2108 code_ptr do_adjust_rsp = code->cur + 1; | 2129 code_ptr do_adjust_rsp = code->cur + 1; |
2109 jcc(code, CC_NZ, code->cur + 2); | 2130 jcc(code, CC_NZ, code->cur + 2); |
2110 #endif | 2131 #endif |
2111 call(code, fun); | 2132 call_raxfallback(code, fun); |
2112 if (adjust) { | 2133 if (adjust) { |
2113 add_ir(code, adjust, RSP, SZ_PTR); | 2134 add_ir(code, adjust, RSP, SZ_PTR); |
2114 } | 2135 } |
2115 #ifdef X86_64 | 2136 #ifdef X86_64 |
2116 code_ptr no_adjust_rsp = code->cur + 1; | 2137 code_ptr no_adjust_rsp = code->cur + 1; |
2117 jmp(code, code->cur + 2); | 2138 jmp(code, code->cur + 2); |
2118 *do_adjust_rsp = code->cur - (do_adjust_rsp+1); | 2139 *do_adjust_rsp = code->cur - (do_adjust_rsp+1); |
2119 sub_ir(code, 8, RSP, SZ_PTR); | 2140 sub_ir(code, 8, RSP, SZ_PTR); |
2120 call(code, fun); | 2141 call_raxfallback(code, fun); |
2121 add_ir(code, adjust + 8 , RSP, SZ_PTR); | 2142 add_ir(code, adjust + 8 , RSP, SZ_PTR); |
2122 *no_adjust_rsp = code->cur - (no_adjust_rsp+1); | 2143 *no_adjust_rsp = code->cur - (no_adjust_rsp+1); |
2123 #endif | 2144 #endif |
2124 } | 2145 } |
2125 | 2146 |