annotate dyncallback/dyncall_callback_x86.S @ 0:3e629dc19168

initial from svn dyncall-1745
author Daniel Adler
date Thu, 19 Mar 2015 22:24:28 +0100
parents
children d0787f3b81fb
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
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
9 Copyright (c) 2011-2015 Daniel Adler <dadler@uni-goettingen.de>
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"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
27 BEGIN_ASM
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
28 DCThunk_size = 16
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29 DCArgs_size = 20
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30 DCValue_size = 8
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
32 CTX_thunk = 0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33 CTX_phandler = 16
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
34 CTX_pargsvt = 20
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35 CTX_stack_cleanup = 24
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
36 CTX_userdata = 28
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
37
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
38 frame_arg0 = 8
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
39 frame_ret = 4
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
40 frame_parent = 0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
41 frame_CTX = -4
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
42 frame_DCArgs = -24
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
43 frame_DCValue = -32
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
44
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
45 #define ASCII_L 76
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46 #define ASCII_l 108
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47 #define ASCII_d 100
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
48 #define ASCII_f 102
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49 #define ASCII_i 105
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
50 #define ASCII_v 118
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
51
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
52 GLOBAL(dcCallbackThunkEntry)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53 BEGIN_PROC(dcCallbackThunkEntry)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54 PUSH(EBP)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55 MOVL(ESP,EBP)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
56 /* local variable frame_CTX) */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
57 PUSH(EAX) /* EAX = CTX* */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58 /* initialize DCArgs */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59 PUSH(LIT(0)) /* fast_count */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
60 PUSH(EDX) /* fast_data[1] */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61 PUSH(ECX) /* fast_data[0] */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62 LEA(DWORD(EBP,frame_arg0),ECX) /* compute arg stack address */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63 PUSH(ECX) /* stack-ptr */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64 PUSH(DWORD(EAX,CTX_pargsvt)) /* vtbl-ptr */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65 MOVL(ESP,ECX) /* ECX = DCArgs* */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66 /* initialize DCvalue */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67 PUSH(LIT(0))
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68 PUSH(LIT(0))
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 MOVL(ESP,EDX) /* EDX = DCValue* */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71 ANDL(LIT(-16),ESP) /* align stack to 16 bytes. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72 /* call handler(context) */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73 PUSH(DWORD(EAX,CTX_userdata)) /* userdata */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
74 PUSH(EDX) /* DCValue* */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75 PUSH(ECX) /* DCargs* */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76 PUSH(EAX) /* DCCallback* */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77 CALL_DWORD(EAX,CTX_phandler)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78 /* cleanup stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79 MOVL(EBP,ESP) /* reset esp to frame */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80 POP(ECX) /* skip parent frame */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81 POP(ECX) /* pop return address */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82 MOVL(DWORD(EBP,frame_CTX),EDX)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83 ADD(DWORD(EDX,CTX_stack_cleanup),ESP) /* cleanup stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84 PUSH(ECX) /* push back return address */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85 LEA(DWORD(EBP,frame_DCValue), EDX)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86 MOVL(DWORD(EBP,0), EBP) /* EBP = parent frame */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87 /* handle return value */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89 CMP(LIT(ASCII_f),AL)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
90 JE(LOCAL(return_f32))
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91 CMP(LIT(ASCII_d),AL)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
92 JE(LOCAL(return_f64))
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
93
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
94 /* All int cases <= 32 bits (+ pointer & string cases) fall in the 32 bits int case*/
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
95 LOCAL(return_i64):
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
96 MOVL(DWORD(EDX,0),EAX)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
97 MOVL(DWORD(EDX,4),EDX)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
98 RET()
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99 LOCAL(return_f32):
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100 FLDS(DWORD(EDX,0))
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
101 RET()
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
102 LOCAL(return_f64):
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
103 FLDL(QWORD(EDX,0))
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
104 LOCAL(return_void):
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 END_PROC(dcCallbackThunkEntry)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
107 END_ASM
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
108