Mercurial > pub > dyncall > dyncall
annotate dyncallback/dyncall_callback_arm64.S @ 410:7608e34098b0
- cleanups, simplifications, some api clarification, ...
- test cases consistency:
* return status code depending on test results (for actual conformance tests, not stuff that is not an example or hack to check something, ..)
* platform init helper added for some
author | Tassilo Philipp |
---|---|
date | Tue, 05 Oct 2021 21:53:04 +0200 |
parents | 451299d50c1a |
children | cab0031c6691 |
rev | line source |
---|---|
0 | 1 /* |
2 | |
3 Package: dyncall | |
4 Library: dyncallback | |
15
03c516772c65
- consistency in filenames that have cpp logic .s -> .S
cslag
parents:
0
diff
changeset
|
5 File: dyncallback/dyncall_callback_arm64.S |
0 | 6 Description: Callback Thunk - Implementation for ARM64 / ARMv8 / AAPCS64 |
7 License: | |
8 | |
371
451299d50c1a
- windows arm64 support (dyncall, dyncallback, cmake support for armasm64), thanks Bernhard Urban-Forster!
Tassilo Philipp
parents:
281
diff
changeset
|
9 Copyright (c) 2015-2020 Daniel Adler <dadler@uni-goettingen.de>, |
281 | 10 Tassilo Philipp <tphilipp@potion-studios.com> |
0 | 11 |
12 Permission to use, copy, modify, and distribute this software for any | |
13 purpose with or without fee is hereby granted, provided that the above | |
14 copyright notice and this permission notice appear in all copies. | |
15 | |
16 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
17 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
18 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
19 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
20 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
21 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
22 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
23 | |
24 */ | |
371
451299d50c1a
- windows arm64 support (dyncall, dyncallback, cmake support for armasm64), thanks Bernhard Urban-Forster!
Tassilo Philipp
parents:
281
diff
changeset
|
25 |
451299d50c1a
- windows arm64 support (dyncall, dyncallback, cmake support for armasm64), thanks Bernhard Urban-Forster!
Tassilo Philipp
parents:
281
diff
changeset
|
26 #include "../portasm/portasm-arm64.S" |
451299d50c1a
- windows arm64 support (dyncall, dyncallback, cmake support for armasm64), thanks Bernhard Urban-Forster!
Tassilo Philipp
parents:
281
diff
changeset
|
27 BEGIN_ASM |
451299d50c1a
- windows arm64 support (dyncall, dyncallback, cmake support for armasm64), thanks Bernhard Urban-Forster!
Tassilo Philipp
parents:
281
diff
changeset
|
28 |
0 | 29 // struct DCCallback |
30 // type off size | |
31 // ---------|------|------ | |
32 // DCThunk | 0 | 32 | |
33 // handler | 32 | 8 | |
34 // userdata | 40 | 8 | |
35 | |
371
451299d50c1a
- windows arm64 support (dyncall, dyncallback, cmake support for armasm64), thanks Bernhard Urban-Forster!
Tassilo Philipp
parents:
281
diff
changeset
|
36 TEXTAREA |
0 | 37 |
38 GLOBAL_C(dcCallbackThunkEntry) | |
39 ENTRY_C(dcCallbackThunkEntry) | |
371
451299d50c1a
- windows arm64 support (dyncall, dyncallback, cmake support for armasm64), thanks Bernhard Urban-Forster!
Tassilo Philipp
parents:
281
diff
changeset
|
40 ALIGN(4) |
0 | 41 |
42 // input: | |
43 // x9: DCCallback* pcb | |
44 // x0..x7 ?? GP regs | |
45 // d0..d7 ?? FP/SIMD regs | |
46 // sp... ?? arguments on stack | |
47 // | |
48 // locals: | |
49 // type off size | |
50 // ---------|------|------ | |
51 // Frame 0 16 | |
52 // DCArgs 16 168 | |
53 // DCValue 184 16 | |
54 // | |
55 // size 200 | |
56 // aligned 208 | |
57 // | |
58 | |
59 // locals: | |
60 // x10: sp | |
61 // x11: DCArgs* args | |
62 | |
63 mov x10, sp | |
64 stp x29, x30, [sp, #-208 ]! | |
65 mov x29, sp | |
66 | |
67 add x11, x29 , #16 | |
68 | |
69 // save integer registers | |
70 | |
71 stp x0, x1, [x11, #0 ] | |
72 stp x2, x3, [x11, #16] | |
73 stp x4, x5, [x11, #32] | |
74 stp x6, x7, [x11, #48] | |
75 | |
76 stp d0, d1, [x11, #64] | |
77 stp d2, d3, [x11, #80] | |
371
451299d50c1a
- windows arm64 support (dyncall, dyncallback, cmake support for armasm64), thanks Bernhard Urban-Forster!
Tassilo Philipp
parents:
281
diff
changeset
|
78 stp d4, d5, [x11, #96] |
451299d50c1a
- windows arm64 support (dyncall, dyncallback, cmake support for armasm64), thanks Bernhard Urban-Forster!
Tassilo Philipp
parents:
281
diff
changeset
|
79 stp d6, d7, [x11, #112] |
0 | 80 |
81 eor x12, x12, x12 | |
82 stp x10,x12,[x11, #128] // sp=sp, i=0, f=0 | |
83 | |
84 str x12, [x11, #144] // s=0, reserved=0 | |
85 | |
86 | |
87 // call handler: | |
88 // args: | |
89 // x0: DCCallback* pcb | |
90 // x1: DCArgs* args | |
91 // x2: DCValue* result | |
92 // x3: void* userdata | |
93 | |
94 mov x0 , x9 | |
95 add x1 , x29 , #16 | |
96 add x2 , x29 , #184 | |
97 ldr x3 , [x9 , #40] | |
98 | |
99 ldr x11, [x9 , #32] | |
100 blr x11 | |
101 | |
102 and w0, w0, #255 | |
103 cmp w0, 'f' | |
371
451299d50c1a
- windows arm64 support (dyncall, dyncallback, cmake support for armasm64), thanks Bernhard Urban-Forster!
Tassilo Philipp
parents:
281
diff
changeset
|
104 b.eq LABELUSE(retf) |
0 | 105 cmp w0, 'd' |
371
451299d50c1a
- windows arm64 support (dyncall, dyncallback, cmake support for armasm64), thanks Bernhard Urban-Forster!
Tassilo Philipp
parents:
281
diff
changeset
|
106 b.eq LABELUSE(retf) |
0 | 107 |
371
451299d50c1a
- windows arm64 support (dyncall, dyncallback, cmake support for armasm64), thanks Bernhard Urban-Forster!
Tassilo Philipp
parents:
281
diff
changeset
|
108 LABELDEF(reti) |
0 | 109 ldr x0, [x29, #184] |
371
451299d50c1a
- windows arm64 support (dyncall, dyncallback, cmake support for armasm64), thanks Bernhard Urban-Forster!
Tassilo Philipp
parents:
281
diff
changeset
|
110 b LABELUSE(ret) |
451299d50c1a
- windows arm64 support (dyncall, dyncallback, cmake support for armasm64), thanks Bernhard Urban-Forster!
Tassilo Philipp
parents:
281
diff
changeset
|
111 LABELDEF(retf) |
0 | 112 ldr d0, [x29, #184] |
371
451299d50c1a
- windows arm64 support (dyncall, dyncallback, cmake support for armasm64), thanks Bernhard Urban-Forster!
Tassilo Philipp
parents:
281
diff
changeset
|
113 LABELDEF(ret) |
0 | 114 ldp x29, x30, [sp], #208 |
115 ret | |
371
451299d50c1a
- windows arm64 support (dyncall, dyncallback, cmake support for armasm64), thanks Bernhard Urban-Forster!
Tassilo Philipp
parents:
281
diff
changeset
|
116 |
451299d50c1a
- windows arm64 support (dyncall, dyncallback, cmake support for armasm64), thanks Bernhard Urban-Forster!
Tassilo Philipp
parents:
281
diff
changeset
|
117 |
451299d50c1a
- windows arm64 support (dyncall, dyncallback, cmake support for armasm64), thanks Bernhard Urban-Forster!
Tassilo Philipp
parents:
281
diff
changeset
|
118 END_PROC |
451299d50c1a
- windows arm64 support (dyncall, dyncallback, cmake support for armasm64), thanks Bernhard Urban-Forster!
Tassilo Philipp
parents:
281
diff
changeset
|
119 END_ASM |
451299d50c1a
- windows arm64 support (dyncall, dyncallback, cmake support for armasm64), thanks Bernhard Urban-Forster!
Tassilo Philipp
parents:
281
diff
changeset
|
120 |