comparison gen_x86.c @ 1828:37afb9cf58be

Get 64-bit builds working for Windows target
author Michael Pavone <pavone@retrodev.com>
date Sun, 07 Apr 2019 00:06:29 -0700
parents 5453aafa0656
children a79e92929044
comparison
equal deleted inserted replaced
1827:c945a25aa75c 1828:37afb9cf58be
2109 { 2109 {
2110 arg_arr[i] = va_arg(args, int); 2110 arg_arr[i] = va_arg(args, int);
2111 } 2111 }
2112 #ifdef X86_64 2112 #ifdef X86_64
2113 uint32_t stack_args = 0; 2113 uint32_t stack_args = 0;
2114 #ifdef _WIN32
2115 //Microsoft is too good for the ABI that everyone else uses on x86-64 apparently
2116 uint8_t abi_regs[] = {RCX, RDX, R8, R9};
2117 #else
2114 uint8_t abi_regs[] = {RDI, RSI, RDX, RCX, R8, R9}; 2118 uint8_t abi_regs[] = {RDI, RSI, RDX, RCX, R8, R9};
2119 #endif
2115 int8_t reg_swap[R15+1]; 2120 int8_t reg_swap[R15+1];
2116 uint32_t usage = 0; 2121 uint32_t usage = 0;
2117 memset(reg_swap, -1, sizeof(reg_swap)); 2122 memset(reg_swap, -1, sizeof(reg_swap));
2118 for (int i = 0; i < num_args; i ++) 2123 for (int i = 0; i < num_args; i ++)
2119 { 2124 {
2151 for (int i = stack_args -1; i >= 0; i--) 2156 for (int i = stack_args -1; i >= 0; i--)
2152 { 2157 {
2153 push_r(code, arg_arr[i]); 2158 push_r(code, arg_arr[i]);
2154 } 2159 }
2155 free(arg_arr); 2160 free(arg_arr);
2161 #if defined(X86_64) && defined(_WIN32)
2162 sub_ir(code, 32, RSP, SZ_PTR);
2163 code->stack_off += 32;
2164 adjust += 32;
2165 #endif
2156 2166
2157 return stack_args * sizeof(void *) + adjust; 2167 return stack_args * sizeof(void *) + adjust;
2158 } 2168 }
2159 2169
2160 void call_args(code_info *code, code_ptr fun, uint32_t num_args, ...) 2170 void call_args(code_info *code, code_ptr fun, uint32_t num_args, ...)