xref: /netbsd-src/lib/libm/arch/i387/abi.h (revision 4d12bfcd155352508213ace5ccc59ce930ea2974)
1*4d12bfcdSjoerg /*	$NetBSD: abi.h,v 1.8 2013/09/12 15:36:16 joerg Exp $	*/
28ecba6c6Sfvdl 
38ecba6c6Sfvdl /*
48ecba6c6Sfvdl  * Written by Frank van der Linden (fvdl@wasabisystems.com)
58ecba6c6Sfvdl  */
68ecba6c6Sfvdl 
78ecba6c6Sfvdl /*
847980a56Sjoerg  * The x86-64 ABI specifies that float and double arguments
947980a56Sjoerg  * are passed in SSE2 (xmm) registers. Unfortunately,
108ecba6c6Sfvdl  * there is no way to push those on to the FP stack, which is
11848e6898Swiz  * where the fancier instructions get their arguments from.
128ecba6c6Sfvdl  *
138ecba6c6Sfvdl  * Define some prologues and epilogues to store and retrieve
148ecba6c6Sfvdl  * xmm regs to local variables.
158ecba6c6Sfvdl  */
168ecba6c6Sfvdl 
178ecba6c6Sfvdl #ifdef __x86_64__
188ecba6c6Sfvdl 
1947980a56Sjoerg #define ARG_LONG_DOUBLE_ONE	8(%rsp)
2047980a56Sjoerg #define ARG_LONG_DOUBLE_TWO	24(%rsp)
218ecba6c6Sfvdl #define ARG_DOUBLE_ONE		-8(%rsp)
22bc43bac5Sdrochner #define ARG_DOUBLE_ONE_LSW	-8(%rsp)
23bc43bac5Sdrochner #define ARG_DOUBLE_ONE_MSW	-4(%rsp)
248ecba6c6Sfvdl #define ARG_DOUBLE_TWO		-16(%rsp)
258ecba6c6Sfvdl #define ARG_FLOAT_ONE		-4(%rsp)
268ecba6c6Sfvdl #define ARG_FLOAT_TWO		-8(%rsp)
278ecba6c6Sfvdl 
288ecba6c6Sfvdl #define XMM_ONE_ARG_DOUBLE_PROLOGUE \
298ecba6c6Sfvdl 	movsd	%xmm0, ARG_DOUBLE_ONE
308ecba6c6Sfvdl 
318ecba6c6Sfvdl #define XMM_TWO_ARG_DOUBLE_PROLOGUE \
328ecba6c6Sfvdl 	movsd	%xmm0, ARG_DOUBLE_ONE ; \
338ecba6c6Sfvdl 	movsd	%xmm1, ARG_DOUBLE_TWO
348ecba6c6Sfvdl 
358ecba6c6Sfvdl #define XMM_ONE_ARG_FLOAT_PROLOGUE \
368ecba6c6Sfvdl 	movss	%xmm0, ARG_FLOAT_ONE
378ecba6c6Sfvdl 
388ecba6c6Sfvdl #define XMM_TWO_ARG_FLOAT_PROLOGUE \
398ecba6c6Sfvdl 	movss	%xmm0, ARG_FLOAT_ONE ; \
408ecba6c6Sfvdl 	movss	%xmm1, ARG_FLOAT_TWO
418ecba6c6Sfvdl 
428ecba6c6Sfvdl #define XMM_DOUBLE_EPILOGUE \
438ecba6c6Sfvdl 	fstpl ARG_DOUBLE_ONE ; \
448ecba6c6Sfvdl 	movsd ARG_DOUBLE_ONE, %xmm0
458ecba6c6Sfvdl 
468ecba6c6Sfvdl #define XMM_FLOAT_EPILOGUE \
478ecba6c6Sfvdl 	fstps ARG_FLOAT_ONE ; \
488ecba6c6Sfvdl 	movss ARG_FLOAT_ONE, %xmm0
498eb02ce5Sfvdl 
508eb02ce5Sfvdl #define FLDL_VAR(x)	fldl x(%rip)
518eb02ce5Sfvdl 
528ecba6c6Sfvdl #else
538ecba6c6Sfvdl 
5417f4d79dSjoerg #define ARG_LONG_DOUBLE_ONE	4(%esp)
5517f4d79dSjoerg #define ARG_LONG_DOUBLE_TWO	16(%esp)
568ecba6c6Sfvdl #define ARG_DOUBLE_ONE		4(%esp)
57bc43bac5Sdrochner #define ARG_DOUBLE_ONE_LSW	4(%esp)
58bc43bac5Sdrochner #define ARG_DOUBLE_ONE_MSW	8(%esp)
598ecba6c6Sfvdl #define ARG_DOUBLE_TWO		12(%esp)
608ecba6c6Sfvdl #define ARG_FLOAT_ONE		4(%esp)
618ecba6c6Sfvdl #define ARG_FLOAT_TWO		8(%esp)
628ecba6c6Sfvdl 
638ecba6c6Sfvdl #define XMM_ONE_ARG_DOUBLE_PROLOGUE
648ecba6c6Sfvdl #define XMM_TWO_ARG_DOUBLE_PROLOGUE
658ecba6c6Sfvdl #define XMM_ONE_ARG_FLOAT_PROLOGUE
668ecba6c6Sfvdl #define XMM_TWO_ARG_FLOAT_PROLOGUE
678ecba6c6Sfvdl 
688ecba6c6Sfvdl #define XMM_DOUBLE_EPILOGUE
698ecba6c6Sfvdl #define XMM_FLOAT_EPILOGUE
708ecba6c6Sfvdl 
71*4d12bfcdSjoerg #ifdef __PIC__
728eb02ce5Sfvdl #define FLDL_VAR(x) \
738eb02ce5Sfvdl 	PIC_PROLOGUE ; \
748eb02ce5Sfvdl 	fldl PIC_GOTOFF(x) ; \
758eb02ce5Sfvdl 	PIC_EPILOGUE
768eb02ce5Sfvdl #else
778eb02ce5Sfvdl #define FLDL_VAR(x) \
788eb02ce5Sfvdl 	fldl x
798eb02ce5Sfvdl 
808eb02ce5Sfvdl #endif
818ecba6c6Sfvdl #endif
82