Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
52869 views
1
/****************************************************************************
2
* Assembly testing and benchmarking tool
3
* Copyright (c) 2015 Martin Storsjo
4
* Copyright (c) 2015 Janne Grunau
5
*
6
* This file is part of FFmpeg.
7
*
8
* FFmpeg is free software; you can redistribute it and/or modify
9
* it under the terms of the GNU General Public License as published by
10
* the Free Software Foundation; either version 2 of the License, or
11
* (at your option) any later version.
12
*
13
* FFmpeg is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16
* GNU General Public License for more details.
17
*
18
* You should have received a copy of the GNU General Public License
19
* along with this program; if not, write to the Free Software
20
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA.
21
*****************************************************************************/
22
23
#include "libavutil/aarch64/asm.S"
24
25
const register_init
26
.quad 0x21f86d66c8ca00ce
27
.quad 0x75b6ba21077c48ad
28
.quad 0xed56bb2dcb3c7736
29
.quad 0x8bda43d3fd1a7e06
30
.quad 0xb64a9c9e5d318408
31
.quad 0xdf9a54b303f1d3a3
32
.quad 0x4a75479abd64e097
33
.quad 0x249214109d5d1c88
34
.quad 0x1a1b2550a612b48c
35
.quad 0x79445c159ce79064
36
.quad 0x2eed899d5a28ddcd
37
.quad 0x86b2536fcd8cf636
38
.quad 0xb0856806085e7943
39
.quad 0x3f2bf84fc0fcca4e
40
.quad 0xacbd382dcf5b8de2
41
.quad 0xd229e1f5b281303f
42
.quad 0x71aeaff20b095fd9
43
.quad 0xab63e2e11fa38ed9
44
endconst
45
46
47
const error_message
48
.asciz "failed to preserve register"
49
endconst
50
51
52
// max number of args used by any asm function.
53
#define MAX_ARGS 15
54
55
#define ARG_STACK ((8*(MAX_ARGS - 7) + 15) & ~15)
56
57
function checkasm_checked_call, export=1
58
stp x29, x30, [sp, #-16]!
59
mov x29, sp
60
stp x19, x20, [sp, #-16]!
61
stp x21, x22, [sp, #-16]!
62
stp x23, x24, [sp, #-16]!
63
stp x25, x26, [sp, #-16]!
64
stp x27, x28, [sp, #-16]!
65
stp d8, d9, [sp, #-16]!
66
stp d10, d11, [sp, #-16]!
67
stp d12, d13, [sp, #-16]!
68
stp d14, d15, [sp, #-16]!
69
70
movrel x9, register_init
71
ldp d8, d9, [x9], #16
72
ldp d10, d11, [x9], #16
73
ldp d12, d13, [x9], #16
74
ldp d14, d15, [x9], #16
75
ldp x19, x20, [x9], #16
76
ldp x21, x22, [x9], #16
77
ldp x23, x24, [x9], #16
78
ldp x25, x26, [x9], #16
79
ldp x27, x28, [x9], #16
80
81
sub sp, sp, #ARG_STACK
82
.equ pos, 0
83
// the first stacked arg is copied to x7
84
.rept MAX_ARGS-7
85
ldr x9, [x29, #16 + 8 + pos]
86
str x9, [sp, #pos]
87
.equ pos, pos + 8
88
.endr
89
90
mov x12, x0
91
mov x0, x1
92
mov x1, x2
93
mov x2, x3
94
mov x3, x4
95
mov x4, x5
96
mov x5, x6
97
mov x6, x7
98
ldr x7, [x29, #16]
99
blr x12
100
add sp, sp, #ARG_STACK
101
stp x0, x1, [sp, #-16]!
102
movrel x9, register_init
103
movi v3.8h, #0
104
105
.macro check_reg_neon reg1, reg2
106
ldr q0, [x9], #16
107
uzp1 v1.2d, v\reg1\().2d, v\reg2\().2d
108
eor v0.16b, v0.16b, v1.16b
109
orr v3.16b, v3.16b, v0.16b
110
.endm
111
check_reg_neon 8, 9
112
check_reg_neon 10, 11
113
check_reg_neon 12, 13
114
check_reg_neon 14, 15
115
uqxtn v3.8b, v3.8h
116
umov x3, v3.d[0]
117
118
.macro check_reg reg1, reg2
119
ldp x0, x1, [x9], #16
120
eor x0, x0, \reg1
121
eor x1, x1, \reg2
122
orr x3, x3, x0
123
orr x3, x3, x1
124
.endm
125
check_reg x19, x20
126
check_reg x21, x22
127
check_reg x23, x24
128
check_reg x25, x26
129
check_reg x27, x28
130
131
cbz x3, 0f
132
133
movrel x0, error_message
134
bl X(checkasm_fail_func)
135
0:
136
ldp x0, x1, [sp], #16
137
ldp d14, d15, [sp], #16
138
ldp d12, d13, [sp], #16
139
ldp d10, d11, [sp], #16
140
ldp d8, d9, [sp], #16
141
ldp x27, x28, [sp], #16
142
ldp x25, x26, [sp], #16
143
ldp x23, x24, [sp], #16
144
ldp x21, x22, [sp], #16
145
ldp x19, x20, [sp], #16
146
ldp x29, x30, [sp], #16
147
ret
148
endfunc
149
150