1*05a0b428SJohn Marino /* $OpenBSD: abi.h,v 1.4 2010/06/03 16:38:50 deraadt Exp $ */ 2*05a0b428SJohn Marino /* $NetBSD: abi.h,v 1.2 2003/09/14 21:26:14 fvdl Exp $ */ 3*05a0b428SJohn Marino 4*05a0b428SJohn Marino /* 5*05a0b428SJohn Marino * Written by Frank van der Linden (fvdl@wasabisystems.com) 6*05a0b428SJohn Marino */ 7*05a0b428SJohn Marino 8*05a0b428SJohn Marino /* 9*05a0b428SJohn Marino * The x86-64 ABI specifies that float, double and long double 10*05a0b428SJohn Marino * arguments are passed in SSE2 (xmm) registers. Unfortunately, 11*05a0b428SJohn Marino * there is no way to push those on to the FP stack, which is 12*05a0b428SJohn Marino * where the fancier instructions get their arguments from. 13*05a0b428SJohn Marino * 14*05a0b428SJohn Marino * Define some prologues and epilogues to store and retrieve 15*05a0b428SJohn Marino * xmm regs to local variables. 16*05a0b428SJohn Marino */ 17*05a0b428SJohn Marino 18*05a0b428SJohn Marino #define ARG_DOUBLE_ONE -8(%rsp) 19*05a0b428SJohn Marino #define ARG_DOUBLE_TWO -16(%rsp) 20*05a0b428SJohn Marino #define ARG_FLOAT_ONE -4(%rsp) 21*05a0b428SJohn Marino #define ARG_FLOAT_TWO -8(%rsp) 22*05a0b428SJohn Marino 23*05a0b428SJohn Marino #define XMM_ONE_ARG_DOUBLE_PROLOGUE \ 24*05a0b428SJohn Marino movsd %xmm0, ARG_DOUBLE_ONE 25*05a0b428SJohn Marino 26*05a0b428SJohn Marino #define XMM_TWO_ARG_DOUBLE_PROLOGUE \ 27*05a0b428SJohn Marino movsd %xmm0, ARG_DOUBLE_ONE ; \ 28*05a0b428SJohn Marino movsd %xmm1, ARG_DOUBLE_TWO 29*05a0b428SJohn Marino 30*05a0b428SJohn Marino #define XMM_ONE_ARG_FLOAT_PROLOGUE \ 31*05a0b428SJohn Marino movss %xmm0, ARG_FLOAT_ONE 32*05a0b428SJohn Marino 33*05a0b428SJohn Marino #define XMM_TWO_ARG_FLOAT_PROLOGUE \ 34*05a0b428SJohn Marino movss %xmm0, ARG_FLOAT_ONE ; \ 35*05a0b428SJohn Marino movss %xmm1, ARG_FLOAT_TWO 36*05a0b428SJohn Marino 37*05a0b428SJohn Marino #define XMM_DOUBLE_EPILOGUE \ 38*05a0b428SJohn Marino fstpl ARG_DOUBLE_ONE ; \ 39*05a0b428SJohn Marino movsd ARG_DOUBLE_ONE, %xmm0 40*05a0b428SJohn Marino 41*05a0b428SJohn Marino #define XMM_FLOAT_EPILOGUE \ 42*05a0b428SJohn Marino fstps ARG_FLOAT_ONE ; \ 43*05a0b428SJohn Marino movss ARG_FLOAT_ONE, %xmm0 44*05a0b428SJohn Marino 45*05a0b428SJohn Marino #define FLDL_VAR(x) fldl x(%rip) 46*05a0b428SJohn Marino 47