Mercurial > repos > blastem
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, ...) |