xref: /minix3/lib/libm/arch/i387/abi.h (revision 84d9c625bfea59e274550651111ae9edfdc40fbd)
1*84d9c625SLionel Sambuc /*	$NetBSD: abi.h,v 1.8 2013/09/12 15:36:16 joerg Exp $	*/
22fe8fb19SBen Gras 
32fe8fb19SBen Gras /*
42fe8fb19SBen Gras  * Written by Frank van der Linden (fvdl@wasabisystems.com)
52fe8fb19SBen Gras  */
62fe8fb19SBen Gras 
72fe8fb19SBen Gras /*
8*84d9c625SLionel Sambuc  * The x86-64 ABI specifies that float and double arguments
9*84d9c625SLionel Sambuc  * are passed in SSE2 (xmm) registers. Unfortunately,
102fe8fb19SBen Gras  * there is no way to push those on to the FP stack, which is
112fe8fb19SBen Gras  * where the fancier instructions get their arguments from.
122fe8fb19SBen Gras  *
132fe8fb19SBen Gras  * Define some prologues and epilogues to store and retrieve
142fe8fb19SBen Gras  * xmm regs to local variables.
152fe8fb19SBen Gras  */
162fe8fb19SBen Gras 
172fe8fb19SBen Gras #ifdef __x86_64__
182fe8fb19SBen Gras 
19*84d9c625SLionel Sambuc #define ARG_LONG_DOUBLE_ONE	8(%rsp)
20*84d9c625SLionel Sambuc #define ARG_LONG_DOUBLE_TWO	24(%rsp)
212fe8fb19SBen Gras #define ARG_DOUBLE_ONE		-8(%rsp)
222fe8fb19SBen Gras #define ARG_DOUBLE_ONE_LSW	-8(%rsp)
232fe8fb19SBen Gras #define ARG_DOUBLE_ONE_MSW	-4(%rsp)
242fe8fb19SBen Gras #define ARG_DOUBLE_TWO		-16(%rsp)
252fe8fb19SBen Gras #define ARG_FLOAT_ONE		-4(%rsp)
262fe8fb19SBen Gras #define ARG_FLOAT_TWO		-8(%rsp)
272fe8fb19SBen Gras 
282fe8fb19SBen Gras #define XMM_ONE_ARG_DOUBLE_PROLOGUE \
292fe8fb19SBen Gras 	movsd	%xmm0, ARG_DOUBLE_ONE
302fe8fb19SBen Gras 
312fe8fb19SBen Gras #define XMM_TWO_ARG_DOUBLE_PROLOGUE \
322fe8fb19SBen Gras 	movsd	%xmm0, ARG_DOUBLE_ONE ; \
332fe8fb19SBen Gras 	movsd	%xmm1, ARG_DOUBLE_TWO
342fe8fb19SBen Gras 
352fe8fb19SBen Gras #define XMM_ONE_ARG_FLOAT_PROLOGUE \
362fe8fb19SBen Gras 	movss	%xmm0, ARG_FLOAT_ONE
372fe8fb19SBen Gras 
382fe8fb19SBen Gras #define XMM_TWO_ARG_FLOAT_PROLOGUE \
392fe8fb19SBen Gras 	movss	%xmm0, ARG_FLOAT_ONE ; \
402fe8fb19SBen Gras 	movss	%xmm1, ARG_FLOAT_TWO
412fe8fb19SBen Gras 
422fe8fb19SBen Gras #define XMM_DOUBLE_EPILOGUE \
432fe8fb19SBen Gras 	fstpl ARG_DOUBLE_ONE ; \
442fe8fb19SBen Gras 	movsd ARG_DOUBLE_ONE, %xmm0
452fe8fb19SBen Gras 
462fe8fb19SBen Gras #define XMM_FLOAT_EPILOGUE \
472fe8fb19SBen Gras 	fstps ARG_FLOAT_ONE ; \
482fe8fb19SBen Gras 	movss ARG_FLOAT_ONE, %xmm0
492fe8fb19SBen Gras 
502fe8fb19SBen Gras #define FLDL_VAR(x)	fldl x(%rip)
512fe8fb19SBen Gras 
522fe8fb19SBen Gras #else
532fe8fb19SBen Gras 
54*84d9c625SLionel Sambuc #define ARG_LONG_DOUBLE_ONE	4(%esp)
55*84d9c625SLionel Sambuc #define ARG_LONG_DOUBLE_TWO	16(%esp)
562fe8fb19SBen Gras #define ARG_DOUBLE_ONE		4(%esp)
572fe8fb19SBen Gras #define ARG_DOUBLE_ONE_LSW	4(%esp)
582fe8fb19SBen Gras #define ARG_DOUBLE_ONE_MSW	8(%esp)
592fe8fb19SBen Gras #define ARG_DOUBLE_TWO		12(%esp)
602fe8fb19SBen Gras #define ARG_FLOAT_ONE		4(%esp)
612fe8fb19SBen Gras #define ARG_FLOAT_TWO		8(%esp)
622fe8fb19SBen Gras 
632fe8fb19SBen Gras #define XMM_ONE_ARG_DOUBLE_PROLOGUE
642fe8fb19SBen Gras #define XMM_TWO_ARG_DOUBLE_PROLOGUE
652fe8fb19SBen Gras #define XMM_ONE_ARG_FLOAT_PROLOGUE
662fe8fb19SBen Gras #define XMM_TWO_ARG_FLOAT_PROLOGUE
672fe8fb19SBen Gras 
682fe8fb19SBen Gras #define XMM_DOUBLE_EPILOGUE
692fe8fb19SBen Gras #define XMM_FLOAT_EPILOGUE
702fe8fb19SBen Gras 
71*84d9c625SLionel Sambuc #ifdef __PIC__
722fe8fb19SBen Gras #define FLDL_VAR(x) \
732fe8fb19SBen Gras 	PIC_PROLOGUE ; \
742fe8fb19SBen Gras 	fldl PIC_GOTOFF(x) ; \
752fe8fb19SBen Gras 	PIC_EPILOGUE
762fe8fb19SBen Gras #else
772fe8fb19SBen Gras #define FLDL_VAR(x) \
782fe8fb19SBen Gras 	fldl x
792fe8fb19SBen Gras 
802fe8fb19SBen Gras #endif
812fe8fb19SBen Gras #endif
82