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