Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
52868 views
1
/*
2
* Copyright (c) 2008 Mans Rullgard <[email protected]>
3
*
4
* This file is part of FFmpeg.
5
*
6
* FFmpeg is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU Lesser General Public
8
* License as published by the Free Software Foundation; either
9
* version 2.1 of the License, or (at your option) any later version.
10
*
11
* FFmpeg is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14
* Lesser General Public License for more details.
15
*
16
* You should have received a copy of the GNU Lesser General Public
17
* License along with FFmpeg; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
*/
20
21
#include "config.h"
22
23
#ifdef __ELF__
24
# define ELF
25
#else
26
# define ELF @
27
#endif
28
29
#if CONFIG_THUMB
30
# define A @
31
# define T
32
#else
33
# define A
34
# define T @
35
#endif
36
37
#if HAVE_AS_FUNC
38
# define FUNC
39
#else
40
# define FUNC @
41
#endif
42
43
#if HAVE_NEON
44
.arch armv7-a
45
#elif HAVE_ARMV6T2
46
.arch armv6t2
47
#elif HAVE_ARMV6
48
.arch armv6
49
#elif HAVE_ARMV5TE
50
.arch armv5te
51
#endif
52
#if HAVE_AS_OBJECT_ARCH
53
ELF .object_arch armv4
54
#endif
55
56
#if HAVE_NEON
57
.fpu neon
58
ELF .eabi_attribute 10, 0 @ suppress Tag_FP_arch
59
ELF .eabi_attribute 12, 0 @ suppress Tag_Advanced_SIMD_arch
60
#elif HAVE_VFP
61
.fpu vfp
62
ELF .eabi_attribute 10, 0 @ suppress Tag_FP_arch
63
#endif
64
65
.syntax unified
66
T .thumb
67
ELF .eabi_attribute 25, 1 @ Tag_ABI_align_preserved
68
ELF .section .note.GNU-stack,"",%progbits @ Mark stack as non-executable
69
70
.macro function name, export=0, align=2
71
.set .Lpic_idx, 0
72
.set .Lpic_gp, 0
73
.macro endfunc
74
.if .Lpic_idx
75
.align 2
76
.altmacro
77
put_pic %(.Lpic_idx - 1)
78
.noaltmacro
79
.endif
80
ELF .size \name, . - \name
81
FUNC .endfunc
82
.purgem endfunc
83
.endm
84
.text
85
.align \align
86
.if \export
87
.global EXTERN_ASM\name
88
ELF .type EXTERN_ASM\name, %function
89
FUNC .func EXTERN_ASM\name
90
EXTERN_ASM\name:
91
.else
92
ELF .type \name, %function
93
FUNC .func \name
94
\name:
95
.endif
96
.endm
97
98
.macro const name, align=2, relocate=0
99
.macro endconst
100
ELF .size \name, . - \name
101
.purgem endconst
102
.endm
103
.if HAVE_SECTION_DATA_REL_RO && \relocate
104
.section .data.rel.ro
105
.else
106
.section .rodata
107
.endif
108
.align \align
109
\name:
110
.endm
111
112
#if !HAVE_ARMV6T2_EXTERNAL
113
.macro movw rd, val
114
mov \rd, \val & 255
115
orr \rd, \val & ~255
116
.endm
117
#endif
118
119
.macro mov32 rd, val
120
#if HAVE_ARMV6T2_EXTERNAL
121
movw \rd, #(\val) & 0xffff
122
.if (\val) >> 16
123
movt \rd, #(\val) >> 16
124
.endif
125
#else
126
ldr \rd, =\val
127
#endif
128
.endm
129
130
.macro put_pic num
131
put_pic_\num
132
.endm
133
134
.macro do_def_pic num, val, label
135
.macro put_pic_\num
136
.if \num
137
.altmacro
138
put_pic %(\num - 1)
139
.noaltmacro
140
.endif
141
\label: .word \val
142
.purgem put_pic_\num
143
.endm
144
.endm
145
146
.macro def_pic val, label
147
.altmacro
148
do_def_pic %.Lpic_idx, \val, \label
149
.noaltmacro
150
.set .Lpic_idx, .Lpic_idx + 1
151
.endm
152
153
.macro ldpic rd, val, indir=0
154
ldr \rd, .Lpicoff\@
155
.Lpic\@:
156
.if \indir
157
A ldr \rd, [pc, \rd]
158
T add \rd, pc
159
T ldr \rd, [\rd]
160
.else
161
add \rd, pc
162
.endif
163
def_pic \val - (.Lpic\@ + (8 >> CONFIG_THUMB)), .Lpicoff\@
164
.endm
165
166
.macro movrel rd, val
167
#if CONFIG_PIC
168
ldpic \rd, \val
169
#elif HAVE_ARMV6T2_EXTERNAL && !defined(__APPLE__)
170
movw \rd, #:lower16:\val
171
movt \rd, #:upper16:\val
172
#else
173
ldr \rd, =\val
174
#endif
175
.endm
176
177
.macro movrelx rd, val, gp
178
#if CONFIG_PIC && defined(__ELF__)
179
.ifnb \gp
180
.if .Lpic_gp
181
.unreq gp
182
.endif
183
gp .req \gp
184
ldpic gp, _GLOBAL_OFFSET_TABLE_
185
.elseif !.Lpic_gp
186
gp .req r12
187
ldpic gp, _GLOBAL_OFFSET_TABLE_
188
.endif
189
.set .Lpic_gp, 1
190
ldr \rd, .Lpicoff\@
191
ldr \rd, [gp, \rd]
192
def_pic \val(GOT), .Lpicoff\@
193
#elif CONFIG_PIC && defined(__APPLE__)
194
ldpic \rd, .Lpic\@, indir=1
195
.non_lazy_symbol_pointer
196
.Lpic\@:
197
.indirect_symbol \val
198
.word 0
199
.text
200
#else
201
movrel \rd, \val
202
#endif
203
.endm
204
205
.macro add_sh rd, rn, rm, sh:vararg
206
A add \rd, \rn, \rm, \sh
207
T mov \rm, \rm, \sh
208
T add \rd, \rn, \rm
209
.endm
210
211
.macro ldr_pre rt, rn, rm:vararg
212
A ldr \rt, [\rn, \rm]!
213
T add \rn, \rn, \rm
214
T ldr \rt, [\rn]
215
.endm
216
217
.macro ldr_dpre rt, rn, rm:vararg
218
A ldr \rt, [\rn, -\rm]!
219
T sub \rn, \rn, \rm
220
T ldr \rt, [\rn]
221
.endm
222
223
.macro ldr_nreg rt, rn, rm:vararg
224
A ldr \rt, [\rn, -\rm]
225
T sub \rt, \rn, \rm
226
T ldr \rt, [\rt]
227
.endm
228
229
.macro ldr_post rt, rn, rm:vararg
230
A ldr \rt, [\rn], \rm
231
T ldr \rt, [\rn]
232
T add \rn, \rn, \rm
233
.endm
234
235
.macro ldrc_pre cc, rt, rn, rm:vararg
236
A ldr\cc \rt, [\rn, \rm]!
237
T itt \cc
238
T add\cc \rn, \rn, \rm
239
T ldr\cc \rt, [\rn]
240
.endm
241
242
.macro ldrd_reg rt, rt2, rn, rm
243
A ldrd \rt, \rt2, [\rn, \rm]
244
T add \rt, \rn, \rm
245
T ldrd \rt, \rt2, [\rt]
246
.endm
247
248
.macro ldrd_post rt, rt2, rn, rm
249
A ldrd \rt, \rt2, [\rn], \rm
250
T ldrd \rt, \rt2, [\rn]
251
T add \rn, \rn, \rm
252
.endm
253
254
.macro ldrh_pre rt, rn, rm
255
A ldrh \rt, [\rn, \rm]!
256
T add \rn, \rn, \rm
257
T ldrh \rt, [\rn]
258
.endm
259
260
.macro ldrh_dpre rt, rn, rm
261
A ldrh \rt, [\rn, -\rm]!
262
T sub \rn, \rn, \rm
263
T ldrh \rt, [\rn]
264
.endm
265
266
.macro ldrh_post rt, rn, rm
267
A ldrh \rt, [\rn], \rm
268
T ldrh \rt, [\rn]
269
T add \rn, \rn, \rm
270
.endm
271
272
.macro ldrb_post rt, rn, rm
273
A ldrb \rt, [\rn], \rm
274
T ldrb \rt, [\rn]
275
T add \rn, \rn, \rm
276
.endm
277
278
.macro str_post rt, rn, rm:vararg
279
A str \rt, [\rn], \rm
280
T str \rt, [\rn]
281
T add \rn, \rn, \rm
282
.endm
283
284
.macro strb_post rt, rn, rm:vararg
285
A strb \rt, [\rn], \rm
286
T strb \rt, [\rn]
287
T add \rn, \rn, \rm
288
.endm
289
290
.macro strd_post rt, rt2, rn, rm
291
A strd \rt, \rt2, [\rn], \rm
292
T strd \rt, \rt2, [\rn]
293
T add \rn, \rn, \rm
294
.endm
295
296
.macro strh_pre rt, rn, rm
297
A strh \rt, [\rn, \rm]!
298
T add \rn, \rn, \rm
299
T strh \rt, [\rn]
300
.endm
301
302
.macro strh_dpre rt, rn, rm
303
A strh \rt, [\rn, -\rm]!
304
T sub \rn, \rn, \rm
305
T strh \rt, [\rn]
306
.endm
307
308
.macro strh_post rt, rn, rm
309
A strh \rt, [\rn], \rm
310
T strh \rt, [\rn]
311
T add \rn, \rn, \rm
312
.endm
313
314
.macro strh_dpost rt, rn, rm
315
A strh \rt, [\rn], -\rm
316
T strh \rt, [\rn]
317
T sub \rn, \rn, \rm
318
.endm
319
320
#if HAVE_VFP_ARGS
321
ELF .eabi_attribute 28, 1
322
# define VFP
323
# define NOVFP @
324
#else
325
# define VFP @
326
# define NOVFP
327
#endif
328
329
#define GLUE(a, b) a ## b
330
#define JOIN(a, b) GLUE(a, b)
331
#define X(s) JOIN(EXTERN_ASM, s)
332
333