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