annotate test/gen-masm/call_x64.S @ 406:351bb41d3bb1

- removed %-prefixes for register names from arm assembly files (was wrong to begin with, gas accepted them but the clang integrated assembler does not)
author Tassilo Philipp
date Sun, 03 Oct 2021 10:34:56 +0200
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: test
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
5 File: test/gen-masm/call_x64.S
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6 Description:
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: 0
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 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 #if defined(GEN_MASM)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29 .CODE
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30 # define BEGIN_ASM
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31 # define END_ASM END
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
32 # define GLOBAL(X) X PROC
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33 # define BEGIN_PROC(X) OPTION PROLOGUE:NONE, EPILOGUE:NONE
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
34 # define END_PROC(X) X ENDP
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35 #else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
36 .intel_syntax
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
37 .text
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
38 # define BEGIN_ASM
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
39 # define END_ASM
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
40 # define GLOBAL(X) .globl X
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
41 # define BEGIN_PROC(X) X:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
42 # define END_PROC(X)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
43 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
44
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
45 BEGIN_ASM
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47 // ---------------------------------------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
48 // Call Kernel for x64 System V
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
50 GLOBAL(dcCall_x64_sysv)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
51 BEGIN_PROC(dcCall_x64_sysv)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
52 // rdi : size of arguments to be passed via stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53 // rsi : pointer to arguments to be passed via the stack
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54 // rdx : pointer to arguments of integral/pointer type to be passed via registers
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55 // rcx : pointer to arguments of floating point type to be passed via registers
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
56 // r8 : target function pointer
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
57
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58 push rbp // Pseudo-prolog - preserve rbp.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59 push rbx // Preserve rbx and store pointer to function in it.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
60
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61 mov rbp, rsp // Store stack pointer in rbp.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63 mov rbx, r8
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65 movsd xmm0, qword ptr[rcx ] // Copy first 8 floats to xmm0-xmm7 (this makes rcx free to use).
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66 movsd xmm1, qword ptr[rcx+ 8]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67 movsd xmm2, qword ptr[rcx+16]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68 movsd xmm3, qword ptr[rcx+24]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69 movsd xmm4, qword ptr[rcx+32]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 movsd xmm5, qword ptr[rcx+40]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71 movsd xmm6, qword ptr[rcx+48]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72 movsd xmm7, qword ptr[rcx+56]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
74 sub rsp, rdi // Setup stack frame by subtracting the size of the arguments.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76 mov rax, rdi // Align stack.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77 add rax, 8
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78 and rax, 15
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79 sub rsp, rax
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81 mov rcx, rdi // Store number of bytes to copy to stack in rcx (for rep movsb).
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82 mov rdi, rsp // Store pointer to beginning of stack arguments in rdi (for rep movsb).
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84 rep movsb // @@@ should be optimized (e.g. movq)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86 mov rdi, qword ptr[rdx ] // Copy first six int/pointer arguments to rdi, rsi, rdx, rcx, r8, r9.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87 mov rsi, qword ptr[rdx+ 8]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88 mov rcx, qword ptr[rdx+24]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89 mov r8, qword ptr[rdx+32]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
90 mov r9, qword ptr[rdx+40]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91 mov rdx, qword ptr[rdx+16] /* Set rdx last to not overwrite it to soon. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
92
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
93 mov al, 8 /* Put upper bound of number of used xmm registers in al. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
94 call rbx /* Invoke function. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
95
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
96 mov rsp, rbp /* Restore stack pointer (such that we can pop the preserved values). */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
97
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
98 pop rbx /* Restore rbx. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99 pop rbp /* Pseudo-epilog. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100
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 END_PROC(dcCall_x64_sysv)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
103
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
104 // ---------------------------------------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
105 // Call Kernel for x64 Win64
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
106
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
107 GLOBAL(dcCall_x64_win64)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
108 BEGIN_PROC(dcCall_x64_win64)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
109 push rbp // Pseudo-prolog - preserve rbp.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
110 push rsi // Preserve rsi and rdi.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
111 push rdi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
112
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
113 mov rbp, rsp // Store stack pointer in rbp.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
114
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
115 sub rsp, rcx // Setup stack frame by subtracting the size of the arguments.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
116
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
117 mov rax, rcx // Align stack.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
118 add rax, 8
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
119 and rax, 15
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
120 sub rsp, rax
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
121
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
122 mov rsi, rdx // Let rsi point to the arguments.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
123 mov rdi, rsp // Store pointer to beginning of stack arguments in rdi (for rep movsb).
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
124 mov rax, r9 // Put function address in rax.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
125
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
126 rep movsb // @@@ should be optimized (e.g. movq)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
127
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
128 mov rcx, qword ptr[r8 ] // Copy first four arguments to rcx, rdx, r8, r9 and xmm0-xmm3.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
129 mov rdx, qword ptr[r8+ 8]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
130 mov r9, qword ptr[r8+24] // Set r9 first to not overwrite r8 too soon.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
131 mov r8, qword ptr[r8+16]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
132 movd xmm0, rcx
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
133 movd xmm1, rdx
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
134 movd xmm2, r8
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
135 movd xmm3, r9
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
136
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
137 push r9 // Push first four arguments onto the stack preserve area.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
138 push r8
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
139 push rdx
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
140 push rcx
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
141
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
142 call rax // Invoke function.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
143
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
144 mov rsp, rbp // Restore stack pointer (such that we can pop the preserved values).
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
145
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
146 pop rdi // Restore rsi and rdi.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
147 pop rsi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
148 pop rbp // Pseudo-epilog.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
149
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
150 ret
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
151 END_PROC(dcCall_x64_win64)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
152
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
153 END_ASM
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
154