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