annotate dyncallback/dyncall_callback_x86_8a.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 3e629dc19168
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: dyncall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
5 File: dyncall/dyncall_callback_x86_8a.s
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6 Description: x86 abi callback kernel implementation for Plan9's 8a
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) 2013 Tassilo Philipp <tphilipp@potion-studios.com>
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 TEXT dcCallbackThunkEntry(SB), $0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
27
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
28 /* input:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29 AX -> thunk
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30 AX+16 -> cb handler
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31 AX+20 -> dcargsvt
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
32 AX+24 -> stack cleanup <-- not used for stack cleaning as caller cleans up,
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33 AX+28 -> userdata however reused as flag to indicate 64bit return value)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
34 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
36 /* prolog */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
37 MOVL SP, BP
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
38
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
39 /* copy of DCargs passed to cb handler */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
40 PUSHL $0 /* fast_count (unused on plan9, but using shared x86 dcargs struct) */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
41 SUBL $8, SP /* skip fast_data[] ( " ) */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
42 LEAL 8(BP), CX /* ptr to args on stack, depending if return val is 64bit ... */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
43 CMPL 24(AX), $1
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
44 JEQ is_ll_ret
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
45 LEAL 4(BP), CX /* ... or not */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46 is_ll_ret:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47 PUSHL CX
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
48 PUSHL 20(AX) /* args vtable ptr */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49 MOVL SP, CX /* DCArgs-ptr (data pushed above) */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
50
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
51 /* space for return value (long long) */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
52 PUSHL $0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53 PUSHL $0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54 MOVL SP, DX /* retval ptr */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
56 /* call the handler */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
57 PUSHL 28(AX) /* userdata for handler */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58 PUSHL DX /* results */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59 PUSHL CX /* args */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
60 PUSHL AX /* callback obj */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61 MOVL 16(AX), AX
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62 CALL AX
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64 /* copy retval from ptr on stack to AX or stack space if 64bit */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65 MOVL 8(SP), BX /* ptr to retval */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66 CMPL AX, $0x6c /* 'l' @@@ compares return from handler, might be different from sig - design currently in discussion */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67 JEQ ll_ret;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68 CMPL AX, $0x4c /* 'L' @@@ compares return from handler, might be different from sig - design currently in discussion */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69 JEQ ll_ret;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 CMPL AX, $0x66 /* 'f' @@@ compares return from handler, might be different from sig - design currently in discussion */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71 JEQ f_ret;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72 CMPL AX, $0x64 /* 'd' @@@ compares return from handler, might be different from sig - design currently in discussion */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73 JEQ d_ret;
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
74 JMP other_ret
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76 ll_ret:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77 MOVL 48(SP), DX /* ptr to ret address space; 48 = stack size + caller's ret address */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78 MOVL (BX), CX
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79 MOVL CX, (DX)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80 MOVL 4(BX), CX
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81 MOVL CX, 4(DX)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82 JMP cont_ret
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84 f_ret:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85 FMOVF (BX), F0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86 JMP cont_ret
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88 d_ret:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89 FMOVD (BX), F0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
90 JMP cont_ret
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
92 other_ret:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
93 MOVL (BX), AX /* 32bit non-fp are returned in AX */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
94
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
95 /* epilog */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
96 cont_ret:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
97 ADDL $44, SP /* Cleanup stack */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
98 POPL CX /* hack to emulate RET without getting overly strict */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99 JMP CX /* 'unbalanced PUSH/POP' warning/error from 8l */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100