summaryrefslogtreecommitdiff
path: root/gen_x86.c
diff options
context:
space:
mode:
authorMichael Pavone <pavone@retrodev.com>2019-04-18 19:48:04 -0700
committerMichael Pavone <pavone@retrodev.com>2019-04-18 19:48:04 -0700
commit2a700065e99ba29857b9f429aa8997af24116760 (patch)
treefbe37eeb5514198f7f31a4ac6923a0a44964a696 /gen_x86.c
parentaa41d9724e763de7a64776a7a2c262a5757383f9 (diff)
parent05af6e2720d03b538e64a73a84af1f4c4f8ce762 (diff)
Merge
Diffstat (limited to 'gen_x86.c')
-rw-r--r--gen_x86.c20
1 files changed, 16 insertions, 4 deletions
diff --git a/gen_x86.c b/gen_x86.c
index 33a9a0e..18f1d24 100644
--- a/gen_x86.c
+++ b/gen_x86.c
@@ -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);