1 /* $NetBSD: abi.h,v 1.1 2001/06/19 00:26:29 fvdl Exp $ */ 2 3 /* 4 * Written by Frank van der Linden (fvdl@wasabisystems.com) 5 */ 6 7 /* 8 * The x86-64 ABI specifies that float, double and long double 9 * arguments are passed in SSE2 (xmm) registers. Unfortunately, 10 * there is no way to push those on to the FP stack, which is 11 * where he fancier instructions get their arguments from. 12 * 13 * Define some prologues and epilogues to store and retrieve 14 * xmm regs to local variables. 15 */ 16 17 #ifdef __x86_64__ 18 19 #define ARG_DOUBLE_ONE -8(%rsp) 20 #define ARG_DOUBLE_TWO -16(%rsp) 21 #define ARG_FLOAT_ONE -4(%rsp) 22 #define ARG_FLOAT_TWO -8(%rsp) 23 24 #define XMM_ONE_ARG_DOUBLE_PROLOGUE \ 25 movsd %xmm0, ARG_DOUBLE_ONE 26 27 #define XMM_TWO_ARG_DOUBLE_PROLOGUE \ 28 movsd %xmm0, ARG_DOUBLE_ONE ; \ 29 movsd %xmm1, ARG_DOUBLE_TWO 30 31 #define XMM_ONE_ARG_FLOAT_PROLOGUE \ 32 movss %xmm0, ARG_FLOAT_ONE 33 34 #define XMM_TWO_ARG_FLOAT_PROLOGUE \ 35 movss %xmm0, ARG_FLOAT_ONE ; \ 36 movss %xmm1, ARG_FLOAT_TWO 37 38 #define XMM_DOUBLE_EPILOGUE \ 39 fstpl ARG_DOUBLE_ONE ; \ 40 movsd ARG_DOUBLE_ONE, %xmm0 41 42 #define XMM_FLOAT_EPILOGUE \ 43 fstps ARG_FLOAT_ONE ; \ 44 movss ARG_FLOAT_ONE, %xmm0 45 #else 46 47 #define ARG_DOUBLE_ONE 4(%esp) 48 #define ARG_DOUBLE_TWO 12(%esp) 49 #define ARG_FLOAT_ONE 4(%esp) 50 #define ARG_FLOAT_TWO 8(%esp) 51 52 #define XMM_ONE_ARG_DOUBLE_PROLOGUE 53 #define XMM_TWO_ARG_DOUBLE_PROLOGUE 54 #define XMM_ONE_ARG_FLOAT_PROLOGUE 55 #define XMM_TWO_ARG_FLOAT_PROLOGUE 56 57 #define XMM_DOUBLE_EPILOGUE 58 #define XMM_FLOAT_EPILOGUE 59 60 #endif 61