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