annotate dyncallback/dyncall_callback_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 f5577f6bf97a
children
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: dyncallback
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
5 File: dyncallback/dyncall_callback_x86.S
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6 Description: Callback Thunk entry for x86
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) 2011-2018 Daniel Adler <dadler@uni-goettingen.de>
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
10
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
11 Permission to use, copy, modify, and distribute this software for any
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
12 purpose with or without fee is hereby granted, provided that the above
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
13 copyright notice and this permission notice appear in all copies.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
14
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
15 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
16 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
17 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
18 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
19 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
20 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
21 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
22
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 #include "../portasm/portasm-x86.S"
145
63892f03e493 - minix fix for callbacks (floats are also returned via eax/edx on minix)
cslag
parents: 97
diff changeset
27 #include "../dyncall/dyncall_macros.h"
63892f03e493 - minix fix for callbacks (floats are also returned via eax/edx on minix)
cslag
parents: 97
diff changeset
28
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29 BEGIN_ASM
165
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
30 DCThunk_size = 16
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
31 DCArgs_size = 20
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
32 DCValue_size = 8
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33
165
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
34 CTX_thunk = 0
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
35 CTX_phandler = 16
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
36 CTX_pargsvt = 20
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
37 CTX_stack_cleanup = 24
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
38 CTX_userdata = 28
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
39
165
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
40 frame_arg0 = 8
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
41 frame_ret = 4
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
42 frame_parent = 0
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
43 frame_CTX = -4
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
44 frame_DCArgs = -24
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
45 frame_DCValue = -32
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46
165
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
47 #define ASCII_L 76
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
48 #define ASCII_l 108
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
49 #define ASCII_d 100
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
50 #define ASCII_f 102
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
51 #define ASCII_i 105
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
52 #define ASCII_v 118
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54 GLOBAL(dcCallbackThunkEntry)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55 BEGIN_PROC(dcCallbackThunkEntry)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
56 PUSH(EBP)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
57 MOVL(ESP,EBP)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58 /* local variable frame_CTX) */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59 PUSH(EAX) /* EAX = CTX* */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
60 /* initialize DCArgs */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61 PUSH(LIT(0)) /* fast_count */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62 PUSH(EDX) /* fast_data[1] */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63 PUSH(ECX) /* fast_data[0] */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64 LEA(DWORD(EBP,frame_arg0),ECX) /* compute arg stack address */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65 PUSH(ECX) /* stack-ptr */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66 PUSH(DWORD(EAX,CTX_pargsvt)) /* vtbl-ptr */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67 MOVL(ESP,ECX) /* ECX = DCArgs* */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68 /* initialize DCvalue */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69 PUSH(LIT(0))
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 PUSH(LIT(0))
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72 MOVL(ESP,EDX) /* EDX = DCValue* */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73 ANDL(LIT(-16),ESP) /* align stack to 16 bytes. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
74 /* call handler(context) */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75 PUSH(DWORD(EAX,CTX_userdata)) /* userdata */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76 PUSH(EDX) /* DCValue* */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77 PUSH(ECX) /* DCargs* */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78 PUSH(EAX) /* DCCallback* */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79 CALL_DWORD(EAX,CTX_phandler)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80 /* cleanup stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81 MOVL(EBP,ESP) /* reset esp to frame */
165
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
82 POP(ECX) /* skip parent frame */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83 POP(ECX) /* pop return address */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84 MOVL(DWORD(EBP,frame_CTX),EDX)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85 ADD(DWORD(EDX,CTX_stack_cleanup),ESP) /* cleanup stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86 PUSH(ECX) /* push back return address */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87 LEA(DWORD(EBP,frame_DCValue), EDX)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88 MOVL(DWORD(EBP,0), EBP) /* EBP = parent frame */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89 /* handle return value */
145
63892f03e493 - minix fix for callbacks (floats are also returned via eax/edx on minix)
cslag
parents: 97
diff changeset
90
63892f03e493 - minix fix for callbacks (floats are also returned via eax/edx on minix)
cslag
parents: 97
diff changeset
91 #if !defined(DC__OS_Minix)
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
92 CMP(LIT(ASCII_f),AL)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
93 JE(LOCAL(return_f32))
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
94 CMP(LIT(ASCII_d),AL)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
95 JE(LOCAL(return_f64))
145
63892f03e493 - minix fix for callbacks (floats are also returned via eax/edx on minix)
cslag
parents: 97
diff changeset
96 #endif
165
572aff021627 - file name/layout cleanup, removed "-att" from x64 .S filenames, as unnecessary and also misleading
cslag
parents: 145
diff changeset
97
97
d0787f3b81fb - internal linkage for some helper functions
cslag
parents: 0
diff changeset
98 /* All int cases (+ pointer & string cases) fall in the return_i64 case, here */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99 LOCAL(return_i64):
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100 MOVL(DWORD(EDX,0),EAX)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
101 MOVL(DWORD(EDX,4),EDX)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
102 RET()
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
103 LOCAL(return_f32):
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
104 FLDS(DWORD(EDX,0))
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
105 RET()
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
106 LOCAL(return_f64):
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
107 FLDL(QWORD(EDX,0))
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
108 LOCAL(return_void):
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
109 RET()
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
110 END_PROC(dcCallbackThunkEntry)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
111 END_ASM
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
112