this repo has no description
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*/