comparison dyncallback/dyncall_callback_x64.S @ 0:3e629dc19168

initial from svn dyncall-1745
author Daniel Adler
date Thu, 19 Mar 2015 22:24:28 +0100
parents
children 572aff021627
comparison
equal deleted inserted replaced
-1:000000000000 0:3e629dc19168
1 /*
2
3 Package: dyncall
4 Library: dyncallback
5 File: dyncallback/dyncall_callback_x64.S
6 Description: Callback Thunk entry for x64 (portasm version)
7 License:
8
9 Copyright (c) 2011-2015 Daniel Adler <dadler@uni-goettingen.de>
10
11 Permission to use, copy, modify, and distribute this software for any
12 purpose with or without fee is hereby granted, provided that the above
13 copyright notice and this permission notice appear in all copies.
14
15 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
16 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
17 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
18 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
21 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22
23 */
24
25
26
27 #include "../portasm/portasm-x64-att.S"
28
29 /* structure sizes */
30
31 SET(DCThunk_size,24)
32 SET(DCArgs_size_win64,80)
33 SET(DCArgs_size_sysv,128)
34 SET(DCValue_size,8)
35
36 /* frame local variable offsets relative to %rbp*/
37
38 SET(FRAME_arg0_win64,48)
39 SET(FRAME_arg0_sysv,16)
40 SET(FRAME_return,8)
41 SET(FRAME_parent,0)
42 SET(FRAME_DCArgs_sysv,-128)
43 SET(FRAME_DCValue_sysv,-136)
44 SET(FRAME_DCArgs_win64,-80)
45 SET(FRAME_DCValue_win64,-80)
46
47 /* struct DCCallback */
48
49 SET(CTX_thunk,0)
50 SET(CTX_handler,24)
51 SET(CTX_userdata,32)
52 SET(DCCallback_size,40)
53
54 /* character constants */
55
56 #define ASCII_f 102
57 #define ASCII_d 100
58
59 GLOBAL(dcCallback_x64_sysv)
60 BEGIN_PROC(dcCallback_x64_sysv)
61
62 PUSH(RBP)
63 MOV(RSP,RBP)
64
65 /* initialize DCArgs */
66
67 /* float parameters (8 registers spill to DCArgs) */
68
69 SUB(LIT(8*8),RSP)
70
71 MOVSD(XMM7, QWORD(RSP,8*7)) /* struct offset 120: float parameter 7 */
72 MOVSD(XMM6, QWORD(RSP,8*6)) /* struct offset 112: float parameter 6 */
73 MOVSD(XMM5, QWORD(RSP,8*5)) /* struct offset 104: float parameter 5 */
74 MOVSD(XMM4, QWORD(RSP,8*4)) /* struct offset 96: float parameter 4 */
75 MOVSD(XMM3, QWORD(RSP,8*3)) /* struct offset 88: float parameter 3 */
76 MOVSD(XMM2, QWORD(RSP,8*2)) /* struct offset 80: float parameter 2 */
77 MOVSD(XMM1, QWORD(RSP,8*1)) /* struct offset 72: float parameter 1 */
78 MOVSD(XMM0, QWORD(RSP,8*0)) /* struct offset 64: float parameter 0 */
79
80 /* integer parameters (6 registers spill to DCArgs) */
81
82 PUSH(R9) /* struct offset 56: parameter 5 */
83 PUSH(R8) /* struct offset 48: parameter 4 */
84 PUSH(RCX) /* struct offset 40: parameter 3 */
85 PUSH(RDX) /* struct offset 32: parameter 2 */
86 PUSH(RSI) /* struct offset 24: parameter 1 */
87 PUSH(RDI) /* struct offset 16: parameter 0 */
88
89 /* register counts for integer/pointer and float regs */
90
91 PUSH(LIT(0)) /* struct offset 12: fcount */
92 /* struct offset 8: icount */
93
94 LEA(QWORD(RBP,FRAME_arg0_sysv),RDX) /* struct offset 0: stack pointer */
95 PUSH(RDX)
96
97 MOV(RSP,RSI) /* arg 1 RSI : DCArgs* */
98
99 /* initialize DCValue */
100
101 PUSH(LIT(0)) /* struct offset 0: return value (max long long) */
102
103 /* call handler( *ctx, *args, *value, *userdata) */
104
105 MOV(RAX,RDI) /* arg 0 RDI : DCCallback* (RAX) */
106 MOV(QWORD(RDI,CTX_userdata),RCX) /* arg 3 RCX : userdata* */
107 MOV(RSP,RDX) /* arg 2 RDX : DCValue* */
108 PUSH(LIT(0)) /* align to 16 bytes */
109 CALL_REG(QWORD(RAX,CTX_handler))
110
111 /* pass return type via registers, handle ints and floats */
112
113 MOV(QWORD(RBP,FRAME_DCValue_sysv),RAX)
114 MOVD(RAX,XMM0)
115
116 MOV(RBP,RSP)
117 POP(RBP)
118 RET()
119
120 END_PROC(dcCallback_x64_sysv)
121
122 GLOBAL(dcCallback_x64_win64)
123 BEGIN_PROC(dcCallback_x64_win64)
124
125 PUSH(RBP)
126 MOV(RSP,RBP)
127
128 /* initialize DCArgs */
129
130 /* float parameters (4 registers spill to DCArgs) */
131
132 SUB(LIT(4*8),RSP)
133
134 MOVSD(XMM3, QWORD(RSP,8*3)) /* struct offset 72: float parameter 3 */
135 MOVSD(XMM2, QWORD(RSP,8*2)) /* struct offset 64: float parameter 2 */
136 MOVSD(XMM1, QWORD(RSP,8*1)) /* struct offset 56: float parameter 1 */
137 MOVSD(XMM0, QWORD(RSP,8*0)) /* struct offset 48: float parameter 0 */
138
139 /* integer parameters (4 registers spill to DCArgs) */
140
141 PUSH(R9) /* struct offset 40: parameter 3 */
142 PUSH(R8) /* struct offset 32: parameter 2 */
143 PUSH(RDX) /* struct offset 24: parameter 1 */
144 PUSH(RCX) /* struct offset 16: parameter 0 */
145
146 /* register counts for integer/pointer and float regs */
147
148 PUSH(LIT(0)) /* struct offset 12: fcount */
149 /* struct offset 8: icount */
150
151 LEA(QWORD(RBP,FRAME_arg0_win64),RDX) /* struct offset 0: stack pointer */
152 PUSH(RDX)
153
154 MOV(RSP,RDX) /* arg 1 RDX : DCArgs* */
155
156 /* initialize DCValue */
157
158 // PUSHQ(LIT(0)) /* struct offset 0: return value (max long long) */
159
160 /* call handler( *ctx, *args, *value, *userdata) */
161
162 MOV(RAX,RCX) /* arg 0 RCX : DCCallback* (RAX) */
163 MOV(QWORD(RAX,CTX_userdata),R9) /* arg 3 R9 : userdata* */
164 MOV(RSP,R8) /* arg 2 R8 : DCValue* */
165 SUB(LIT(4*8),RSP) /* make room for spill area and call */
166 CALL_REG(QWORD(RAX,CTX_handler))
167
168 /* pass return type via registers, handle ints and floats */
169
170 MOV(QWORD(RBP,FRAME_DCValue_win64),RAX)
171 MOVD(RAX,XMM0)
172
173 MOV(RBP,RSP)
174 POP(RBP)
175 RET()
176
177 END_PROC(dcCallback_x64_win64)
178
179 END_ASM
180