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