2 * Written by Frank van der Linden (fvdl@wasabisystems.com)
4 * $NetBSD: abi.h,v 1.3 2004/03/22 13:41:09 wiz Exp $
5 * $DragonFly: src/lib/libm/arch/i386/abi.h,v 1.1 2005/07/26 21:15:19 joerg Exp $
9 * The x86-64 ABI specifies that float, double and long double
10 * arguments are passed in SSE2 (xmm) registers. Unfortunately,
11 * there is no way to push those on to the FP stack, which is
12 * where the fancier instructions get their arguments from.
14 * Define some prologues and epilogues to store and retrieve
15 * xmm regs to local variables.
20 #define ARG_DOUBLE_ONE -8(%rsp)
21 #define ARG_DOUBLE_TWO -16(%rsp)
22 #define ARG_FLOAT_ONE -4(%rsp)
23 #define ARG_FLOAT_TWO -8(%rsp)
25 #define XMM_ONE_ARG_DOUBLE_PROLOGUE \
26 movsd %xmm0, ARG_DOUBLE_ONE
28 #define XMM_TWO_ARG_DOUBLE_PROLOGUE \
29 movsd %xmm0, ARG_DOUBLE_ONE ; \
30 movsd %xmm1, ARG_DOUBLE_TWO
32 #define XMM_ONE_ARG_FLOAT_PROLOGUE \
33 movss %xmm0, ARG_FLOAT_ONE
35 #define XMM_TWO_ARG_FLOAT_PROLOGUE \
36 movss %xmm0, ARG_FLOAT_ONE ; \
37 movss %xmm1, ARG_FLOAT_TWO
39 #define XMM_DOUBLE_EPILOGUE \
40 fstpl ARG_DOUBLE_ONE ; \
41 movsd ARG_DOUBLE_ONE, %xmm0
43 #define XMM_FLOAT_EPILOGUE \
44 fstps ARG_FLOAT_ONE ; \
45 movss ARG_FLOAT_ONE, %xmm0
47 #define FLDL_VAR(x) fldl x(%rip)
51 #define ARG_DOUBLE_ONE 4(%esp)
52 #define ARG_DOUBLE_TWO 12(%esp)
53 #define ARG_FLOAT_ONE 4(%esp)
54 #define ARG_FLOAT_TWO 8(%esp)
56 #define XMM_ONE_ARG_DOUBLE_PROLOGUE
57 #define XMM_TWO_ARG_DOUBLE_PROLOGUE
58 #define XMM_ONE_ARG_FLOAT_PROLOGUE
59 #define XMM_TWO_ARG_FLOAT_PROLOGUE
61 #define XMM_DOUBLE_EPILOGUE
62 #define XMM_FLOAT_EPILOGUE
67 fldl PIC_GOTOFF(x) ; \