]> git.sesse.net Git - x264/blob - common/arm/asm.S
arm: check if the assembler supports the '.func' directive
[x264] / common / arm / asm.S
1 /*****************************************************************************
2  * asm.S: arm utility macros
3  *****************************************************************************
4  * Copyright (C) 2008-2014 x264 project
5  *
6  * Authors: Mans Rullgard <mans@mansr.com>
7  *          David Conrad <lessen42@gmail.com>
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 licensing@x264.com.
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 .macro require8, val=1
60 ELF     .eabi_attribute 24, \val
61 .endm
62
63 .macro preserve8, val=1
64 ELF     .eabi_attribute 25, \val
65 .endm
66
67 .macro function name, export=1
68     .macro endfunc
69 ELF     .size   \name, . - \name
70 FUNC    .endfunc
71         .purgem endfunc
72     .endm
73         .align  2
74 .if \export == 1
75         .global EXTERN_ASM\name
76 ELF     .hidden EXTERN_ASM\name
77 ELF     .type   EXTERN_ASM\name, %function
78 FUNC    .func   EXTERN_ASM\name
79 EXTERN_ASM\name:
80 .else
81 ELF     .hidden \name
82 ELF     .type   \name, %function
83 FUNC    .func   \name
84 \name:
85 .endif
86 .endm
87
88 .macro movrel rd, val
89 #if HAVE_ARMV6T2 && !defined(PIC)
90         movw            \rd, #:lower16:\val
91         movt            \rd, #:upper16:\val
92 #else
93         ldr             \rd, =\val
94 #endif
95 .endm
96
97 .macro movconst rd, val
98 #if HAVE_ARMV6T2
99     movw        \rd, #:lower16:\val
100 .if \val >> 16
101     movt        \rd, #:upper16:\val
102 .endif
103 #else
104     ldr         \rd, =\val
105 #endif
106 .endm
107
108 #define GLUE(a, b) a ## b
109 #define JOIN(a, b) GLUE(a, b)
110 #define X(s) JOIN(EXTERN_ASM, s)
111
112 #define FENC_STRIDE 16
113 #define FDEC_STRIDE 32
114
115 .macro HORIZ_ADD dest, a, b
116 .ifnb \b
117     vadd.u16    \a, \a, \b
118 .endif
119     vpaddl.u16  \a, \a
120     vpaddl.u32  \dest, \a
121 .endm
122
123 .macro SUMSUB_AB sum, diff, a, b
124     vadd.s16    \sum,  \a, \b
125     vsub.s16    \diff, \a, \b
126 .endm
127
128 .macro SUMSUB_ABCD s1, d1, s2, d2, a, b, c, d
129     SUMSUB_AB   \s1, \d1, \a, \b
130     SUMSUB_AB   \s2, \d2, \c, \d
131 .endm
132
133 .macro ABS2 a b
134     vabs.s16 \a, \a
135     vabs.s16 \b, \b
136 .endm
137
138 // dist = distance in elements (0 for vertical pass, 1/2 for horizontal passes)
139 // op = sumsub/amax (sum and diff / maximum of absolutes)
140 // d1/2 = destination registers
141 // s1/2 = source registers
142 .macro HADAMARD dist, op, d1, d2, s1, s2
143 .if \dist == 1
144     vtrn.16     \s1, \s2
145 .else
146     vtrn.32     \s1, \s2
147 .endif
148 .ifc \op, sumsub
149     SUMSUB_AB   \d1, \d2, \s1, \s2
150 .else
151     vabs.s16    \s1, \s1
152     vabs.s16    \s2, \s2
153     vmax.s16    \d1, \s1, \s2
154 .endif
155 .endm
156
157 .macro TRANSPOSE8x8 r0 r1 r2 r3 r4 r5 r6 r7
158     vtrn.32         \r0, \r4
159     vtrn.32         \r1, \r5
160     vtrn.32         \r2, \r6
161     vtrn.32         \r3, \r7
162     vtrn.16         \r0, \r2
163     vtrn.16         \r1, \r3
164     vtrn.16         \r4, \r6
165     vtrn.16         \r5, \r7
166     vtrn.8          \r0, \r1
167     vtrn.8          \r2, \r3
168     vtrn.8          \r4, \r5
169     vtrn.8          \r6, \r7
170 .endm
171
172 .macro TRANSPOSE4x4 r0 r1 r2 r3
173     vtrn.16         \r0, \r2
174     vtrn.16         \r1, \r3
175     vtrn.8          \r0, \r1
176     vtrn.8          \r2, \r3
177 .endm
178
179 .macro TRANSPOSE4x4_16  d0 d1 d2 d3
180     vtrn.32     \d0, \d2
181     vtrn.32     \d1, \d3
182     vtrn.16     \d0, \d1
183     vtrn.16     \d2, \d3
184 .endm