summaryrefslogtreecommitdiff
path: root/libavutil/arm/asm.S (plain)
blob: 2b0d0f67e84fd58d423e2ff9af949200326368d1
1/*
2 * Copyright (c) 2008 Mans Rullgard <mans@mansr.com>
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_NEON
38 .arch armv7-a
39#elif HAVE_ARMV6T2
40 .arch armv6t2
41#elif HAVE_ARMV6
42 .arch armv6
43#elif HAVE_ARMV5TE
44 .arch armv5te
45#endif
46
47#if HAVE_NEON
48 .fpu neon
49#elif HAVE_VFP
50 .fpu vfp
51#endif
52
53 .syntax unified
54T .thumb
55ELF .eabi_attribute 25, 1 @ Tag_ABI_align_preserved
56
57.macro function name, export=0
58 .set .Lpic_idx, 0
59 .set .Lpic_gp, 0
60 .macro endfunc
61 .if .Lpic_idx
62 .align 2
63 .altmacro
64 put_pic %(.Lpic_idx - 1)
65 .noaltmacro
66 .endif
67ELF .size \name, . - \name
68 .endfunc
69 .purgem endfunc
70 .endm
71 .text
72 .align 2
73 .if \export
74 .global EXTERN_ASM\name
75EXTERN_ASM\name:
76 .endif
77ELF .type \name, %function
78 .func \name
79\name:
80.endm
81
82.macro const name, align=2, relocate=0
83 .macro endconst
84ELF .size \name, . - \name
85 .purgem endconst
86 .endm
87.if HAVE_SECTION_DATA_REL_RO && \relocate
88 .section .data.rel.ro
89.else
90 .section .rodata
91.endif
92 .align \align
93\name:
94.endm
95
96#if !HAVE_ARMV6T2_EXTERNAL
97.macro movw rd, val
98 mov \rd, \val & 255
99 orr \rd, \val & ~255
100.endm
101#endif
102
103.macro mov32 rd, val
104#if HAVE_ARMV6T2_EXTERNAL
105 movw \rd, #(\val) & 0xffff
106 .if (\val) >> 16
107 movt \rd, #(\val) >> 16
108 .endif
109#else
110 ldr \rd, =\val
111#endif
112.endm
113
114.macro put_pic num
115 put_pic_\num
116.endm
117
118.macro do_def_pic num, val, label
119 .macro put_pic_\num
120 .if \num
121 .altmacro
122 put_pic %(\num - 1)
123 .noaltmacro
124 .endif
125\label: .word \val
126 .purgem put_pic_\num
127 .endm
128.endm
129
130.macro def_pic val, label
131 .altmacro
132 do_def_pic %.Lpic_idx, \val, \label
133 .noaltmacro
134 .set .Lpic_idx, .Lpic_idx + 1
135.endm
136
137.macro ldpic rd, val, indir=0
138 ldr \rd, .Lpicoff\@
139.Lpic\@:
140 .if \indir
141A ldr \rd, [pc, \rd]
142T add \rd, pc
143T ldr \rd, [\rd]
144 .else
145 add \rd, pc
146 .endif
147 def_pic \val - (.Lpic\@ + (8 >> CONFIG_THUMB)), .Lpicoff\@
148.endm
149
150.macro movrel rd, val
151#if CONFIG_PIC
152 ldpic \rd, \val
153#elif HAVE_ARMV6T2_EXTERNAL && !defined(__APPLE__)
154 movw \rd, #:lower16:\val
155 movt \rd, #:upper16:\val
156#else
157 ldr \rd, =\val
158#endif
159.endm
160
161.macro movrelx rd, val, gp
162#if CONFIG_PIC && defined(__ELF__)
163 .ifnb \gp
164 .if .Lpic_gp
165 .unreq gp
166 .endif
167 gp .req \gp
168 ldpic gp, _GLOBAL_OFFSET_TABLE_
169 .elseif !.Lpic_gp
170 gp .req r12
171 ldpic gp, _GLOBAL_OFFSET_TABLE_
172 .endif
173 .set .Lpic_gp, 1
174 ldr \rd, .Lpicoff\@
175 ldr \rd, [gp, \rd]
176 def_pic \val(GOT), .Lpicoff\@
177#elif CONFIG_PIC && defined(__APPLE__)
178 ldpic \rd, .Lpic\@, indir=1
179 .non_lazy_symbol_pointer
180.Lpic\@:
181 .indirect_symbol \val
182 .word 0
183 .text
184#else
185 movrel \rd, \val
186#endif
187.endm
188
189.macro add_sh rd, rn, rm, sh:vararg
190A add \rd, \rn, \rm, \sh
191T mov \rm, \rm, \sh
192T add \rd, \rn, \rm
193.endm
194
195.macro ldr_pre rt, rn, rm:vararg
196A ldr \rt, [\rn, \rm]!
197T add \rn, \rn, \rm
198T ldr \rt, [\rn]
199.endm
200
201.macro ldr_dpre rt, rn, rm:vararg
202A ldr \rt, [\rn, -\rm]!
203T sub \rn, \rn, \rm
204T ldr \rt, [\rn]
205.endm
206
207.macro ldr_nreg rt, rn, rm:vararg
208A ldr \rt, [\rn, -\rm]
209T sub \rt, \rn, \rm
210T ldr \rt, [\rt]
211.endm
212
213.macro ldr_post rt, rn, rm:vararg
214A ldr \rt, [\rn], \rm
215T ldr \rt, [\rn]
216T add \rn, \rn, \rm
217.endm
218
219.macro ldrd_reg rt, rt2, rn, rm
220A ldrd \rt, \rt2, [\rn, \rm]
221T add \rt, \rn, \rm
222T ldrd \rt, \rt2, [\rt]
223.endm
224
225.macro ldrd_post rt, rt2, rn, rm
226A ldrd \rt, \rt2, [\rn], \rm
227T ldrd \rt, \rt2, [\rn]
228T add \rn, \rn, \rm
229.endm
230
231.macro ldrh_pre rt, rn, rm
232A ldrh \rt, [\rn, \rm]!
233T add \rn, \rn, \rm
234T ldrh \rt, [\rn]
235.endm
236
237.macro ldrh_dpre rt, rn, rm
238A ldrh \rt, [\rn, -\rm]!
239T sub \rn, \rn, \rm
240T ldrh \rt, [\rn]
241.endm
242
243.macro ldrh_post rt, rn, rm
244A ldrh \rt, [\rn], \rm
245T ldrh \rt, [\rn]
246T add \rn, \rn, \rm
247.endm
248
249.macro ldrb_post rt, rn, rm
250A ldrb \rt, [\rn], \rm
251T ldrb \rt, [\rn]
252T add \rn, \rn, \rm
253.endm
254
255.macro str_post rt, rn, rm:vararg
256A str \rt, [\rn], \rm
257T str \rt, [\rn]
258T add \rn, \rn, \rm
259.endm
260
261.macro strb_post rt, rn, rm:vararg
262A strb \rt, [\rn], \rm
263T strb \rt, [\rn]
264T add \rn, \rn, \rm
265.endm
266
267.macro strd_post rt, rt2, rn, rm
268A strd \rt, \rt2, [\rn], \rm
269T strd \rt, \rt2, [\rn]
270T add \rn, \rn, \rm
271.endm
272
273.macro strh_pre rt, rn, rm
274A strh \rt, [\rn, \rm]!
275T add \rn, \rn, \rm
276T strh \rt, [\rn]
277.endm
278
279.macro strh_dpre rt, rn, rm
280A strh \rt, [\rn, -\rm]!
281T sub \rn, \rn, \rm
282T strh \rt, [\rn]
283.endm
284
285.macro strh_post rt, rn, rm
286A strh \rt, [\rn], \rm
287T strh \rt, [\rn]
288T add \rn, \rn, \rm
289.endm
290
291.macro strh_dpost rt, rn, rm
292A strh \rt, [\rn], -\rm
293T strh \rt, [\rn]
294T sub \rn, \rn, \rm
295.endm
296
297#if HAVE_VFP_ARGS
298ELF .eabi_attribute 28, 1
299# define VFP
300# define NOVFP @
301#else
302# define VFP @
303# define NOVFP
304#endif
305
306#define GLUE(a, b) a ## b
307#define JOIN(a, b) GLUE(a, b)
308#define X(s) JOIN(EXTERN_ASM, s)
309