]> git.sesse.net Git - x264/blob - common/arm/asm.S
Bump dates to 2016
[x264] / common / arm / asm.S
1 /*****************************************************************************
2  * asm.S: arm utility macros
3  *****************************************************************************
4  * Copyright (C) 2008-2016 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 #if SYS_LINUX
60 #define HAVE_SECTION_DATA_REL_RO 1
61 #else
62 #define HAVE_SECTION_DATA_REL_RO 0
63 #endif
64
65 .macro require8, val=1
66 ELF     .eabi_attribute 24, \val
67 .endm
68
69 .macro preserve8, val=1
70 ELF     .eabi_attribute 25, \val
71 .endm
72
73 .macro function name, export=1
74     .macro endfunc
75 ELF     .size   \name, . - \name
76 FUNC    .endfunc
77         .purgem endfunc
78     .endm
79         .align  2
80 .if \export == 1
81         .global EXTERN_ASM\name
82 ELF     .hidden EXTERN_ASM\name
83 ELF     .type   EXTERN_ASM\name, %function
84 FUNC    .func   EXTERN_ASM\name
85 EXTERN_ASM\name:
86 .else
87 ELF     .hidden \name
88 ELF     .type   \name, %function
89 FUNC    .func   \name
90 \name:
91 .endif
92 .endm
93
94 .macro const name, align=2, relocate=0
95     .macro endconst
96 ELF     .size   \name, . - \name
97         .purgem endconst
98     .endm
99 .if HAVE_SECTION_DATA_REL_RO && \relocate
100         .section        .data.rel.ro
101 .else
102         .section        .rodata
103 .endif
104         .align          \align
105 \name:
106 .endm
107
108 .macro movrel rd, val
109 #if defined(PIC)
110         ldr             \rd,  1f
111         b               2f
112 1:
113 @ FIXME: thumb
114         .word           \val - (2f + 8)
115 2:
116         add             \rd,  \rd,  pc
117 #elif HAVE_ARMV6T2
118         movw            \rd, #:lower16:\val
119         movt            \rd, #:upper16:\val
120 #else
121         ldr             \rd, =\val
122 #endif
123 .endm
124
125 .macro movrelx rd, val, got
126 #if defined(PIC) && defined(__ELF__)
127         ldr             \got, 2f
128         ldr             \rd,  1f
129         b               3f
130 1:
131 @ FIXME: thumb
132         .word \val(GOT)
133 2:
134         .word _GLOBAL_OFFSET_TABLE_ - (3f + 8)
135 3:
136         add             \got, \got, pc
137         ldr             \rd, [\got, \rd]
138 #elif defined(PIC) && defined(__APPLE__)
139         ldr             \rd,  1f
140         b               2f
141 1:
142 @ FIXME: thumb
143         .word           3f - (2f + 8)
144 2:
145         ldr             \rd, [pc, \rd]
146         .non_lazy_symbol_pointer
147 3:
148         .indirect_symbol \val
149         .word           0
150         .text
151 #else
152         movrel          \rd, \val
153 #endif
154 .endm
155
156 .macro movconst rd, val
157 #if HAVE_ARMV6T2
158     movw        \rd, #:lower16:\val
159 .if \val >> 16
160     movt        \rd, #:upper16:\val
161 .endif
162 #else
163     ldr         \rd, =\val
164 #endif
165 .endm
166
167 #define GLUE(a, b) a ## b
168 #define JOIN(a, b) GLUE(a, b)
169 #define X(s) JOIN(EXTERN_ASM, s)
170
171 #define FENC_STRIDE 16
172 #define FDEC_STRIDE 32
173
174 .macro HORIZ_ADD dest, a, b
175 .ifnb \b
176     vadd.u16    \a, \a, \b
177 .endif
178     vpaddl.u16  \a, \a
179     vpaddl.u32  \dest, \a
180 .endm
181
182 .macro SUMSUB_AB sum, diff, a, b
183     vadd.s16    \sum,  \a, \b
184     vsub.s16    \diff, \a, \b
185 .endm
186
187 .macro SUMSUB_ABCD s1, d1, s2, d2, a, b, c, d
188     SUMSUB_AB   \s1, \d1, \a, \b
189     SUMSUB_AB   \s2, \d2, \c, \d
190 .endm
191
192 .macro ABS2 a b
193     vabs.s16 \a, \a
194     vabs.s16 \b, \b
195 .endm
196
197 // dist = distance in elements (0 for vertical pass, 1/2 for horizontal passes)
198 // op = sumsub/amax (sum and diff / maximum of absolutes)
199 // d1/2 = destination registers
200 // s1/2 = source registers
201 .macro HADAMARD dist, op, d1, d2, s1, s2
202 .if \dist == 1
203     vtrn.16     \s1, \s2
204 .else
205     vtrn.32     \s1, \s2
206 .endif
207 .ifc \op, sumsub
208     SUMSUB_AB   \d1, \d2, \s1, \s2
209 .else
210     vabs.s16    \s1, \s1
211     vabs.s16    \s2, \s2
212     vmax.s16    \d1, \s1, \s2
213 .endif
214 .endm
215
216 .macro TRANSPOSE8x8 r0 r1 r2 r3 r4 r5 r6 r7
217     vtrn.32         \r0, \r4
218     vtrn.32         \r1, \r5
219     vtrn.32         \r2, \r6
220     vtrn.32         \r3, \r7
221     vtrn.16         \r0, \r2
222     vtrn.16         \r1, \r3
223     vtrn.16         \r4, \r6
224     vtrn.16         \r5, \r7
225     vtrn.8          \r0, \r1
226     vtrn.8          \r2, \r3
227     vtrn.8          \r4, \r5
228     vtrn.8          \r6, \r7
229 .endm
230
231 .macro TRANSPOSE4x4 r0 r1 r2 r3
232     vtrn.16         \r0, \r2
233     vtrn.16         \r1, \r3
234     vtrn.8          \r0, \r1
235     vtrn.8          \r2, \r3
236 .endm
237
238 .macro TRANSPOSE4x4_16  d0 d1 d2 d3
239     vtrn.32     \d0, \d2
240     vtrn.32     \d1, \d3
241     vtrn.16     \d0, \d1
242     vtrn.16     \d2, \d3
243 .endm