c72ab301 |
/*
* Copyright (c) 2008 Mans Rullgard <mans@mansr.com>
*
* This file is part of FFmpeg.
*
* FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
|
172a39d1 |
#include "config.h"
|
e21a8921 |
#ifdef __ELF__ |
341f394f |
# define ELF
#else
# define ELF @ |
e21a8921 |
#endif |
341f394f |
|
8986fddc |
#if CONFIG_THUMB
# define A @
# define T
#else
# define A
# define T @
#endif
|
8ee2b467 |
#if HAVE_NEON
.arch armv7-a
#elif HAVE_ARMV6T2
.arch armv6t2
#elif HAVE_ARMV6
.arch armv6
#elif HAVE_ARMV5TE
.arch armv5te
#endif
#if HAVE_NEON
.fpu neon |
b3267559 |
#elif HAVE_VFP |
8ee2b467 |
.fpu vfp
#endif
|
371266da |
.syntax unified |
8986fddc |
T .thumb |
51a15ed7 |
ELF .eabi_attribute 25, 1 @ Tag_ABI_align_preserved |
543156d7 |
ELF .section .note.GNU-stack,"",%progbits @ Mark stack as non-executable |
c72ab301 |
|
5dae4872 |
.macro function name, export=0, align=2 |
62634158 |
.set .Lpic_idx, 0
.set .Lpic_gp, 0 |
480cb7ed |
.macro endfunc |
62634158 |
.if .Lpic_idx |
cdb7db5a |
.align 2 |
62634158 |
.altmacro
put_pic %(.Lpic_idx - 1)
.noaltmacro
.endif |
18c31f6f |
ELF .size \name, . - \name |
a7e7d40c |
.endfunc
.purgem endfunc |
480cb7ed |
.endm |
278caa6a |
.text |
5dae4872 |
.align \align |
480cb7ed |
.if \export |
e654b7c2 |
.global EXTERN_ASM\name |
e3fec3f0 |
ELF .type EXTERN_ASM\name, %function
.func EXTERN_ASM\name |
e654b7c2 |
EXTERN_ASM\name: |
e3fec3f0 |
.else |
341f394f |
ELF .type \name, %function |
c72ab301 |
.func \name
\name: |
e3fec3f0 |
.endif |
480cb7ed |
.endm |
172a39d1 |
|
01b75fa9 |
.macro const name, align=2
.macro endconst
ELF .size \name, . - \name
.purgem endconst
.endm
.section .rodata
.align \align
\name:
.endm
|
a7831d50 |
#if !HAVE_ARMV6T2_EXTERNAL |
dac78fd1 |
.macro movw rd, val
mov \rd, \val & 255
orr \rd, \val & ~255
.endm
#endif
|
a4edc5a9 |
.macro mov32 rd, val |
a7831d50 |
#if HAVE_ARMV6T2_EXTERNAL |
a4edc5a9 |
movw \rd, #(\val) & 0xffff
.if (\val) >> 16
movt \rd, #(\val) >> 16
.endif
#else
ldr \rd, =\val
#endif
.endm
|
62634158 |
.macro put_pic num
put_pic_\num
.endm
.macro do_def_pic num, val, label
.macro put_pic_\num
.if \num
.altmacro
put_pic %(\num - 1)
.noaltmacro
.endif
\label: .word \val
.purgem put_pic_\num
.endm
.endm
.macro def_pic val, label
.altmacro
do_def_pic %.Lpic_idx, \val, \label
.noaltmacro
.set .Lpic_idx, .Lpic_idx + 1
.endm
.macro ldpic rd, val, indir=0
ldr \rd, .Lpicoff\@
.Lpic\@:
.if \indir |
7bda4ed7 |
A ldr \rd, [pc, \rd]
T add \rd, pc
T ldr \rd, [\rd] |
62634158 |
.else |
8995d349 |
add \rd, pc |
62634158 |
.endif
def_pic \val - (.Lpic\@ + (8 >> CONFIG_THUMB)), .Lpicoff\@
.endm
|
480cb7ed |
.macro movrel rd, val |
62634158 |
#if CONFIG_PIC
ldpic \rd, \val |
a7831d50 |
#elif HAVE_ARMV6T2_EXTERNAL && !defined(__APPLE__) |
172a39d1 |
movw \rd, #:lower16:\val
movt \rd, #:upper16:\val
#else
ldr \rd, =\val
#endif |
480cb7ed |
.endm |
ce742de2 |
|
62634158 |
.macro movrelx rd, val, gp
#if CONFIG_PIC && defined(__ELF__)
.ifnb \gp
.if .Lpic_gp
.unreq gp
.endif
gp .req \gp
ldpic gp, _GLOBAL_OFFSET_TABLE_
.elseif !.Lpic_gp
gp .req r12
ldpic gp, _GLOBAL_OFFSET_TABLE_
.endif
.set .Lpic_gp, 1
ldr \rd, .Lpicoff\@
ldr \rd, [gp, \rd]
def_pic \val(GOT), .Lpicoff\@
#elif CONFIG_PIC && defined(__APPLE__)
ldpic \rd, .Lpic\@, indir=1
.non_lazy_symbol_pointer
.Lpic\@:
.indirect_symbol \val
.word 0
.text
#else
movrel \rd, \val
#endif
.endm
|
7689eea4 |
.macro add_sh rd, rn, rm, sh:vararg
A add \rd, \rn, \rm, \sh
T mov \rm, \rm, \sh
T add \rd, \rn, \rm
.endm
|
8986fddc |
.macro ldr_pre rt, rn, rm:vararg
A ldr \rt, [\rn, \rm]!
T add \rn, \rn, \rm
T ldr \rt, [\rn]
.endm
|
71ce7602 |
.macro ldr_dpre rt, rn, rm:vararg
A ldr \rt, [\rn, -\rm]!
T sub \rn, \rn, \rm
T ldr \rt, [\rn] |
a5dfeb61 |
.endm
|
dac78fd1 |
.macro ldr_nreg rt, rn, rm:vararg |
62b5197f |
A ldr \rt, [\rn, -\rm]
T sub \rt, \rn, \rm
T ldr \rt, [\rt]
.endm
|
8986fddc |
.macro ldr_post rt, rn, rm:vararg
A ldr \rt, [\rn], \rm
T ldr \rt, [\rn]
T add \rn, \rn, \rm
.endm
|
a1ab3300 |
.macro ldrc_pre cc, rt, rn, rm:vararg
A ldr\cc \rt, [\rn, \rm]!
T itt \cc
T add\cc \rn, \rn, \rm
T ldr\cc \rt, [\rn]
.endm
|
8986fddc |
.macro ldrd_reg rt, rt2, rn, rm
A ldrd \rt, \rt2, [\rn, \rm]
T add \rt, \rn, \rm
T ldrd \rt, \rt2, [\rt]
.endm
.macro ldrd_post rt, rt2, rn, rm
A ldrd \rt, \rt2, [\rn], \rm
T ldrd \rt, \rt2, [\rn]
T add \rn, \rn, \rm
.endm
.macro ldrh_pre rt, rn, rm
A ldrh \rt, [\rn, \rm]!
T add \rn, \rn, \rm
T ldrh \rt, [\rn]
.endm
.macro ldrh_dpre rt, rn, rm
A ldrh \rt, [\rn, -\rm]!
T sub \rn, \rn, \rm
T ldrh \rt, [\rn]
.endm
.macro ldrh_post rt, rn, rm
A ldrh \rt, [\rn], \rm
T ldrh \rt, [\rn]
T add \rn, \rn, \rm
.endm
|
a5dfeb61 |
.macro ldrb_post rt, rn, rm
A ldrb \rt, [\rn], \rm
T ldrb \rt, [\rn]
T add \rn, \rn, \rm
.endm
|
8986fddc |
.macro str_post rt, rn, rm:vararg
A str \rt, [\rn], \rm
T str \rt, [\rn]
T add \rn, \rn, \rm
.endm
.macro strb_post rt, rn, rm:vararg
A strb \rt, [\rn], \rm
T strb \rt, [\rn]
T add \rn, \rn, \rm
.endm
.macro strd_post rt, rt2, rn, rm
A strd \rt, \rt2, [\rn], \rm
T strd \rt, \rt2, [\rn]
T add \rn, \rn, \rm
.endm
.macro strh_pre rt, rn, rm
A strh \rt, [\rn, \rm]!
T add \rn, \rn, \rm
T strh \rt, [\rn]
.endm
.macro strh_dpre rt, rn, rm
A strh \rt, [\rn, -\rm]!
T sub \rn, \rn, \rm
T strh \rt, [\rn]
.endm
.macro strh_post rt, rn, rm
A strh \rt, [\rn], \rm
T strh \rt, [\rn]
T add \rn, \rn, \rm
.endm
.macro strh_dpost rt, rn, rm
A strh \rt, [\rn], -\rm
T strh \rt, [\rn]
T sub \rn, \rn, \rm
.endm
|
ce742de2 |
#if HAVE_VFP_ARGS |
be7952b5 |
ELF .eabi_attribute 28, 1 |
ce742de2 |
# define VFP
# define NOVFP @
#else
# define VFP @
# define NOVFP
#endif |
e654b7c2 |
#define GLUE(a, b) a ## b
#define JOIN(a, b) GLUE(a, b)
#define X(s) JOIN(EXTERN_ASM, s) |