Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
52867 views
1
/*****************************************************************************
2
* asm.S: arm utility macros
3
*****************************************************************************
4
* Copyright (C) 2008-2016 x264 project
5
*
6
* Authors: Mans Rullgard <[email protected]>
7
* David Conrad <[email protected]>
8
*
9
* This program is free software; you can redistribute it and/or modify
10
* it under the terms of the GNU General Public License as published by
11
* the Free Software Foundation; either version 2 of the License, or
12
* (at your option) any later version.
13
*
14
* This program is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
* GNU General Public License for more details.
18
*
19
* You should have received a copy of the GNU General Public License
20
* along with this program; if not, write to the Free Software
21
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111, USA.
22
*
23
* This program is also available under a commercial proprietary license.
24
* For more information, contact us at [email protected].
25
*****************************************************************************/
26
27
#include "config.h"
28
29
.syntax unified
30
31
#if HAVE_NEON
32
.arch armv7-a
33
#elif HAVE_ARMV6T2
34
.arch armv6t2
35
#elif HAVE_ARMV6
36
.arch armv6
37
#endif
38
39
.fpu neon
40
41
#ifdef PREFIX
42
# define EXTERN_ASM _
43
#else
44
# define EXTERN_ASM
45
#endif
46
47
#ifdef __ELF__
48
# define ELF
49
#else
50
# define ELF @
51
#endif
52
53
#if HAVE_AS_FUNC
54
# define FUNC
55
#else
56
# define FUNC @
57
#endif
58
59
#if SYS_LINUX
60
#define HAVE_SECTION_DATA_REL_RO 1
61
#else
62
#define HAVE_SECTION_DATA_REL_RO 0
63
#endif
64
65
.macro require8, val=1
66
ELF .eabi_attribute 24, \val
67
.endm
68
69
.macro preserve8, val=1
70
ELF .eabi_attribute 25, \val
71
.endm
72
73
.macro function name, export=1
74
.macro endfunc
75
ELF .size \name, . - \name
76
FUNC .endfunc
77
.purgem endfunc
78
.endm
79
.align 2
80
.if \export == 1
81
.global EXTERN_ASM\name
82
ELF .hidden EXTERN_ASM\name
83
ELF .type EXTERN_ASM\name, %function
84
FUNC .func EXTERN_ASM\name
85
EXTERN_ASM\name:
86
.else
87
ELF .hidden \name
88
ELF .type \name, %function
89
FUNC .func \name
90
\name:
91
.endif
92
.endm
93
94
.macro const name, align=2, relocate=0
95
.macro endconst
96
ELF .size \name, . - \name
97
.purgem endconst
98
.endm
99
.if HAVE_SECTION_DATA_REL_RO && \relocate
100
.section .data.rel.ro
101
.else
102
.section .rodata
103
.endif
104
.align \align
105
\name:
106
.endm
107
108
.macro movrel rd, val
109
#if defined(PIC)
110
ldr \rd, 1f
111
b 2f
112
1:
113
@ FIXME: thumb
114
.word \val - (2f + 8)
115
2:
116
add \rd, \rd, pc
117
#elif HAVE_ARMV6T2
118
movw \rd, #:lower16:\val
119
movt \rd, #:upper16:\val
120
#else
121
ldr \rd, =\val
122
#endif
123
.endm
124
125
.macro movrelx rd, val, got
126
#if defined(PIC) && defined(__ELF__)
127
ldr \got, 2f
128
ldr \rd, 1f
129
b 3f
130
1:
131
@ FIXME: thumb
132
.word \val(GOT)
133
2:
134
.word _GLOBAL_OFFSET_TABLE_ - (3f + 8)
135
3:
136
add \got, \got, pc
137
ldr \rd, [\got, \rd]
138
#elif defined(PIC) && defined(__APPLE__)
139
ldr \rd, 1f
140
b 2f
141
1:
142
@ FIXME: thumb
143
.word 3f - (2f + 8)
144
2:
145
ldr \rd, [pc, \rd]
146
.non_lazy_symbol_pointer
147
3:
148
.indirect_symbol \val
149
.word 0
150
.text
151
#else
152
movrel \rd, \val
153
#endif
154
.endm
155
156
.macro movconst rd, val
157
#if HAVE_ARMV6T2
158
movw \rd, #:lower16:\val
159
.if \val >> 16
160
movt \rd, #:upper16:\val
161
.endif
162
#else
163
ldr \rd, =\val
164
#endif
165
.endm
166
167
#define GLUE(a, b) a ## b
168
#define JOIN(a, b) GLUE(a, b)
169
#define X(s) JOIN(EXTERN_ASM, s)
170
171
#define FENC_STRIDE 16
172
#define FDEC_STRIDE 32
173
174
.macro HORIZ_ADD dest, a, b
175
.ifnb \b
176
vadd.u16 \a, \a, \b
177
.endif
178
vpaddl.u16 \a, \a
179
vpaddl.u32 \dest, \a
180
.endm
181
182
.macro SUMSUB_AB sum, diff, a, b
183
vadd.s16 \sum, \a, \b
184
vsub.s16 \diff, \a, \b
185
.endm
186
187
.macro SUMSUB_ABCD s1, d1, s2, d2, a, b, c, d
188
SUMSUB_AB \s1, \d1, \a, \b
189
SUMSUB_AB \s2, \d2, \c, \d
190
.endm
191
192
.macro ABS2 a b
193
vabs.s16 \a, \a
194
vabs.s16 \b, \b
195
.endm
196
197
// dist = distance in elements (0 for vertical pass, 1/2 for horizontal passes)
198
// op = sumsub/amax (sum and diff / maximum of absolutes)
199
// d1/2 = destination registers
200
// s1/2 = source registers
201
.macro HADAMARD dist, op, d1, d2, s1, s2
202
.if \dist == 1
203
vtrn.16 \s1, \s2
204
.else
205
vtrn.32 \s1, \s2
206
.endif
207
.ifc \op, sumsub
208
SUMSUB_AB \d1, \d2, \s1, \s2
209
.else
210
vabs.s16 \s1, \s1
211
vabs.s16 \s2, \s2
212
vmax.s16 \d1, \s1, \s2
213
.endif
214
.endm
215
216
.macro TRANSPOSE8x8 r0 r1 r2 r3 r4 r5 r6 r7
217
vtrn.32 \r0, \r4
218
vtrn.32 \r1, \r5
219
vtrn.32 \r2, \r6
220
vtrn.32 \r3, \r7
221
vtrn.16 \r0, \r2
222
vtrn.16 \r1, \r3
223
vtrn.16 \r4, \r6
224
vtrn.16 \r5, \r7
225
vtrn.8 \r0, \r1
226
vtrn.8 \r2, \r3
227
vtrn.8 \r4, \r5
228
vtrn.8 \r6, \r7
229
.endm
230
231
.macro TRANSPOSE4x4 r0 r1 r2 r3
232
vtrn.16 \r0, \r2
233
vtrn.16 \r1, \r3
234
vtrn.8 \r0, \r1
235
vtrn.8 \r2, \r3
236
.endm
237
238
.macro TRANSPOSE4x4_16 d0 d1 d2 d3
239
vtrn.32 \d0, \d2
240
vtrn.32 \d1, \d3
241
vtrn.16 \d0, \d1
242
vtrn.16 \d2, \d3
243
.endm
244
245