3d45ba0d128a47a1f88956c91af2fe646bd6c762
[dragonfly.git] / lib / libm / arch / i386 / abi.h
1 /*
2  * Written by Frank van der Linden (fvdl@wasabisystems.com)
3  *
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 $
6  */
7
8 /*
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.
13  *
14  * Define some prologues and epilogues to store and retrieve
15  * xmm regs to local variables.
16  */
17
18 #ifdef __x86_64__
19
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)
24
25 #define XMM_ONE_ARG_DOUBLE_PROLOGUE \
26         movsd   %xmm0, ARG_DOUBLE_ONE
27         
28 #define XMM_TWO_ARG_DOUBLE_PROLOGUE \
29         movsd   %xmm0, ARG_DOUBLE_ONE ; \
30         movsd   %xmm1, ARG_DOUBLE_TWO
31
32 #define XMM_ONE_ARG_FLOAT_PROLOGUE \
33         movss   %xmm0, ARG_FLOAT_ONE
34
35 #define XMM_TWO_ARG_FLOAT_PROLOGUE \
36         movss   %xmm0, ARG_FLOAT_ONE ; \
37         movss   %xmm1, ARG_FLOAT_TWO
38
39 #define XMM_DOUBLE_EPILOGUE \
40         fstpl ARG_DOUBLE_ONE ; \
41         movsd ARG_DOUBLE_ONE, %xmm0
42
43 #define XMM_FLOAT_EPILOGUE \
44         fstps ARG_FLOAT_ONE ; \
45         movss ARG_FLOAT_ONE, %xmm0
46
47 #define FLDL_VAR(x)     fldl x(%rip)
48
49 #else
50
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)
55
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
60
61 #define XMM_DOUBLE_EPILOGUE
62 #define XMM_FLOAT_EPILOGUE
63
64 #ifdef PIC
65 #define FLDL_VAR(x) \
66         PIC_PROLOGUE ; \
67         fldl PIC_GOTOFF(x) ; \
68         PIC_EPILOGUE
69 #else
70 #define FLDL_VAR(x) \
71         fldl x
72
73 #endif
74 #endif