1 /*
2 * This file and its contents are supplied under the terms of the
3 * Common Development and Distribution License ("CDDL"), version 1.0.
4 * You may only use this file in accordance with the terms of version
5 * 1.0 of the CDDL.
6 *
7 * A full copy of the text of the CDDL should have accompanied this
8 * source. A copy of the CDDL is also available via the Internet at
9 * http://www.illumos.org/license/CDDL.
10 */
11
12 /*
13 * Copyright 2012, Richard Lowe.
14 */
15
16 #define FUNC(x) \
17 .text; \
18 .align 16; \
19 .globl x; \
20 .type x, @function; \
21 x:
22
23 #define SET_SIZE(x, x_size) \
24 .size x, [.-x]; \
25 .globl x_size; \
26 .type x_size, @object; \
27 x_size:
28
29 /*
30 * Extracted versions of the functional tests
31 *
32 * Named of the form <compiler>-<prologue style>-<nature of test>
33 * basic -- A regular function
34 * align -- odd number of arguments needing save-area
35 * alignment
36 * big-struct-ret -- returns a > 16byte structure by value
37 * big-struct-ret-and-spill -- returns a > 16byte structure by value and
38 * spills args to the stack
39 * small-struct-ret -- returns a < 16byte structure by value
40 * small-struct-ret-and-spill -- returns a < 16byte structure by value and
41 * spills args to the stack
42 * stack-spill -- spills arguments to the stack
43 */
44 FUNC(gcc_mov_align)
45 pushq %rbp
46 movq %rsp, %rbp
47 movq %rbx, -0x38(%rbp)
48 movq %r8, -0x28(%rbp)
49 movq %rcx, -0x20(%rbp)
50 movq %rdx, -0x18(%rbp)
51 movq %rsi, -0x10(%rbp)
52 movq %rdi, -0x8(%rbp)
53 subq $0x70, %rsp
54 SET_SIZE(gcc_mov_align, gcc_mov_align_end)
55
56 FUNC(gcc_mov_basic)
57 pushq %rbp
58 movq %rsp, %rbp
59 movq %rbx,-0x28(%rbp)
60 movq %rcx,-0x20(%rbp)
61 movq %rdx,-0x18(%rbp)
62 movq %rsi,-0x10(%rbp)
63 movq %rdi,-0x8(%rbp)
64 subq $0x50,%rsp
65 SET_SIZE(gcc_mov_basic, gcc_mov_basic_end)
66
67 FUNC(gcc_mov_big_struct_ret)
68 pushq %rbp
69 movq %rsp,%rbp
70 movq %rbx,-0x28(%rbp)
71 movq %r8,-0x20(%rbp)
72 movq %rcx,-0x18(%rbp)
73 movq %rdx,-0x10(%rbp)
74 movq %rsi,-0x8(%rbp)
75 subq $0x50,%rsp
76 SET_SIZE(gcc_mov_big_struct_ret, gcc_mov_big_struct_ret_end)
77
78 FUNC(gcc_mov_big_struct_ret_and_spill)
79 pushq %rbp
80 movq %rsp,%rbp
81 movq %rbx,-0x38(%rbp)
82 movq %r9,-0x28(%rbp)
83 movq %r8,-0x20(%rbp)
84 movq %rcx,-0x18(%rbp)
85 movq %rdx,-0x10(%rbp)
86 movq %rsi,-0x8(%rbp)
87 subq $0x90,%rsp
88 SET_SIZE(gcc_mov_big_struct_ret_and_spill, gcc_mov_big_struct_ret_and_spill_end)
89
90 FUNC(gcc_mov_small_struct_ret)
91 pushq %rbp
92 movq %rsp,%rbp
93 movq %rbx,-0x28(%rbp)
94 movq %rcx,-0x20(%rbp)
95 movq %rdx,-0x18(%rbp)
96 movq %rsi,-0x10(%rbp)
97 movq %rdi,-0x8(%rbp)
98 subq $0x50,%rsp
99 SET_SIZE(gcc_mov_small_struct_ret, gcc_mov_small_struct_ret_end)
100
101 FUNC(gcc_mov_small_struct_ret_and_spill)
102 pushq %rbp
103 movq %rsp,%rbp
104 movq %rbx,-0x38(%rbp)
105 movq %r9,-0x30(%rbp)
106 movq %r8,-0x28(%rbp)
107 movq %rcx,-0x20(%rbp)
108 movq %rdx,-0x18(%rbp)
109 movq %rsi,-0x10(%rbp)
110 movq %rdi,-0x8(%rbp)
111 subq $0x90,%rsp
112 SET_SIZE(gcc_mov_small_struct_ret_and_spill, gcc_mov_small_struct_ret_and_spill_end)
113
114 FUNC(gcc_mov_stack_spill)
115 pushq %rbp
116 movq %rsp,%rbp
117 movq %rbx,-0x38(%rbp)
118 movq %r9,-0x30(%rbp)
119 movq %r8,-0x28(%rbp)
120 movq %rcx,-0x20(%rbp)
121 movq %rdx,-0x18(%rbp)
122 movq %rsi,-0x10(%rbp)
123 movq %rdi,-0x8(%rbp)
124 subq $0x90,%rsp
125 SET_SIZE(gcc_mov_stack_spill, gcc_mov_stack_spill_end)
126
127 FUNC(gcc_push_align)
128 pushq %rbp
129 movq %rsp,%rbp
130 pushq %rdi
131 pushq %rsi
132 pushq %rdx
133 pushq %rcx
134 pushq %r8
135 subq $0x8,%rsp
136 subq $0x30,%rsp
137 SET_SIZE(gcc_push_align, gcc_push_align_end)
138
139 FUNC(gcc_push_basic)
140 pushq %rbp
141 movq %rsp,%rbp
142 pushq %rdi
143 pushq %rsi
144 pushq %rdx
145 pushq %rcx
146 subq $0x20,%rsp
147 SET_SIZE(gcc_push_basic, gcc_push_basic_end)
148
149 FUNC(gcc_push_big_struct_ret)
150 pushq %rbp
151 movq %rsp,%rbp
152 pushq %rsi
153 pushq %rdx
154 pushq %rcx
155 pushq %r8
156 subq $0x30,%rsp
157 SET_SIZE(gcc_push_big_struct_ret, gcc_push_big_struct_ret_end)
158
159 FUNC(gcc_push_big_struct_ret_and_spill)
160 pushq %rbp
161 movq %rsp,%rbp
162 pushq %rsi
163 pushq %rdx
164 pushq %rcx
165 pushq %r8
166 pushq %r9
167 subq $0x8,%rsp
168 subq $0x50,%rsp
169 SET_SIZE(gcc_push_big_struct_ret_and_spill, gcc_push_big_struct_ret_and_spill_end)
170
171 FUNC(gcc_push_small_struct_ret)
172 pushq %rbp
173 movq %rsp,%rbp
174 pushq %rdi
175 pushq %rsi
176 pushq %rdx
177 pushq %rcx
178 subq $0x20,%rsp
179 SET_SIZE(gcc_push_small_struct_ret, gcc_push_small_struct_ret_end)
180
181 FUNC(gcc_push_small_struct_ret_and_spill)
182 pushq %rbp
183 movq %rsp,%rbp
184 pushq %rdi
185 pushq %rsi
186 pushq %rdx
187 pushq %rcx
188 pushq %r8
189 pushq %r9
190 subq $0x50,%rsp
191 SET_SIZE(gcc_push_small_struct_ret_and_spill, gcc_push_small_struct_ret_and_spill_end)
192
193 FUNC(gcc_push_stack_spill)
194 pushq %rbp
195 movq %rsp,%rbp
196 pushq %rdi
197 pushq %rsi
198 pushq %rdx
199 pushq %rcx
200 pushq %r8
201 pushq %r9
202 subq $0x50,%rsp
203 SET_SIZE(gcc_push_stack_spill, gcc_push_stack_spill_end)
204
205 FUNC(ss_mov_align)
206 pushq %rbp
207 movq %rsp,%rbp
208 subq $0x30,%rsp
209 movq %rdi,-0x8(%rbp)
210 movq %rsi,-0x10(%rbp)
211 movq %rdx,-0x18(%rbp)
212 movq %rcx,-0x20(%rbp)
213 movq %r8,-0x28(%rbp)
214 SET_SIZE(ss_mov_align, ss_mov_align_end)
215
216 FUNC(ss_mov_basic)
217 pushq %rbp
218 movq %rsp,%rbp
219 subq $0x20,%rsp
220 movq %rdi,-0x8(%rbp)
221 movq %rsi,-0x10(%rbp)
222 movq %rdx,-0x18(%rbp)
223 movq %rcx,-0x20(%rbp)
224 SET_SIZE(ss_mov_basic, ss_mov_basic_end)
225
226 FUNC(ss_mov_big_struct_ret)
227 pushq %rbp
228 movq %rsp,%rbp
229 subq $0x30,%rsp
230 movq %rdi,-0x8(%rbp)
231 movq %rsi,-0x10(%rbp)
232 movq %rdx,-0x18(%rbp)
233 movq %rcx,-0x20(%rbp)
234 movq %r8,-0x28(%rbp)
235 SET_SIZE(ss_mov_big_struct_ret, ss_mov_big_struct_ret_end)
236
237 FUNC(ss_mov_big_struct_ret_and_spill)
238 pushq %rbp
239 movq %rsp,%rbp
240 subq $0x50,%rsp
241 movq %rdi,-0x8(%rbp)
242 movq %rsi,-0x10(%rbp)
243 movq %rdx,-0x18(%rbp)
244 movq %rcx,-0x20(%rbp)
245 movq %r8,-0x28(%rbp)
246 movq %r9,-0x30(%rbp)
247 SET_SIZE(ss_mov_big_struct_ret_and_spill, ss_mov_big_struct_ret_and_spill_end)
248
249 FUNC(ss_mov_small_struct_ret)
250 pushq %rbp
251 movq %rsp,%rbp
252 subq $0x20,%rsp
253 movq %rdi,-0x8(%rbp)
254 movq %rsi,-0x10(%rbp)
255 movq %rdx,-0x18(%rbp)
256 movq %rcx,-0x20(%rbp)
257 SET_SIZE(ss_mov_small_struct_ret, ss_mov_small_struct_ret_end)
258
259 FUNC(ss_mov_small_struct_ret_and_spill)
260 pushq %rbp
261 movq %rsp,%rbp
262 subq $0x50,%rsp
263 movq %rdi,-0x8(%rbp)
264 movq %rsi,-0x10(%rbp)
265 movq %rdx,-0x18(%rbp)
266 movq %rcx,-0x20(%rbp)
267 movq %r8,-0x28(%rbp)
268 movq %r9,-0x30(%rbp)
269 SET_SIZE(ss_mov_small_struct_ret_and_spill, ss_mov_small_struct_ret_and_spill_end)
270
271 FUNC(ss_mov_stack_spill)
272 pushq %rbp
273 movq %rsp,%rbp
274 subq $0x50,%rsp
275 movq %rdi,-0x8(%rbp)
276 movq %rsi,-0x10(%rbp)
277 movq %rdx,-0x18(%rbp)
278 movq %rcx,-0x20(%rbp)
279 movq %r8,-0x28(%rbp)
280 movq %r9,-0x30(%rbp)
281 SET_SIZE(ss_mov_stack_spill, ss_mov_stack_spill_end)
282
283 /* DTrace instrumentation */
284 FUNC(dtrace_instrumented)
285 int $0x3
286 movq %rsp, %rbp
287 movq %rbx,-0x28(%rbp)
288 movq %rcx,-0x20(%rbp)
289 movq %rdx,-0x18(%rbp)
290 movq %rsi,-0x10(%rbp)
291 movq %rdi,-0x8(%rbp)
292 subq $0x50,%rsp
293 SET_SIZE(dtrace_instrumented, dtrace_instrumented_end)
294
295 /*
296 * System functions with special characteristics, be they non-initial FP save,
297 * gaps between FP save and argument saving, or gaps between saved arguments.
298 */
299 FUNC(kmem_alloc)
300 leaq -0x1(%rdi),%rax
301 pushq %rbp
302 movq %rax,%rdx
303 movq %rsp,%rbp
304 subq $0x30,%rsp
305 shrq $0x3,%rdx
306 movq %r12,-0x28(%rbp)
307 movq %rbx,-0x30(%rbp)
308 cmpq $0x1ff,%rdx
309 movq %r13,-0x20(%rbp)
310 movq %r14,-0x18(%rbp)
311 movq %rsi,-0x10(%rbp)
312 movq %rdi,-0x8(%rbp)
313 movq %rdi,%r12
314 SET_SIZE(kmem_alloc, kmem_alloc_end)
315
316 FUNC(uts_kill)
317 pushq %rbp
318 movq %rsp,%rbp
319 subq $0x50,%rsp
320 movq %rbx,-0x28(%rbp)
321 leaq -0x50(%rbp),%rbx
322 movq %r12,-0x20(%rbp)
323 movq %r13,-0x18(%rbp)
324 movq %rsi,-0x10(%rbp)
325 movl %edi,%r12d
326 movq %rdi,-0x8(%rbp)
327 SET_SIZE(uts_kill, uts_kill_end)
328
329 FUNC(av1394_ic_bitreverse)
330 movq %rdi,%rdx
331 movq $0x5555555555555555,%rax
332 movq $0x3333333333333333,%rcx
333 shrq $0x1,%rdx
334 pushq %rbp
335 andq %rax,%rdx
336 andq %rdi,%rax
337 addq %rax,%rax
338 movq %rsp,%rbp
339 subq $0x10,%rsp
340 orq %rdx,%rax
341 movq %rdi,-0x8(%rbp)
342 SET_SIZE(av1394_ic_bitreverse, av1394_ic_bitreverse_end)
343
344 /* Problematic functions which should not match */
345
346 FUNC(no_fp) /* No frame pointer */
347 movq %rdi, %rsi
348 movq %rsi, %rdi
349 movq %rbx,-0x28(%rbp)
350 movq %rcx,-0x20(%rbp)
351 movq %rdx,-0x18(%rbp)
352 movq %rsi,-0x10(%rbp)
353 movq %rdi,-0x8(%rbp)
354 subq $0x50,%rsp
355 SET_SIZE(no_fp, no_fp_end)
356
357 /* Small structure return, but with an SSE type (thus forcing it to the stack) */
358 FUNC(small_struct_ret_w_float)
359 pushq %rbp
360 movq %rsp,%rbp
361 movq %rdi,-0x8(%rbp)
362 subq $0x30,%rsp
363 SET_SIZE(small_struct_ret_w_float, small_struct_ret_w_float_end)
364
365 /* Big structure return, but with an SSE type */
366 FUNC(big_struct_ret_w_float)
367 pushq %rbp
368 movq %rsp,%rbp
369 movq %rsi,-0x8(%rbp)
370 subq $0x50,%rsp
371 movq %rsi,-0x48(%rbp)
372 movq -0x48(%rbp),%rax
373 movq %rax,%rsi
374 movl $0x400f60,%edi
375 movl $0x0,%eax
376 movl $0x1770,%edi
377 movl $0x0,%eax
378 leave
379 ret
380 SET_SIZE(big_struct_ret_w_float, big_struct_ret_w_float_end)
381
382 FUNC(big_struct_arg_by_value)
383 pushq %rbp
384 movq %rsp,%rbp
385 movq %rdi,-0x8(%rbp)
386 subq $0x40,%rsp
387 SET_SIZE(big_struct_arg_by_value, big_struct_arg_by_value_end)
388
389 FUNC(small_struct_arg_by_value)
390 pushq %rbp
391 movq %rsp,%rbp
392 movq %rdx,-0x18(%rbp)
393 movq %rsi,-0x10(%rbp)
394 movq %rdi,-0x8(%rbp)
395 subq $0x50,%rsp
396 SET_SIZE(small_struct_arg_by_value, small_struct_arg_by_value_end)