xref: /dflybsd-src/contrib/openbsd_libm/arch/amd64/abi.h (revision 4382f29d99a100bd77a81697c2f699c11f6a472a)
1*05a0b428SJohn Marino /*	$OpenBSD: abi.h,v 1.4 2010/06/03 16:38:50 deraadt Exp $	*/
2*05a0b428SJohn Marino /*	$NetBSD: abi.h,v 1.2 2003/09/14 21:26:14 fvdl Exp $	*/
3*05a0b428SJohn Marino 
4*05a0b428SJohn Marino /*
5*05a0b428SJohn Marino  * Written by Frank van der Linden (fvdl@wasabisystems.com)
6*05a0b428SJohn Marino  */
7*05a0b428SJohn Marino 
8*05a0b428SJohn Marino /*
9*05a0b428SJohn Marino  * The x86-64 ABI specifies that float, double and long double
10*05a0b428SJohn Marino  * arguments are passed in SSE2 (xmm) registers. Unfortunately,
11*05a0b428SJohn Marino  * there is no way to push those on to the FP stack, which is
12*05a0b428SJohn Marino  * where the fancier instructions get their arguments from.
13*05a0b428SJohn Marino  *
14*05a0b428SJohn Marino  * Define some prologues and epilogues to store and retrieve
15*05a0b428SJohn Marino  * xmm regs to local variables.
16*05a0b428SJohn Marino  */
17*05a0b428SJohn Marino 
18*05a0b428SJohn Marino #define ARG_DOUBLE_ONE		-8(%rsp)
19*05a0b428SJohn Marino #define ARG_DOUBLE_TWO		-16(%rsp)
20*05a0b428SJohn Marino #define ARG_FLOAT_ONE		-4(%rsp)
21*05a0b428SJohn Marino #define ARG_FLOAT_TWO		-8(%rsp)
22*05a0b428SJohn Marino 
23*05a0b428SJohn Marino #define XMM_ONE_ARG_DOUBLE_PROLOGUE \
24*05a0b428SJohn Marino 	movsd	%xmm0, ARG_DOUBLE_ONE
25*05a0b428SJohn Marino 
26*05a0b428SJohn Marino #define XMM_TWO_ARG_DOUBLE_PROLOGUE \
27*05a0b428SJohn Marino 	movsd	%xmm0, ARG_DOUBLE_ONE ; \
28*05a0b428SJohn Marino 	movsd	%xmm1, ARG_DOUBLE_TWO
29*05a0b428SJohn Marino 
30*05a0b428SJohn Marino #define XMM_ONE_ARG_FLOAT_PROLOGUE \
31*05a0b428SJohn Marino 	movss	%xmm0, ARG_FLOAT_ONE
32*05a0b428SJohn Marino 
33*05a0b428SJohn Marino #define XMM_TWO_ARG_FLOAT_PROLOGUE \
34*05a0b428SJohn Marino 	movss	%xmm0, ARG_FLOAT_ONE ; \
35*05a0b428SJohn Marino 	movss	%xmm1, ARG_FLOAT_TWO
36*05a0b428SJohn Marino 
37*05a0b428SJohn Marino #define XMM_DOUBLE_EPILOGUE \
38*05a0b428SJohn Marino 	fstpl ARG_DOUBLE_ONE ; \
39*05a0b428SJohn Marino 	movsd ARG_DOUBLE_ONE, %xmm0
40*05a0b428SJohn Marino 
41*05a0b428SJohn Marino #define XMM_FLOAT_EPILOGUE \
42*05a0b428SJohn Marino 	fstps ARG_FLOAT_ONE ; \
43*05a0b428SJohn Marino 	movss ARG_FLOAT_ONE, %xmm0
44*05a0b428SJohn Marino 
45*05a0b428SJohn Marino #define FLDL_VAR(x)	fldl x(%rip)
46*05a0b428SJohn Marino 
47