]> git.sesse.net Git - x264/blob - common/arm/asm.S
f7b9f14124e507e4dc432f73d0d8e7485aa230b5
[x264] / common / arm / asm.S
1 /*
2  * Copyright (c) 2008 Mans Rullgard <mans@mansr.com>
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg 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  * FFmpeg 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 FFmpeg; 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         .macro require8, val=1
24         .eabi_attribute 24, \val
25         .endm
26
27         .macro preserve8, val=1
28         .eabi_attribute 25, \val
29         .endm
30
31         .macro function name, export=0
32 .if \export
33         .global \name
34 .endif
35         .type   \name, %function
36         .func   \name
37 \name:
38         .endm
39
40         .macro movrel rd, val
41 #if defined(HAVE_ARMV6T2) && !defined(PIC)
42         movw            \rd, #:lower16:\val
43         movt            \rd, #:upper16:\val
44 #else
45         ldr             \rd, =\val
46 #endif
47         .endm
48
49 .macro movconst rd, val
50 #ifdef HAVE_ARMV6T2
51     movw        \rd, #:lower16:\val
52 .if \val >> 16
53     movt        \rd, #:upper16:\val
54 .endif
55 #else
56     ldr         \rd, =\val
57 #endif
58 .endm
59
60 #define FENC_STRIDE 16
61 #define FDEC_STRIDE 32
62
63 .macro HORIZ_ADD dest, a, b
64 .ifnb \b
65     vadd.u16    \a, \a, \b
66 .endif
67     vpaddl.u16  \a, \a
68     vpaddl.u32  \dest, \a
69 .endm
70
71 .macro SUMSUB_AB sum, diff, a, b
72     vadd.s16    \sum,  \a, \b
73     vsub.s16    \diff, \a, \b
74 .endm
75
76 .macro SUMSUB_ABCD s1, d1, s2, d2, a, b, c, d
77     SUMSUB_AB   \s1, \d1, \a, \b
78     SUMSUB_AB   \s2, \d2, \c, \d
79 .endm
80
81 .macro ABS2 a b
82     vabs.s16 \a, \a
83     vabs.s16 \b, \b
84 .endm
85
86 // dist = distance in elements (0 for vertical pass, 1/2 for horizontal passes)
87 // op = sumsub/amax (sum and diff / maximum of absolutes)
88 // d1/2 = destination registers
89 // s1/2 = source registers
90 .macro HADAMARD dist, op, d1, d2, s1, s2
91 .if \dist == 1
92     vtrn.16     \s1, \s2
93 .else
94     vtrn.32     \s1, \s2
95 .endif
96 .ifc \op, sumsub
97     SUMSUB_AB   \d1, \d2, \s1, \s2
98 .else
99     vabs.s16    \s1, \s1
100     vabs.s16    \s2, \s2
101     vmax.s16    \d1, \s1, \s2
102 .endif
103 .endm
104
105 .macro TRANSPOSE8x8 r0 r1 r2 r3 r4 r5 r6 r7
106     vtrn.32         \r0, \r4
107     vtrn.32         \r1, \r5
108     vtrn.32         \r2, \r6
109     vtrn.32         \r3, \r7
110     vtrn.16         \r0, \r2
111     vtrn.16         \r1, \r3
112     vtrn.16         \r4, \r6
113     vtrn.16         \r5, \r7
114     vtrn.8          \r0, \r1
115     vtrn.8          \r2, \r3
116     vtrn.8          \r4, \r5
117     vtrn.8          \r6, \r7
118 .endm
119
120 .macro TRANSPOSE4x4 r0 r1 r2 r3
121     vtrn.16         \r0, \r2
122     vtrn.16         \r1, \r3
123     vtrn.8          \r0, \r1
124     vtrn.8          \r2, \r3
125 .endm
126
127 .macro TRANSPOSE4x4_16  d0 d1 d2 d3
128     vtrn.32     \d0, \d2
129     vtrn.32     \d1, \d3
130     vtrn.16     \d0, \d1
131     vtrn.16     \d2, \d3
132 .endm