1/* 2 * Copyright (c) 2008 Mans Rullgard <mans@mansr.com> 3 * 4 * This file is part of Libav. 5 * 6 * Libav 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 * Libav 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 Libav; 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_ARMVFP 50 .fpu vfp 51#endif 52 53 .syntax unified 54T .thumb 55 56.macro require8 val=1 57ELF .eabi_attribute 24, \val 58.endm 59 60.macro preserve8 val=1 61ELF .eabi_attribute 25, \val 62.endm 63 64.macro function name, export=0 65 .macro endfunc 66ELF .size \name, . - \name 67 .endfunc 68 .purgem endfunc 69 .endm 70 .text 71 .align 2 72 .if \export 73 .global EXTERN_ASM\name 74EXTERN_ASM\name: 75 .endif 76ELF .type \name, %function 77 .func \name 78\name: 79.endm 80 81.macro const name, align=2 82 .macro endconst 83ELF .size \name, . - \name 84 .purgem endconst 85 .endm 86 .section .rodata 87 .align \align 88\name: 89.endm 90 91.macro mov32 rd, val 92#if HAVE_ARMV6T2 93 movw \rd, #(\val) & 0xffff 94 .if (\val) >> 16 95 movt \rd, #(\val) >> 16 96 .endif 97#else 98 ldr \rd, =\val 99#endif 100.endm 101 102.macro movrel rd, val 103#if HAVE_ARMV6T2 && !CONFIG_PIC && !defined(__APPLE__) 104 movw \rd, #:lower16:\val 105 movt \rd, #:upper16:\val 106#else 107 ldr \rd, =\val 108#endif 109.endm 110 111.macro ldr_pre rt, rn, rm:vararg 112A ldr \rt, [\rn, \rm]! 113T add \rn, \rn, \rm 114T ldr \rt, [\rn] 115.endm 116 117.macro ldr_dpre rt, rn, rm:vararg 118A ldr \rt, [\rn, -\rm]! 119T sub \rn, \rn, \rm 120T ldr \rt, [\rn] 121.endm 122 123.macro ldr_post rt, rn, rm:vararg 124A ldr \rt, [\rn], \rm 125T ldr \rt, [\rn] 126T add \rn, \rn, \rm 127.endm 128 129.macro ldrd_reg rt, rt2, rn, rm 130A ldrd \rt, \rt2, [\rn, \rm] 131T add \rt, \rn, \rm 132T ldrd \rt, \rt2, [\rt] 133.endm 134 135.macro ldrd_post rt, rt2, rn, rm 136A ldrd \rt, \rt2, [\rn], \rm 137T ldrd \rt, \rt2, [\rn] 138T add \rn, \rn, \rm 139.endm 140 141.macro ldrh_pre rt, rn, rm 142A ldrh \rt, [\rn, \rm]! 143T add \rn, \rn, \rm 144T ldrh \rt, [\rn] 145.endm 146 147.macro ldrh_dpre rt, rn, rm 148A ldrh \rt, [\rn, -\rm]! 149T sub \rn, \rn, \rm 150T ldrh \rt, [\rn] 151.endm 152 153.macro ldrh_post rt, rn, rm 154A ldrh \rt, [\rn], \rm 155T ldrh \rt, [\rn] 156T add \rn, \rn, \rm 157.endm 158 159.macro str_post rt, rn, rm:vararg 160A str \rt, [\rn], \rm 161T str \rt, [\rn] 162T add \rn, \rn, \rm 163.endm 164 165.macro strb_post rt, rn, rm:vararg 166A strb \rt, [\rn], \rm 167T strb \rt, [\rn] 168T add \rn, \rn, \rm 169.endm 170 171.macro strd_post rt, rt2, rn, rm 172A strd \rt, \rt2, [\rn], \rm 173T strd \rt, \rt2, [\rn] 174T add \rn, \rn, \rm 175.endm 176 177.macro strh_pre rt, rn, rm 178A strh \rt, [\rn, \rm]! 179T add \rn, \rn, \rm 180T strh \rt, [\rn] 181.endm 182 183.macro strh_dpre rt, rn, rm 184A strh \rt, [\rn, -\rm]! 185T sub \rn, \rn, \rm 186T strh \rt, [\rn] 187.endm 188 189.macro strh_post rt, rn, rm 190A strh \rt, [\rn], \rm 191T strh \rt, [\rn] 192T add \rn, \rn, \rm 193.endm 194 195.macro strh_dpost rt, rn, rm 196A strh \rt, [\rn], -\rm 197T strh \rt, [\rn] 198T sub \rn, \rn, \rm 199.endm 200 201#if HAVE_VFP_ARGS 202 .eabi_attribute 28, 1 203# define VFP 204# define NOVFP @ 205#else 206# define VFP @ 207# define NOVFP 208#endif 209 210#define GLUE(a, b) a ## b 211#define JOIN(a, b) GLUE(a, b) 212#define X(s) JOIN(EXTERN_ASM, s) 213