diff options
author | Michael Pavone <pavone@retrodev.com> | 2019-04-18 19:48:04 -0700 |
---|---|---|
committer | Michael Pavone <pavone@retrodev.com> | 2019-04-18 19:48:04 -0700 |
commit | 2a700065e99ba29857b9f429aa8997af24116760 (patch) | |
tree | fbe37eeb5514198f7f31a4ac6923a0a44964a696 /gen_x86.c | |
parent | aa41d9724e763de7a64776a7a2c262a5757383f9 (diff) | |
parent | 05af6e2720d03b538e64a73a84af1f4c4f8ce762 (diff) |
Merge
Diffstat (limited to 'gen_x86.c')
-rw-r--r-- | gen_x86.c | 20 |
1 files changed, 16 insertions, 4 deletions
@@ -2111,7 +2111,12 @@ uint32_t prep_args(code_info *code, uint32_t num_args, va_list args) } #ifdef X86_64 uint32_t stack_args = 0; +#ifdef _WIN32 + //Microsoft is too good for the ABI that everyone else uses on x86-64 apparently + uint8_t abi_regs[] = {RCX, RDX, R8, R9}; +#else uint8_t abi_regs[] = {RDI, RSI, RDX, RCX, R8, R9}; +#endif int8_t reg_swap[R15+1]; uint32_t usage = 0; memset(reg_swap, -1, sizeof(reg_swap)); @@ -2153,6 +2158,11 @@ uint32_t prep_args(code_info *code, uint32_t num_args, va_list args) push_r(code, arg_arr[i]); } free(arg_arr); +#if defined(X86_64) && defined(_WIN32) + sub_ir(code, 32, RSP, SZ_PTR); + code->stack_off += 32; + adjust += 32; +#endif return stack_args * sizeof(void *) + adjust; } @@ -2218,7 +2228,8 @@ void save_callee_save_regs(code_info *code) push_r(code, R13); push_r(code, R14); push_r(code, R15); -#else +#endif +#if !defined(X86_64) || defined(_WIN32) push_r(code, RDI); push_r(code, RSI); #endif @@ -2226,14 +2237,15 @@ void save_callee_save_regs(code_info *code) void restore_callee_save_regs(code_info *code) { +#if !defined(X86_64) || defined(_WIN32) + pop_r(code, RSI); + pop_r(code, RDI); +#endif #ifdef X86_64 pop_r(code, R15); pop_r(code, R14); pop_r(code, R13); pop_r(code, R12); -#else - pop_r(code, RSI); - pop_r(code, RDI); #endif pop_r(code, RBP); pop_r(code, RBX); |