diff --git a/x86_64/machine.m4 b/x86_64/machine.m4
index e3b382447788e093a4687c34ebd86a0b815c1d58..c0de0c8761f2d825a2f26a61313a779ef097e7bc 100644
--- a/x86_64/machine.m4
+++ b/x86_64/machine.m4
@@ -42,3 +42,106 @@ define(<XREG>,<ifelse(
 	$1, %r13, %r13d,
 	$1, %r14, %r14d,
 	$1, %r15, %r15d)>)dnl
+
+dnl W64_ENTRY(nargs, xmm_used)
+define(<W64_ENTRY>, <
+  changequote([,])dnl
+  ifelse(<<<<<<<<<<<<<<< ignored; only for balancing)
+  ifelse(W64_ABI,yes,[
+    ifelse(eval($2 > 6), 1, [
+      sub	[$]eval(8 + 16*($2 - 6)), %rsp
+      movdqa	%xmm6, 0(%rsp)
+    ])
+    ifelse(eval($2 > 7), 1, [
+      movdqa	%xmm7, 16(%rsp)
+    ])
+    ifelse(eval($2 > 8), 1, [
+      movdqa	%xmm8, 32(%rsp)
+    ])
+    ifelse(eval($2 > 9), 1, [
+      movdqa	%xmm9, 48(%rsp)
+    ])
+    ifelse(eval($2 > 10), 1, [
+      movdqa	%xmm10, 64(%rsp)
+    ])
+    ifelse(eval($2 > 11), 1, [
+      movdqa	%xmm11, 80(%rsp)
+    ])
+    ifelse(eval($2 > 12), 1, [
+      movdqa	%xmm12, 96(%rsp)
+    ])
+    ifelse(eval($2 > 13), 1, [
+      movdqa	%xmm13, 112(%rsp)
+    ])
+    ifelse(eval($2 > 14), 1, [
+      movdqa	%xmm14, 128(%rsp)
+    ])
+    ifelse(eval($2 > 15), 1, [
+      movdqa	%xmm15, 144(%rsp)
+    ])
+    ifelse(eval($1 >= 1), 1, [
+      push	%rdi
+      mov	%rcx, %rdi
+    ])
+    ifelse(eval($1 >= 2), 1, [
+      push	%rsi
+      mov	%rdx, %rsi
+    ])
+    ifelse(eval($1 >= 3), 1, [
+      mov	%r8, %rdx
+    ])
+    ifelse(eval($1 >= 4), 1, [
+      mov	%r9, %rcx
+    ])
+    ifelse(eval($1 >= 5), 1, [
+      mov	56(%rsp), %r8
+    ])
+  ])
+  changequote(<,>)dnl
+>)
+
+dnl W64_EXIT(nargs, xmm_used)
+define(<W64_EXIT>, <
+  changequote([,])dnl
+  ifelse(<<<<<<<<<<<< ignored; only for balancing)
+  ifelse(W64_ABI,yes,[
+    ifelse(eval($1 >= 2), 1, [
+      pop	%rsi
+    ])
+    ifelse(eval($1 >= 1), 1, [
+      pop	%rdi
+    ])
+    ifelse(eval($2 > 15), 1, [
+      movdqa	144(%rsp), %xmm15
+    ])
+    ifelse(eval($2 > 14), 1, [
+      movdqa	128(%rsp), %xmm14
+    ])
+    ifelse(eval($2 > 13), 1, [
+      movdqa	112(%rsp), %xmm13
+    ])
+    ifelse(eval($2 > 12), 1, [
+      movdqa	96(%rsp), %xmm12
+    ])
+    ifelse(eval($2 > 11), 1, [
+      movdqa	80(%rsp), %xmm11
+    ])
+    ifelse(eval($2 > 10), 1, [
+      movdqa	64(%rsp), %xmm10
+    ])
+    ifelse(eval($2 > 9), 1, [
+      movdqa	48(%rsp), %xmm9
+    ])
+    ifelse(eval($2 > 8), 1, [
+      movdqa	32(%rsp), %xmm8
+    ])
+    ifelse(eval($2 > 7), 1, [
+      movdqa	16(%rsp), %xmm7
+    ])
+    ifelse(eval($2 > 6), 1, [
+      movdqa	0(%rsp), %xmm6
+      add	[$]eval(8 + 16*($2 - 6)), %rsp
+    ])
+  ])
+  changequote(<,>)dnl
+>)