this repo has no description
at fixPythonPipStalling 136 lines 3.8 kB view raw
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// 18// Define some overrideable constants 19// Default settings are for minimum stack frame, all arguments are long double 20// 21// LOCAL_STACK_SIZE -- number of bytes in addition to the return pointer that the stack frame holds 22// FIRST_ARG_SIZE -- number of bytes used on the stack by the first argument (if passed on the stack) 23// SECOND_ARG_SIZE -- number of bytes used on the stack by the second argument (if passed on the stack) 24// 25#ifndef LOCAL_STACK_SIZE 26 #define LOCAL_STACK_SIZE 0 27#endif 28#ifndef FIRST_ARG_SIZE 29 #define FIRST_ARG_SIZE 16 30#endif 31#ifndef SECOND_ARG_SIZE 32 #define SECOND_ARG_SIZE 16 33#endif 34 35 36#if defined( __LP64__ ) 37 #define FRAME_SIZE 8 /* sizeof( void*) */ 38 #define STACKP %rsp 39 #define BASEP %rbp 40 #define AX_P %rax 41 #define BX_P %rbx 42 #define CX_P %rcx 43 #define DX_P %rdx 44 #define SIGN_EXTEND_EAX cdqe 45 #define ADDP addq 46 #define CALLP callq 47 #define FISTPP fistpll 48 #define FISTTPP fisttpll 49 #define MOVP movq 50 #define NEGP negq 51 #define SUBP subq 52 #define XORP xorq 53#else 54 #define FRAME_SIZE 4 /* sizeof( void*) */ 55 #define STACKP %esp 56 #define BASEP %ebp 57 #define AX_P %eax 58 #define BX_P %ebx 59 #define CX_P %ecx 60 #define DX_P %edx 61 #define SIGN_EXTEND_EAX 62 #define ADDP addl 63 #define FISTPP fistpl 64 #define FISTTPP fisttpl 65 #define MOVP movl 66 #define NEGP negl 67 #define SUBP subl 68 #define XORP xorl 69 #define CALLP calll 70#endif 71 72#define FIRST_ARG_OFFSET (FRAME_SIZE + LOCAL_STACK_SIZE) 73#define SECOND_ARG_OFFSET (FIRST_ARG_OFFSET + FIRST_ARG_SIZE) 74#define THIRD_ARG_OFFSET (SECOND_ARG_OFFSET + SECOND_ARG_SIZE) 75 76/* 77#ifdef __LP64__ 78 79#error these interfaces appear to violate the red zone 80 81 #define ARG_LONG_DOUBLE_ONE -4(%esp) 82 #define ARG_LONG_DOUBLE_TWO -20(%esp) 83 #define ARG_DOUBLE_ONE -8(%rsp) 84 #define ARG_DOUBLE_TWO -16(%rsp) 85 #define ARG_FLOAT_ONE -4(%rsp) 86 #define ARG_FLOAT_TWO -8(%rsp) 87 88 #define XMM_ONE_ARG_LONG_DOUBLE_PROLOGUE 89 #define XMM_TWO_ARG_LONG_DOUBLE_PROLOGUE 90 91 #define XMM_ONE_ARG_DOUBLE_PROLOGUE \ 92 movsd %xmm0, ARG_DOUBLE_ONE 93 94 #define XMM_TWO_ARG_DOUBLE_PROLOGUE \ 95 movsd %xmm0, ARG_DOUBLE_ONE ; \ 96 movsd %xmm1, ARG_DOUBLE_TWO 97 98 #define XMM_ONE_ARG_FLOAT_PROLOGUE \ 99 movss %xmm0, ARG_FLOAT_ONE 100 101 #define XMM_TWO_ARG_FLOAT_PROLOGUE \ 102 movss %xmm0, ARG_FLOAT_ONE ; \ 103 movss %xmm1, ARG_FLOAT_TWO 104 105 #define XMM_LONG_DOUBLE_EPILOGUE 106 107 #define XMM_DOUBLE_EPILOGUE \ 108 fstpl ARG_DOUBLE_ONE ; \ 109 movsd ARG_DOUBLE_ONE, %xmm0 110 111 #define XMM_FLOAT_EPILOGUE \ 112 fstps ARG_FLOAT_ONE ; \ 113 movss ARG_FLOAT_ONE, %xmm0 114 115#else 116 117 #define ARG_LONG_DOUBLE_ONE 4(%esp) 118 #define ARG_LONG_DOUBLE_TWO 20(%esp) 119 #define ARG_DOUBLE_ONE 4(%esp) 120 #define ARG_DOUBLE_TWO 12(%esp) 121 #define ARG_FLOAT_ONE 4(%esp) 122 #define ARG_FLOAT_TWO 8(%esp) 123 124 #define XMM_ONE_ARG_LONG_DOUBLE_PROLOGUE 125 #define XMM_TWO_ARG_LONG_DOUBLE_PROLOGUE 126 #define XMM_ONE_ARG_DOUBLE_PROLOGUE 127 #define XMM_TWO_ARG_DOUBLE_PROLOGUE 128 #define XMM_ONE_ARG_FLOAT_PROLOGUE 129 #define XMM_TWO_ARG_FLOAT_PROLOGUE 130 131 #define XMM_LONG_DOUBLE_EPILOGUE 132 #define XMM_DOUBLE_EPILOGUE 133 #define XMM_FLOAT_EPILOGUE 134 135#endif 136*/