1 /* $NetBSD: abi.h,v 1.3 2004/03/22 13:41:09 wiz 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 the 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 46 #define FLDL_VAR(x) fldl x(%rip) 47 48 #else 49 50 #define ARG_DOUBLE_ONE 4(%esp) 51 #define ARG_DOUBLE_TWO 12(%esp) 52 #define ARG_FLOAT_ONE 4(%esp) 53 #define ARG_FLOAT_TWO 8(%esp) 54 55 #define XMM_ONE_ARG_DOUBLE_PROLOGUE 56 #define XMM_TWO_ARG_DOUBLE_PROLOGUE 57 #define XMM_ONE_ARG_FLOAT_PROLOGUE 58 #define XMM_TWO_ARG_FLOAT_PROLOGUE 59 60 #define XMM_DOUBLE_EPILOGUE 61 #define XMM_FLOAT_EPILOGUE 62 63 #ifdef PIC 64 #define FLDL_VAR(x) \ 65 PIC_PROLOGUE ; \ 66 fldl PIC_GOTOFF(x) ; \ 67 PIC_EPILOGUE 68 #else 69 #define FLDL_VAR(x) \ 70 fldl x 71 72 #endif 73 #endif 74