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