annotate dyncall/dyncall_call_x86.S @ 357:d982a00c2177

- PPC64 asm syntax fix, specifying explicitly comparison mode for cmpi (newer toolchains complain, older ones took optional field of instruction which happened to be same value)
author Tassilo Philipp
date Tue, 25 Feb 2020 18:16:13 +0100
parents ab2d78e48ca2
children fea865cd1305
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
1 /*
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
3 Package: dyncall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
4 Library: dyncall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
5 File: dyncall/dyncall_call_x86.S
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6 Description: All - except Plan9 - x86 abi call kernel implementation
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
7 License:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
8
281
f5577f6bf97a - file header cleanups for release
Tassilo Philipp
parents: 256
diff changeset
9 Copyright (c) 2007-2018 Daniel Adler <dadler@uni-goettingen.de>,
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
10 Tassilo Philipp <tphilipp@potion-studios.com>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
11
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
12 Permission to use, copy, modify, and distribute this software for any
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
13 purpose with or without fee is hereby granted, provided that the above
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
14 copyright notice and this permission notice appear in all copies.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
15
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
16 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
17 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
18 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
19 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
20 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
21 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
22 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
23
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
24 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
25
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
26
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
27
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
28 #include "../portasm/portasm-x86.S"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29 BEGIN_ASM
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30 /* ============================================================================
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31 DynCall Call Kernels for X86 Architecture
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
32 ----------------------------------------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33 C Interface:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
34 dcCall_x86_XXX(void* target, void* args, size_t size);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35 ddCall_x86_sys_XXX(int_ptr target, void* args, size_t size);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
36
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
37 Where XXX is one of calling-conventions,
165
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 0
diff changeset
38 cdecl, win32_msthis, win32_std, win32_fastcall.
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
39
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
40 Parameter Stack layout:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
41 size := EBP + 16
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
42 args := EBP + 12
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
43 target := EBP + 8
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
44
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
45 NOTES:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46 - epilog restore ESP serves callee cleanup
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47 - 16 byte alignment (to be compatible with darwin).
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
48 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
50
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
51 /*--- default / cdecl --------------------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
52
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53 Details:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54 - caller clean-up
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
56 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
57
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58 GLOBAL(dcCall_x86_cdecl)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59 BEGIN_PROC(dcCall_x86_cdecl)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
60 PUSH(EBP) /* prolog. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61 MOVL(ESP,EBP)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62 PUSH(ESI) /* save preserved registers. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63 PUSH(EDI)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64 MOVL(DWORD(EBP,12),ESI) /* ESI = arg buffer ptr */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65 MOVL(DWORD(EBP,16),ECX) /* ECX = arg buffer size */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66 ADDL(LIT(15),ECX) /* ECX = align(ECX,16) */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67 ANDL(LIT(-16),ECX)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68 MOVL(ECX,DWORD(EBP,16)) /* save ECX. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69 SUBL(ECX,ESP) /* allocate stack size */
165
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 0
diff changeset
70 MOVL(ESP,EDI) /* EDI = stack ptr */
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 0
diff changeset
71
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72 /*
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73 work around for rep movsd (not supported by SunPro)
165
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 0
diff changeset
74
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 0
diff changeset
75 SHRL(LIT(2),ECX)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76 REP(MOVSD)
165
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 0
diff changeset
77
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80 REP(MOVSB)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81 CALL_DWORD(EBP,8)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82 ADDL(DWORD(EBP,16),ESP)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83 POP(EDI)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84 POP(ESI)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85 MOVL(EBP,ESP)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86 POP(EBP)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87 RET()
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88 END_PROC(dcCall_x86_cdecl)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89 /* ---- C++ this calls (microsoft) ------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
90
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91 Details:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
92 - this pointer is in ECX
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
93
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
94 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
95
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
96 GLOBAL(dcCall_x86_win32_msthis)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
97 BEGIN_PROC(dcCall_x86_win32_msthis)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
98 PUSH(EBP) /* prolog. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99 MOVL(ESP,EBP)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100 PUSH(ESI) /* save preserved. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
101 PUSH(EDI)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
102 MOVL(DWORD(EBP,12),ESI) /* ESI = pointer on args. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
103 MOVL(DWORD(EBP,16),ECX) /* ECX = size. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
104 MOVL(DWORD(ESI,0),EAX) /* EAX = this pointer. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
105 ADDL(LIT(4),ESI) /* increment args pointer by thisptr. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
106 SUBL(LIT(4),ECX) /* decrement size by sizeof(thisptr). */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
107 SUBL(ECX,ESP) /* allocate argument-block on stack. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
108 MOVL(ESP,EDI) /* EDI = stack args. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
109 REP(MOVSB) /* copy arguments. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
110 MOVL(EAX,ECX) /* ECX = this pointer. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
111 CALL_DWORD(EBP,8) /* call function. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
112 POP(EDI) /* restore preserved. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
113 POP(ESI)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
114 MOVL(EBP,ESP) /* epilog. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
115 POP(EBP)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
116 RET()
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
117 END_PROC(dcCall_x86_win32_msthis)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
118
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
119 /*---- win32 stdcall ---------------------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
120
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
121 Details:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
122 - callee cleans up stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
123
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
124 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
125
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
126 GLOBAL(dcCall_x86_win32_std)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
127 BEGIN_PROC(dcCall_x86_win32_std)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
128 PUSH(EBP) /* prolog. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
129 MOVL(ESP,EBP)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
130 PUSH(ESI) /* save ESI, EDI. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
131 PUSH(EDI)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
132 MOVL(DWORD(EBP,12),ESI) /* ESI = args. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
133 MOVL(DWORD(EBP,16),ECX) /* ECX = size. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
134 SUBL(ECX,ESP) /* allocate size bytes on stack. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
135 MOVL(ESP,EDI) /* EDI = copy destination stack. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
136 REP(MOVSB) /* copy BYTEs. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
137 CALL_DWORD(EBP,8) /* call target. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
138 POP(EDI) /* restore EDI, ESI. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
139 POP(ESI)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
140 MOVL(EBP,ESP) /* epilog. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
141 POP(EBP)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
142 RET()
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
143 END_PROC(dcCall_x86_win32_std)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
144
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
145 /*---- win32 fastcall (GNU/Microsoft) ----------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
146
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
147 Details:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
148 - callee cleans up stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
149 - first two integer (up to 32bits) are passed in ECX and EDX
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
150
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
151 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
152
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
153 GLOBAL(dcCall_x86_win32_fast)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
154 BEGIN_PROC(dcCall_x86_win32_fast)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
155 PUSH(EBP) /* prolog. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
156 MOVL(ESP,EBP)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
157 PUSH(ESI) /* save preserved. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
158 PUSH(EDI)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
159 MOVL(DWORD(EBP,12),ESI) /* ESI = copy source args. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
160 MOVL(DWORD(EBP,16),ECX) /* ECX = size. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
161 MOVL(DWORD(ESI,0),EAX) /* EAX = first argument. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
162 MOVL(DWORD(ESI,4),EDX) /* EDX = second argument. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
163 ADDL(LIT(8),ESI) /* skip registers. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
164 SUBL(LIT(8),ECX)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
165 MOVL(ECX,DWORD(EBP,16)) /* save stack alloc size. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
166 SUBL(ECX,ESP) /* allocate stack. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
167 MOVL(ESP,EDI) /* EDI = stack args. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
168 REP(MOVSB) /* copy BYTEs. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
169 MOVL(EAX,ECX) /* ECX = first argument. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
170 CALL_DWORD(EBP,8) /* call target. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
171 POP(EDI) /* restore preserved. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
172 POP(ESI)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
173 MOVL(EBP,ESP) /* epilog. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
174 POP(EBP)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
175 RET()
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
176 END_PROC(dcCall_x86_win32_fast)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
177
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
178 /*--- syscall int80 linux ---------------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
179
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
180 Details:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
181 - all arguments are passed via registers
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
182
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
183 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
184
341
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 281
diff changeset
185 GLOBAL(dcCall_x86_syscall_int80h_linux)
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 281
diff changeset
186 BEGIN_PROC(dcCall_x86_syscall_int80h_linux)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
187 PUSH(EBP) /* prolog. */
165
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 0
diff changeset
188 MOVL(ESP,EBP)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
189 PUSH(EBX) /* save preserved. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
190 PUSH(ESI)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
191 PUSH(EDI)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
192 MOVL(DWORD(EBP,12),EAX) /* EAX = argument buffer. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
193 MOVL(DWORD(EAX,0),EBX) /* move first five arguments. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
194 MOVL(DWORD(EAX,4),ECX)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
195 MOVL(DWORD(EAX,8),EDX)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
196 MOVL(DWORD(EAX,12),ESI)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
197 MOVL(DWORD(EAX,16),EDI)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
198 MOVL(DWORD(EBP,8),EAX) /* EAX = syscall id. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
199 INT(LIT(HEX(80)))
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
200 POP(EDI) /* restore preserved. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
201 POP(ESI)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
202 POP(EBX)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
203 MOVL(EBP,ESP) /* epilog. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
204 POP(EBP)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
205 RET()
341
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 281
diff changeset
206 END_PROC(dcCall_x86_syscall_int80h_linux)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
207
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
208 /*--- syscall int80 bsd -----------------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
209
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
210 Details:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
211 - all arguments are passed via stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
212
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
213 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
214
341
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 281
diff changeset
215 GLOBAL(dcCall_x86_syscall_int80h_bsd)
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 281
diff changeset
216 BEGIN_PROC(dcCall_x86_syscall_int80h_bsd)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
217 PUSH(EBP) /* prolog. */
165
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 0
diff changeset
218 MOVL(ESP,EBP)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
219 PUSH(ESI) /* save preserved. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
220 PUSH(EDI)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
221 MOVL(DWORD(EBP,12),ESI) /* ESI = pointer on args. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
222 MOVL(DWORD(EBP,16),ECX) /* ECX = size. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
223 SUBL(ECX,ESP) /* allocate stack space. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
224 MOVL(ESP,EDI) /* EDI = stack args. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
225 REP(MOVSB)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
226 MOVL(DWORD(EBP,8),EAX) /* load system call id. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
227 CALL(_do_int)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
228 POP(EDI) /* restore preserved. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
229 POP(ESI)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
230 MOVL(EBP,ESP) /* epilog. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
231 POP(EBP)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
232 RET()
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
233 _do_int:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
234 INT(LIT(HEX(80)))
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
235 RET()
341
ab2d78e48ca2 - gen-masm
Tassilo Philipp
parents: 281
diff changeset
236 END_PROC(dcCall_x86_syscall_int80h_bsd)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
237
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
238 END_ASM
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
239