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