Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(129)

Side by Side Diff: simd/jsimd_arm_neon.S

Issue 1934113002: Update libjpeg_turbo to 1.4.90 from https://github.com/libjpeg-turbo/ (Closed) Base URL: https://chromium.googlesource.com/chromium/deps/libjpeg_turbo.git@master
Patch Set: Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * ARMv7 NEON optimizations for libjpeg-turbo 2 * ARMv7 NEON optimizations for libjpeg-turbo
3 * 3 *
4 * Copyright (C) 2009-2011 Nokia Corporation and/or its subsidiary(-ies). 4 * Copyright (C) 2009-2011 Nokia Corporation and/or its subsidiary(-ies).
5 * All rights reserved. 5 * All rights reserved.
6 * Author: Siarhei Siamashka <siarhei.siamashka@nokia.com> 6 * Author: Siarhei Siamashka <siarhei.siamashka@nokia.com>
7 * Copyright (C) 2014 Siarhei Siamashka. All Rights Reserved.
7 * Copyright (C) 2014 Linaro Limited. All Rights Reserved. 8 * Copyright (C) 2014 Linaro Limited. All Rights Reserved.
9 * Copyright (C) 2015 D. R. Commander. All Rights Reserved.
10 * Copyright (C) 2015-2016 Matthieu Darbois. All Rights Reserved.
8 * 11 *
9 * This software is provided 'as-is', without any express or implied 12 * This software is provided 'as-is', without any express or implied
10 * warranty. In no event will the authors be held liable for any damages 13 * warranty. In no event will the authors be held liable for any damages
11 * arising from the use of this software. 14 * arising from the use of this software.
12 * 15 *
13 * Permission is granted to anyone to use this software for any purpose, 16 * Permission is granted to anyone to use this software for any purpose,
14 * including commercial applications, and to alter it and redistribute it 17 * including commercial applications, and to alter it and redistribute it
15 * freely, subject to the following restrictions: 18 * freely, subject to the following restrictions:
16 * 19 *
17 * 1. The origin of this software must not be misrepresented; you must not 20 * 1. The origin of this software must not be misrepresented; you must not
18 * claim that you wrote the original software. If you use this software 21 * claim that you wrote the original software. If you use this software
19 * in a product, an acknowledgment in the product documentation would be 22 * in a product, an acknowledgment in the product documentation would be
20 * appreciated but is not required. 23 * appreciated but is not required.
21 * 2. Altered source versions must be plainly marked as such, and must not be 24 * 2. Altered source versions must be plainly marked as such, and must not be
22 * misrepresented as being the original software. 25 * misrepresented as being the original software.
23 * 3. This notice may not be removed or altered from any source distribution. 26 * 3. This notice may not be removed or altered from any source distribution.
24 */ 27 */
25 28
26 #if defined(__linux__) && defined(__ELF__) 29 #if defined(__linux__) && defined(__ELF__)
27 .section .note.GNU-stack,"",%progbits /* mark stack as non-executable */ 30 .section .note.GNU-stack, "", %progbits /* mark stack as non-executable */
28 #endif 31 #endif
29 32
30 .text 33 .text
31 .fpu neon 34 .fpu neon
32 .arch armv7a 35 .arch armv7a
33 .object_arch armv4 36 .object_arch armv4
34 .arm 37 .arm
35 38
36 39
37 #define RESPECT_STRICT_ALIGNMENT 1 40 #define RESPECT_STRICT_ALIGNMENT 1
(...skipping 11 matching lines...) Expand all
49 #ifdef __ELF__ 52 #ifdef __ELF__
50 .hidden \fname 53 .hidden \fname
51 .type \fname, %function 54 .type \fname, %function
52 #endif 55 #endif
53 \fname: 56 \fname:
54 #endif 57 #endif
55 .endm 58 .endm
56 59
57 /* Transpose a block of 4x4 coefficients in four 64-bit registers */ 60 /* Transpose a block of 4x4 coefficients in four 64-bit registers */
58 .macro transpose_4x4 x0, x1, x2, x3 61 .macro transpose_4x4 x0, x1, x2, x3
59 vtrn.16 \x0, \x1 62 vtrn.16 \x0, \x1
60 vtrn.16 \x2, \x3 63 vtrn.16 \x2, \x3
61 vtrn.32 \x0, \x2 64 vtrn.32 \x0, \x2
62 vtrn.32 \x1, \x3 65 vtrn.32 \x1, \x3
63 .endm 66 .endm
64 67
65 68
66 #define CENTERJSAMPLE 128 69 #define CENTERJSAMPLE 128
67 70
68 /*****************************************************************************/ 71 /*****************************************************************************/
69 72
70 /* 73 /*
71 * Perform dequantization and inverse DCT on one block of coefficients. 74 * Perform dequantization and inverse DCT on one block of coefficients.
72 * 75 *
73 * GLOBAL(void) 76 * GLOBAL(void)
74 * jsimd_idct_islow_neon (void * dct_table, JCOEFPTR coef_block, 77 * jsimd_idct_islow_neon (void *dct_table, JCOEFPTR coef_block,
75 * JSAMPARRAY output_buf, JDIMENSION output_col) 78 * JSAMPARRAY output_buf, JDIMENSION output_col)
76 */ 79 */
77 80
78 #define FIX_0_298631336 (2446) 81 #define FIX_0_298631336 (2446)
79 #define FIX_0_390180644 (3196) 82 #define FIX_0_390180644 (3196)
80 #define FIX_0_541196100 (4433) 83 #define FIX_0_541196100 (4433)
81 #define FIX_0_765366865 (6270) 84 #define FIX_0_765366865 (6270)
82 #define FIX_0_899976223 (7373) 85 #define FIX_0_899976223 (7373)
83 #define FIX_1_175875602 (9633) 86 #define FIX_1_175875602 (9633)
84 #define FIX_1_501321110 (12299) 87 #define FIX_1_501321110 (12299)
85 #define FIX_1_847759065 (15137) 88 #define FIX_1_847759065 (15137)
86 #define FIX_1_961570560 (16069) 89 #define FIX_1_961570560 (16069)
87 #define FIX_2_053119869 (16819) 90 #define FIX_2_053119869 (16819)
88 #define FIX_2_562915447 (20995) 91 #define FIX_2_562915447 (20995)
89 #define FIX_3_072711026 (25172) 92 #define FIX_3_072711026 (25172)
90 93
91 #define FIX_1_175875602_MINUS_1_961570560 (FIX_1_175875602 - FIX_1_961570560) 94 #define FIX_1_175875602_MINUS_1_961570560 (FIX_1_175875602 - FIX_1_961570560)
92 #define FIX_1_175875602_MINUS_0_390180644 (FIX_1_175875602 - FIX_0_390180644) 95 #define FIX_1_175875602_MINUS_0_390180644 (FIX_1_175875602 - FIX_0_390180644)
93 #define FIX_0_541196100_MINUS_1_847759065 (FIX_0_541196100 - FIX_1_847759065) 96 #define FIX_0_541196100_MINUS_1_847759065 (FIX_0_541196100 - FIX_1_847759065)
94 #define FIX_3_072711026_MINUS_2_562915447 (FIX_3_072711026 - FIX_2_562915447) 97 #define FIX_3_072711026_MINUS_2_562915447 (FIX_3_072711026 - FIX_2_562915447)
95 #define FIX_0_298631336_MINUS_0_899976223 (FIX_0_298631336 - FIX_0_899976223) 98 #define FIX_0_298631336_MINUS_0_899976223 (FIX_0_298631336 - FIX_0_899976223)
96 #define FIX_1_501321110_MINUS_0_899976223 (FIX_1_501321110 - FIX_0_899976223) 99 #define FIX_1_501321110_MINUS_0_899976223 (FIX_1_501321110 - FIX_0_899976223)
97 #define FIX_2_053119869_MINUS_2_562915447 (FIX_2_053119869 - FIX_2_562915447) 100 #define FIX_2_053119869_MINUS_2_562915447 (FIX_2_053119869 - FIX_2_562915447)
98 #define FIX_0_541196100_PLUS_0_765366865 (FIX_0_541196100 + FIX_0_765366865) 101 #define FIX_0_541196100_PLUS_0_765366865 (FIX_0_541196100 + FIX_0_765366865)
99 102
100 /* 103 /*
101 * Reference SIMD-friendly 1-D ISLOW iDCT C implementation. 104 * Reference SIMD-friendly 1-D ISLOW iDCT C implementation.
102 * Uses some ideas from the comments in 'simd/jiss2int-64.asm' 105 * Uses some ideas from the comments in 'simd/jiss2int-64.asm'
103 */ 106 */
104 #define REF_1D_IDCT(xrow0, xrow1, xrow2, xrow3, xrow4, xrow5, xrow6, xrow7) \ 107 #define REF_1D_IDCT(xrow0, xrow1, xrow2, xrow3, xrow4, xrow5, xrow6, xrow7) \
105 { \ 108 { \
106 DCTELEM row0, row1, row2, row3, row4, row5, row6, row7; \ 109 DCTELEM row0, row1, row2, row3, row4, row5, row6, row7; \
107 INT32 q1, q2, q3, q4, q5, q6, q7; \ 110 JLONG q1, q2, q3, q4, q5, q6, q7; \
108 INT32 tmp11_plus_tmp2, tmp11_minus_tmp2; \ 111 JLONG tmp11_plus_tmp2, tmp11_minus_tmp2; \
109 \ 112 \
110 /* 1-D iDCT input data */ \ 113 /* 1-D iDCT input data */ \
111 row0 = xrow0; \ 114 row0 = xrow0; \
112 row1 = xrow1; \ 115 row1 = xrow1; \
113 row2 = xrow2; \ 116 row2 = xrow2; \
114 row3 = xrow3; \ 117 row3 = xrow3; \
115 row4 = xrow4; \ 118 row4 = xrow4; \
116 row5 = xrow5; \ 119 row5 = xrow5; \
117 row6 = xrow6; \ 120 row6 = xrow6; \
118 row7 = xrow7; \ 121 row7 = xrow7; \
119 \ 122 \
120 q5 = row7 + row3; \ 123 q5 = row7 + row3; \
121 q4 = row5 + row1; \ 124 q4 = row5 + row1; \
122 q6 = MULTIPLY(q5, FIX_1_175875602_MINUS_1_961570560) + \ 125 q6 = MULTIPLY(q5, FIX_1_175875602_MINUS_1_961570560) + \
123 MULTIPLY(q4, FIX_1_175875602); \ 126 MULTIPLY(q4, FIX_1_175875602); \
124 q7 = MULTIPLY(q5, FIX_1_175875602) + \ 127 q7 = MULTIPLY(q5, FIX_1_175875602) + \
125 MULTIPLY(q4, FIX_1_175875602_MINUS_0_390180644); \ 128 MULTIPLY(q4, FIX_1_175875602_MINUS_0_390180644); \
126 q2 = MULTIPLY(row2, FIX_0_541196100) + \ 129 q2 = MULTIPLY(row2, FIX_0_541196100) + \
127 MULTIPLY(row6, FIX_0_541196100_MINUS_1_847759065); \ 130 MULTIPLY(row6, FIX_0_541196100_MINUS_1_847759065); \
128 q4 = q6; \ 131 q4 = q6; \
129 q3 = ((INT32) row0 - (INT32) row4) << 13; \ 132 q3 = ((JLONG) row0 - (JLONG) row4) << 13; \
130 q6 += MULTIPLY(row5, -FIX_2_562915447) + \ 133 q6 += MULTIPLY(row5, -FIX_2_562915447) + \
131 MULTIPLY(row3, FIX_3_072711026_MINUS_2_562915447); \ 134 MULTIPLY(row3, FIX_3_072711026_MINUS_2_562915447); \
132 /* now we can use q1 (reloadable constants have been used up) */ \ 135 /* now we can use q1 (reloadable constants have been used up) */ \
133 q1 = q3 + q2; \ 136 q1 = q3 + q2; \
134 q4 += MULTIPLY(row7, FIX_0_298631336_MINUS_0_899976223) + \ 137 q4 += MULTIPLY(row7, FIX_0_298631336_MINUS_0_899976223) + \
135 MULTIPLY(row1, -FIX_0_899976223); \ 138 MULTIPLY(row1, -FIX_0_899976223); \
136 q5 = q7; \ 139 q5 = q7; \
137 q1 = q1 + q6; \ 140 q1 = q1 + q6; \
138 q7 += MULTIPLY(row7, -FIX_0_899976223) + \ 141 q7 += MULTIPLY(row7, -FIX_0_899976223) + \
139 MULTIPLY(row1, FIX_1_501321110_MINUS_0_899976223); \ 142 MULTIPLY(row1, FIX_1_501321110_MINUS_0_899976223); \
140 \ 143 \
141 /* (tmp11 + tmp2) has been calculated (out_row1 before descale) */ \ 144 /* (tmp11 + tmp2) has been calculated (out_row1 before descale) */ \
142 tmp11_plus_tmp2 = q1; \ 145 tmp11_plus_tmp2 = q1; \
143 row1 = 0; \ 146 row1 = 0; \
144 \ 147 \
145 q1 = q1 - q6; \ 148 q1 = q1 - q6; \
146 q5 += MULTIPLY(row5, FIX_2_053119869_MINUS_2_562915447) + \ 149 q5 += MULTIPLY(row5, FIX_2_053119869_MINUS_2_562915447) + \
147 MULTIPLY(row3, -FIX_2_562915447); \ 150 MULTIPLY(row3, -FIX_2_562915447); \
148 q1 = q1 - q6; \ 151 q1 = q1 - q6; \
149 q6 = MULTIPLY(row2, FIX_0_541196100_PLUS_0_765366865) + \ 152 q6 = MULTIPLY(row2, FIX_0_541196100_PLUS_0_765366865) + \
150 MULTIPLY(row6, FIX_0_541196100); \ 153 MULTIPLY(row6, FIX_0_541196100); \
151 q3 = q3 - q2; \ 154 q3 = q3 - q2; \
152 \ 155 \
153 /* (tmp11 - tmp2) has been calculated (out_row6 before descale) */ \ 156 /* (tmp11 - tmp2) has been calculated (out_row6 before descale) */ \
154 tmp11_minus_tmp2 = q1; \ 157 tmp11_minus_tmp2 = q1; \
155 \ 158 \
156 q1 = ((INT32) row0 + (INT32) row4) << 13; \ 159 q1 = ((JLONG) row0 + (JLONG) row4) << 13; \
157 q2 = q1 + q6; \ 160 q2 = q1 + q6; \
158 q1 = q1 - q6; \ 161 q1 = q1 - q6; \
159 \ 162 \
160 /* pick up the results */ \ 163 /* pick up the results */ \
161 tmp0 = q4; \ 164 tmp0 = q4; \
162 tmp1 = q5; \ 165 tmp1 = q5; \
163 tmp2 = (tmp11_plus_tmp2 - tmp11_minus_tmp2) / 2; \ 166 tmp2 = (tmp11_plus_tmp2 - tmp11_minus_tmp2) / 2; \
164 tmp3 = q7; \ 167 tmp3 = q7; \
165 tmp10 = q2; \ 168 tmp10 = q2; \
166 tmp11 = (tmp11_plus_tmp2 + tmp11_minus_tmp2) / 2; \ 169 tmp11 = (tmp11_plus_tmp2 + tmp11_minus_tmp2) / 2; \
167 tmp12 = q3; \ 170 tmp12 = q3; \
168 tmp13 = q1; \ 171 tmp13 = q1; \
169 } 172 }
170 173
171 #define XFIX_0_899976223 d0[0] 174 #define XFIX_0_899976223 d0[0]
172 #define XFIX_0_541196100 d0[1] 175 #define XFIX_0_541196100 d0[1]
173 #define XFIX_2_562915447 d0[2] 176 #define XFIX_2_562915447 d0[2]
174 #define XFIX_0_298631336_MINUS_0_899976223 d0[3] 177 #define XFIX_0_298631336_MINUS_0_899976223 d0[3]
175 #define XFIX_1_501321110_MINUS_0_899976223 d1[0] 178 #define XFIX_1_501321110_MINUS_0_899976223 d1[0]
176 #define XFIX_2_053119869_MINUS_2_562915447 d1[1] 179 #define XFIX_2_053119869_MINUS_2_562915447 d1[1]
177 #define XFIX_0_541196100_PLUS_0_765366865 d1[2] 180 #define XFIX_0_541196100_PLUS_0_765366865 d1[2]
178 #define XFIX_1_175875602 d1[3] 181 #define XFIX_1_175875602 d1[3]
179 #define XFIX_1_175875602_MINUS_0_390180644 d2[0] 182 #define XFIX_1_175875602_MINUS_0_390180644 d2[0]
180 #define XFIX_0_541196100_MINUS_1_847759065 d2[1] 183 #define XFIX_0_541196100_MINUS_1_847759065 d2[1]
181 #define XFIX_3_072711026_MINUS_2_562915447 d2[2] 184 #define XFIX_3_072711026_MINUS_2_562915447 d2[2]
182 #define XFIX_1_175875602_MINUS_1_961570560 d2[3] 185 #define XFIX_1_175875602_MINUS_1_961570560 d2[3]
183 186
184 .balign 16 187 .balign 16
185 jsimd_idct_islow_neon_consts: 188 jsimd_idct_islow_neon_consts:
186 .short FIX_0_899976223 /* d0[0] */ 189 .short FIX_0_899976223 /* d0[0] */
187 .short FIX_0_541196100 /* d0[1] */ 190 .short FIX_0_541196100 /* d0[1] */
188 .short FIX_2_562915447 /* d0[2] */ 191 .short FIX_2_562915447 /* d0[2] */
189 .short FIX_0_298631336_MINUS_0_899976223 /* d0[3] */ 192 .short FIX_0_298631336_MINUS_0_899976223 /* d0[3] */
190 .short FIX_1_501321110_MINUS_0_899976223 /* d1[0] */ 193 .short FIX_1_501321110_MINUS_0_899976223 /* d1[0] */
191 .short FIX_2_053119869_MINUS_2_562915447 /* d1[1] */ 194 .short FIX_2_053119869_MINUS_2_562915447 /* d1[1] */
192 .short FIX_0_541196100_PLUS_0_765366865 /* d1[2] */ 195 .short FIX_0_541196100_PLUS_0_765366865 /* d1[2] */
193 .short FIX_1_175875602 /* d1[3] */ 196 .short FIX_1_175875602 /* d1[3] */
194 /* reloadable constants */ 197 /* reloadable constants */
195 .short FIX_1_175875602_MINUS_0_390180644 /* d2[0] */ 198 .short FIX_1_175875602_MINUS_0_390180644 /* d2[0] */
196 .short FIX_0_541196100_MINUS_1_847759065 /* d2[1] */ 199 .short FIX_0_541196100_MINUS_1_847759065 /* d2[1] */
197 .short FIX_3_072711026_MINUS_2_562915447 /* d2[2] */ 200 .short FIX_3_072711026_MINUS_2_562915447 /* d2[2] */
198 .short FIX_1_175875602_MINUS_1_961570560 /* d2[3] */ 201 .short FIX_1_175875602_MINUS_1_961570560 /* d2[3] */
199 202
200 asm_function jsimd_idct_islow_neon 203 asm_function jsimd_idct_islow_neon
201 204
202 DCT_TABLE .req r0 205 DCT_TABLE .req r0
203 COEF_BLOCK .req r1 206 COEF_BLOCK .req r1
204 OUTPUT_BUF .req r2 207 OUTPUT_BUF .req r2
205 OUTPUT_COL .req r3 208 OUTPUT_COL .req r3
206 TMP1 .req r0 209 TMP1 .req r0
207 TMP2 .req r1 210 TMP2 .req r1
208 TMP3 .req r2 211 TMP3 .req r2
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
247 vmul.s16 q9, q9, q1 250 vmul.s16 q9, q9, q1
248 vld1.16 {d24, d25, d26, d27}, [COEF_BLOCK, :128]! 251 vld1.16 {d24, d25, d26, d27}, [COEF_BLOCK, :128]!
249 vmul.s16 q10, q10, q2 252 vmul.s16 q10, q10, q2
250 vld1.16 {d0, d1, d2, d3}, [DCT_TABLE, :128]! 253 vld1.16 {d0, d1, d2, d3}, [DCT_TABLE, :128]!
251 vmul.s16 q11, q11, q3 254 vmul.s16 q11, q11, q3
252 vld1.16 {d28, d29, d30, d31}, [COEF_BLOCK, :128] 255 vld1.16 {d28, d29, d30, d31}, [COEF_BLOCK, :128]
253 vmul.s16 q12, q12, q0 256 vmul.s16 q12, q12, q0
254 vld1.16 {d4, d5, d6, d7}, [DCT_TABLE, :128]! 257 vld1.16 {d4, d5, d6, d7}, [DCT_TABLE, :128]!
255 vmul.s16 q14, q14, q2 258 vmul.s16 q14, q14, q2
256 vmul.s16 q13, q13, q1 259 vmul.s16 q13, q13, q1
257 vld1.16 {d0, d1, d2, d3}, [ip, :128] /* load constants */ 260 vld1.16 {d0, d1, d2, d3}, [ip, :128] /* load constants */
258 add ip, ip, #16 261 add ip, ip, #16
259 vmul.s16 q15, q15, q3 262 vmul.s16 q15, q15, q3
260 vpush {d8-d15} /* save NEON registers */ 263 vpush {d8-d15} /* save NEON registers */
261 /* 1-D IDCT, pass 1, left 4x8 half */ 264 /* 1-D IDCT, pass 1, left 4x8 half */
262 vadd.s16 d4, ROW7L, ROW3L 265 vadd.s16 d4, ROW7L, ROW3L
263 vadd.s16 d5, ROW5L, ROW1L 266 vadd.s16 d5, ROW5L, ROW1L
264 vmull.s16 q6, d4, XFIX_1_175875602_MINUS_1_961570560 267 vmull.s16 q6, d4, XFIX_1_175875602_MINUS_1_961570560
265 vmlal.s16 q6, d5, XFIX_1_175875602 268 vmlal.s16 q6, d5, XFIX_1_175875602
266 vmull.s16 q7, d4, XFIX_1_175875602 269 vmull.s16 q7, d4, XFIX_1_175875602
267 /* Check for the zero coefficients in the right 4x8 half */ 270 /* Check for the zero coefficients in the right 4x8 half */
268 push {r4, r5} 271 push {r4, r5}
269 vmlal.s16 q7, d5, XFIX_1_175875602_MINUS_0_390180644 272 vmlal.s16 q7, d5, XFIX_1_175875602_MINUS_0_390180644
270 vsubl.s16 q3, ROW0L, ROW4L 273 vsubl.s16 q3, ROW0L, ROW4L
271 ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 1 * 8))] 274 ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 1 * 8))]
272 vmull.s16 q2, ROW2L, XFIX_0_541196100 275 vmull.s16 q2, ROW2L, XFIX_0_541196100
273 vmlal.s16 q2, ROW6L, XFIX_0_541196100_MINUS_1_847759065 276 vmlal.s16 q2, ROW6L, XFIX_0_541196100_MINUS_1_847759065
274 orr r0, r4, r5 277 orr r0, r4, r5
275 vmov q4, q6 278 vmov q4, q6
276 vmlsl.s16 q6, ROW5L, XFIX_2_562915447 279 vmlsl.s16 q6, ROW5L, XFIX_2_562915447
277 ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 2 * 8))] 280 ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 2 * 8))]
278 vmlal.s16 q6, ROW3L, XFIX_3_072711026_MINUS_2_562915447 281 vmlal.s16 q6, ROW3L, XFIX_3_072711026_MINUS_2_562915447
279 vshl.s32 q3, q3, #13 282 vshl.s32 q3, q3, #13
280 orr r0, r0, r4 283 orr r0, r0, r4
281 vmlsl.s16 q4, ROW1L, XFIX_0_899976223 284 vmlsl.s16 q4, ROW1L, XFIX_0_899976223
282 orr r0, r0, r5 285 orr r0, r0, r5
283 vadd.s32 q1, q3, q2 286 vadd.s32 q1, q3, q2
284 ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 3 * 8))] 287 ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 3 * 8))]
285 vmov q5, q7 288 vmov q5, q7
286 vadd.s32 q1, q1, q6 289 vadd.s32 q1, q1, q6
287 orr r0, r0, r4 290 orr r0, r0, r4
288 vmlsl.s16 q7, ROW7L, XFIX_0_899976223 291 vmlsl.s16 q7, ROW7L, XFIX_0_899976223
289 orr r0, r0, r5 292 orr r0, r0, r5
290 vmlal.s16 q7, ROW1L, XFIX_1_501321110_MINUS_0_899976223 293 vmlal.s16 q7, ROW1L, XFIX_1_501321110_MINUS_0_899976223
291 vrshrn.s32 ROW1L, q1, #11 294 vrshrn.s32 ROW1L, q1, #11
292 ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 4 * 8))] 295 ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 4 * 8))]
293 vsub.s32 q1, q1, q6 296 vsub.s32 q1, q1, q6
294 vmlal.s16 q5, ROW5L, XFIX_2_053119869_MINUS_2_562915447 297 vmlal.s16 q5, ROW5L, XFIX_2_053119869_MINUS_2_562915447
295 orr r0, r0, r4 298 orr r0, r0, r4
296 vmlsl.s16 q5, ROW3L, XFIX_2_562915447 299 vmlsl.s16 q5, ROW3L, XFIX_2_562915447
297 orr r0, r0, r5 300 orr r0, r0, r5
298 vsub.s32 q1, q1, q6 301 vsub.s32 q1, q1, q6
299 vmull.s16 q6, ROW2L, XFIX_0_541196100_PLUS_0_765366865 302 vmull.s16 q6, ROW2L, XFIX_0_541196100_PLUS_0_765366865
300 ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 5 * 8))] 303 ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 5 * 8))]
301 vmlal.s16 q6, ROW6L, XFIX_0_541196100 304 vmlal.s16 q6, ROW6L, XFIX_0_541196100
302 vsub.s32 q3, q3, q2 305 vsub.s32 q3, q3, q2
303 orr r0, r0, r4 306 orr r0, r0, r4
304 vrshrn.s32 ROW6L, q1, #11 307 vrshrn.s32 ROW6L, q1, #11
305 orr r0, r0, r5 308 orr r0, r0, r5
306 vadd.s32 q1, q3, q5 309 vadd.s32 q1, q3, q5
307 ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 6 * 8))] 310 ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 6 * 8))]
308 vsub.s32 q3, q3, q5 311 vsub.s32 q3, q3, q5
309 vaddl.s16 q5, ROW0L, ROW4L 312 vaddl.s16 q5, ROW0L, ROW4L
310 orr r0, r0, r4 313 orr r0, r0, r4
311 vrshrn.s32 ROW2L, q1, #11 314 vrshrn.s32 ROW2L, q1, #11
312 orr r0, r0, r5 315 orr r0, r0, r5
313 vrshrn.s32 ROW5L, q3, #11 316 vrshrn.s32 ROW5L, q3, #11
314 ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 7 * 8))] 317 ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 7 * 8))]
315 vshl.s32 q5, q5, #13 318 vshl.s32 q5, q5, #13
316 vmlal.s16 q4, ROW7L, XFIX_0_298631336_MINUS_0_899976223 319 vmlal.s16 q4, ROW7L, XFIX_0_298631336_MINUS_0_899976223
317 orr r0, r0, r4 320 orr r0, r0, r4
318 vadd.s32 q2, q5, q6 321 vadd.s32 q2, q5, q6
319 orrs r0, r0, r5 322 orrs r0, r0, r5
320 vsub.s32 q1, q5, q6 323 vsub.s32 q1, q5, q6
321 vadd.s32 q6, q2, q7 324 vadd.s32 q6, q2, q7
322 ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 0 * 8))] 325 ldrd r4, [COEF_BLOCK, #(-96 + 2 * (4 + 0 * 8))]
323 vsub.s32 q2, q2, q7 326 vsub.s32 q2, q2, q7
324 vadd.s32 q5, q1, q4 327 vadd.s32 q5, q1, q4
325 orr r0, r4, r5 328 orr r0, r4, r5
326 vsub.s32 q3, q1, q4 329 vsub.s32 q3, q1, q4
327 pop {r4, r5} 330 pop {r4, r5}
328 vrshrn.s32 ROW7L, q2, #11 331 vrshrn.s32 ROW7L, q2, #11
329 vrshrn.s32 ROW3L, q5, #11 332 vrshrn.s32 ROW3L, q5, #11
330 vrshrn.s32 ROW0L, q6, #11 333 vrshrn.s32 ROW0L, q6, #11
331 vrshrn.s32 ROW4L, q3, #11 334 vrshrn.s32 ROW4L, q3, #11
332 335
333 beq 3f /* Go to do some special handling for the sparse right 4x8 half */ 336 beq 3f /* Go to do some special handling for the sparse
337 right 4x8 half */
334 338
335 /* 1-D IDCT, pass 1, right 4x8 half */ 339 /* 1-D IDCT, pass 1, right 4x8 half */
336 vld1.s16 {d2}, [ip, :64] /* reload constants */ 340 vld1.s16 {d2}, [ip, :64] /* reload constants */
337 vadd.s16 d10, ROW7R, ROW3R 341 vadd.s16 d10, ROW7R, ROW3R
338 vadd.s16 d8, ROW5R, ROW1R 342 vadd.s16 d8, ROW5R, ROW1R
339 /* Transpose left 4x8 half */ 343 /* Transpose left 4x8 half */
340 vtrn.16 ROW6L, ROW7L 344 vtrn.16 ROW6L, ROW7L
341 vmull.s16 q6, d10, XFIX_1_175875602_MINUS_1_961570560 345 vmull.s16 q6, d10, XFIX_1_175875602_MINUS_1_961570560
342 vmlal.s16 q6, d8, XFIX_1_175875602 346 vmlal.s16 q6, d8, XFIX_1_175875602
343 vtrn.16 ROW2L, ROW3L 347 vtrn.16 ROW2L, ROW3L
344 vmull.s16 q7, d10, XFIX_1_175875602 348 vmull.s16 q7, d10, XFIX_1_175875602
345 vmlal.s16 q7, d8, XFIX_1_175875602_MINUS_0_390180644 349 vmlal.s16 q7, d8, XFIX_1_175875602_MINUS_0_390180644
346 vtrn.16 ROW0L, ROW1L 350 vtrn.16 ROW0L, ROW1L
347 vsubl.s16 q3, ROW0R, ROW4R 351 vsubl.s16 q3, ROW0R, ROW4R
348 vmull.s16 q2, ROW2R, XFIX_0_541196100 352 vmull.s16 q2, ROW2R, XFIX_0_541196100
349 vmlal.s16 q2, ROW6R, XFIX_0_541196100_MINUS_1_847759065 353 vmlal.s16 q2, ROW6R, XFIX_0_541196100_MINUS_1_847759065
350 vtrn.16 ROW4L, ROW5L 354 vtrn.16 ROW4L, ROW5L
351 vmov q4, q6 355 vmov q4, q6
352 vmlsl.s16 q6, ROW5R, XFIX_2_562915447 356 vmlsl.s16 q6, ROW5R, XFIX_2_562915447
353 vmlal.s16 q6, ROW3R, XFIX_3_072711026_MINUS_2_562915447 357 vmlal.s16 q6, ROW3R, XFIX_3_072711026_MINUS_2_562915447
354 vtrn.32 ROW1L, ROW3L 358 vtrn.32 ROW1L, ROW3L
355 vshl.s32 q3, q3, #13 359 vshl.s32 q3, q3, #13
356 vmlsl.s16 q4, ROW1R, XFIX_0_899976223 360 vmlsl.s16 q4, ROW1R, XFIX_0_899976223
357 vtrn.32 ROW4L, ROW6L 361 vtrn.32 ROW4L, ROW6L
358 vadd.s32 q1, q3, q2 362 vadd.s32 q1, q3, q2
359 vmov q5, q7 363 vmov q5, q7
360 vadd.s32 q1, q1, q6 364 vadd.s32 q1, q1, q6
361 vtrn.32 ROW0L, ROW2L 365 vtrn.32 ROW0L, ROW2L
362 vmlsl.s16 q7, ROW7R, XFIX_0_899976223 366 vmlsl.s16 q7, ROW7R, XFIX_0_899976223
363 vmlal.s16 q7, ROW1R, XFIX_1_501321110_MINUS_0_899976223 367 vmlal.s16 q7, ROW1R, XFIX_1_501321110_MINUS_0_899976223
364 vrshrn.s32 ROW1R, q1, #11 368 vrshrn.s32 ROW1R, q1, #11
365 vtrn.32 ROW5L, ROW7L 369 vtrn.32 ROW5L, ROW7L
366 vsub.s32 q1, q1, q6 370 vsub.s32 q1, q1, q6
367 vmlal.s16 q5, ROW5R, XFIX_2_053119869_MINUS_2_562915447 371 vmlal.s16 q5, ROW5R, XFIX_2_053119869_MINUS_2_562915447
368 vmlsl.s16 q5, ROW3R, XFIX_2_562915447 372 vmlsl.s16 q5, ROW3R, XFIX_2_562915447
369 vsub.s32 q1, q1, q6 373 vsub.s32 q1, q1, q6
370 vmull.s16 q6, ROW2R, XFIX_0_541196100_PLUS_0_765366865 374 vmull.s16 q6, ROW2R, XFIX_0_541196100_PLUS_0_765366865
371 vmlal.s16 q6, ROW6R, XFIX_0_541196100 375 vmlal.s16 q6, ROW6R, XFIX_0_541196100
372 vsub.s32 q3, q3, q2 376 vsub.s32 q3, q3, q2
373 vrshrn.s32 ROW6R, q1, #11 377 vrshrn.s32 ROW6R, q1, #11
374 vadd.s32 q1, q3, q5 378 vadd.s32 q1, q3, q5
375 vsub.s32 q3, q3, q5 379 vsub.s32 q3, q3, q5
376 vaddl.s16 q5, ROW0R, ROW4R 380 vaddl.s16 q5, ROW0R, ROW4R
377 vrshrn.s32 ROW2R, q1, #11 381 vrshrn.s32 ROW2R, q1, #11
378 vrshrn.s32 ROW5R, q3, #11 382 vrshrn.s32 ROW5R, q3, #11
379 vshl.s32 q5, q5, #13 383 vshl.s32 q5, q5, #13
380 vmlal.s16 q4, ROW7R, XFIX_0_298631336_MINUS_0_899976223 384 vmlal.s16 q4, ROW7R, XFIX_0_298631336_MINUS_0_899976223
381 vadd.s32 q2, q5, q6 385 vadd.s32 q2, q5, q6
382 vsub.s32 q1, q5, q6 386 vsub.s32 q1, q5, q6
383 vadd.s32 q6, q2, q7 387 vadd.s32 q6, q2, q7
384 vsub.s32 q2, q2, q7 388 vsub.s32 q2, q2, q7
385 vadd.s32 q5, q1, q4 389 vadd.s32 q5, q1, q4
386 vsub.s32 q3, q1, q4 390 vsub.s32 q3, q1, q4
387 vrshrn.s32 ROW7R, q2, #11 391 vrshrn.s32 ROW7R, q2, #11
388 vrshrn.s32 ROW3R, q5, #11 392 vrshrn.s32 ROW3R, q5, #11
389 vrshrn.s32 ROW0R, q6, #11 393 vrshrn.s32 ROW0R, q6, #11
390 vrshrn.s32 ROW4R, q3, #11 394 vrshrn.s32 ROW4R, q3, #11
391 /* Transpose right 4x8 half */ 395 /* Transpose right 4x8 half */
392 vtrn.16 ROW6R, ROW7R 396 vtrn.16 ROW6R, ROW7R
393 vtrn.16 ROW2R, ROW3R 397 vtrn.16 ROW2R, ROW3R
394 vtrn.16 ROW0R, ROW1R 398 vtrn.16 ROW0R, ROW1R
395 vtrn.16 ROW4R, ROW5R 399 vtrn.16 ROW4R, ROW5R
396 vtrn.32 ROW1R, ROW3R 400 vtrn.32 ROW1R, ROW3R
397 vtrn.32 ROW4R, ROW6R 401 vtrn.32 ROW4R, ROW6R
398 vtrn.32 ROW0R, ROW2R 402 vtrn.32 ROW0R, ROW2R
399 vtrn.32 ROW5R, ROW7R 403 vtrn.32 ROW5R, ROW7R
400 404
401 1: /* 1-D IDCT, pass 2 (normal variant), left 4x8 half */ 405 1: /* 1-D IDCT, pass 2 (normal variant), left 4x8 half */
402 vld1.s16 {d2}, [ip, :64] /* reload constants */ 406 vld1.s16 {d2}, [ip, :64] /* reload constants */
403 vmull.s16 q6, ROW1R, XFIX_1_175875602 /* ROW5L <-> ROW1R */ 407 vmull.s16 q6, ROW1R, XFIX_1_175875602 /* ROW5L <-> ROW1R */
404 vmlal.s16 q6, ROW1L, XFIX_1_175875602 408 vmlal.s16 q6, ROW1L, XFIX_1_175875602
405 vmlal.s16 q6, ROW3R, XFIX_1_175875602_MINUS_1_961570560 /* ROW7L <- > ROW3R */ 409 vmlal.s16 q6, ROW3R, XFIX_1_175875602_MINUS_1_961570560 /* ROW7L <-> ROW3R */
406 vmlal.s16 q6, ROW3L, XFIX_1_175875602_MINUS_1_961570560 410 vmlal.s16 q6, ROW3L, XFIX_1_175875602_MINUS_1_961570560
407 vmull.s16 q7, ROW3R, XFIX_1_175875602 /* ROW7L <-> ROW3R */ 411 vmull.s16 q7, ROW3R, XFIX_1_175875602 /* ROW7L <-> ROW3R */
408 vmlal.s16 q7, ROW3L, XFIX_1_175875602 412 vmlal.s16 q7, ROW3L, XFIX_1_175875602
409 vmlal.s16 q7, ROW1R, XFIX_1_175875602_MINUS_0_390180644 /* ROW5L <- > ROW1R */ 413 vmlal.s16 q7, ROW1R, XFIX_1_175875602_MINUS_0_390180644 /* ROW5L <-> ROW1R */
410 vmlal.s16 q7, ROW1L, XFIX_1_175875602_MINUS_0_390180644 414 vmlal.s16 q7, ROW1L, XFIX_1_175875602_MINUS_0_390180644
411 vsubl.s16 q3, ROW0L, ROW0R /* ROW4L <-> ROW0R */ 415 vsubl.s16 q3, ROW0L, ROW0R /* ROW4L <-> ROW0R */
412 vmull.s16 q2, ROW2L, XFIX_0_541196100 416 vmull.s16 q2, ROW2L, XFIX_0_541196100
413 vmlal.s16 q2, ROW2R, XFIX_0_541196100_MINUS_1_847759065 /* ROW6L <- > ROW2R */ 417 vmlal.s16 q2, ROW2R, XFIX_0_541196100_MINUS_1_847759065 /* ROW6L <-> ROW2R */
414 vmov q4, q6 418 vmov q4, q6
415 vmlsl.s16 q6, ROW1R, XFIX_2_562915447 /* ROW5L <-> ROW1R */ 419 vmlsl.s16 q6, ROW1R, XFIX_2_562915447 /* ROW5L <-> ROW1R */
416 vmlal.s16 q6, ROW3L, XFIX_3_072711026_MINUS_2_562915447 420 vmlal.s16 q6, ROW3L, XFIX_3_072711026_MINUS_2_562915447
417 vshl.s32 q3, q3, #13 421 vshl.s32 q3, q3, #13
418 vmlsl.s16 q4, ROW1L, XFIX_0_899976223 422 vmlsl.s16 q4, ROW1L, XFIX_0_899976223
419 vadd.s32 q1, q3, q2 423 vadd.s32 q1, q3, q2
420 vmov q5, q7 424 vmov q5, q7
421 vadd.s32 q1, q1, q6 425 vadd.s32 q1, q1, q6
422 vmlsl.s16 q7, ROW3R, XFIX_0_899976223 /* ROW7L <-> ROW3R */ 426 vmlsl.s16 q7, ROW3R, XFIX_0_899976223 /* ROW7L <-> ROW3R */
423 vmlal.s16 q7, ROW1L, XFIX_1_501321110_MINUS_0_899976223 427 vmlal.s16 q7, ROW1L, XFIX_1_501321110_MINUS_0_899976223
424 vshrn.s32 ROW1L, q1, #16 428 vshrn.s32 ROW1L, q1, #16
425 vsub.s32 q1, q1, q6 429 vsub.s32 q1, q1, q6
426 vmlal.s16 q5, ROW1R, XFIX_2_053119869_MINUS_2_562915447 /* ROW5L <- > ROW1R */ 430 vmlal.s16 q5, ROW1R, XFIX_2_053119869_MINUS_2_562915447 /* ROW5L <-> ROW1R */
427 vmlsl.s16 q5, ROW3L, XFIX_2_562915447 431 vmlsl.s16 q5, ROW3L, XFIX_2_562915447
428 vsub.s32 q1, q1, q6 432 vsub.s32 q1, q1, q6
429 vmull.s16 q6, ROW2L, XFIX_0_541196100_PLUS_0_765366865 433 vmull.s16 q6, ROW2L, XFIX_0_541196100_PLUS_0_765366865
430 vmlal.s16 q6, ROW2R, XFIX_0_541196100 /* ROW6L <-> ROW2R */ 434 vmlal.s16 q6, ROW2R, XFIX_0_541196100 /* ROW6L <-> ROW2R */
431 vsub.s32 q3, q3, q2 435 vsub.s32 q3, q3, q2
432 vshrn.s32 ROW2R, q1, #16 /* ROW6L <-> ROW2R */ 436 vshrn.s32 ROW2R, q1, #16 /* ROW6L <-> ROW2R */
433 vadd.s32 q1, q3, q5 437 vadd.s32 q1, q3, q5
434 vsub.s32 q3, q3, q5 438 vsub.s32 q3, q3, q5
435 vaddl.s16 q5, ROW0L, ROW0R /* ROW4L <-> ROW0R */ 439 vaddl.s16 q5, ROW0L, ROW0R /* ROW4L <-> ROW0R */
436 vshrn.s32 ROW2L, q1, #16 440 vshrn.s32 ROW2L, q1, #16
437 vshrn.s32 ROW1R, q3, #16 /* ROW5L <-> ROW1R */ 441 vshrn.s32 ROW1R, q3, #16 /* ROW5L <-> ROW1R */
438 vshl.s32 q5, q5, #13 442 vshl.s32 q5, q5, #13
439 vmlal.s16 q4, ROW3R, XFIX_0_298631336_MINUS_0_899976223 /* ROW7L <- > ROW3R */ 443 vmlal.s16 q4, ROW3R, XFIX_0_298631336_MINUS_0_899976223 /* ROW7L <-> ROW3R */
440 vadd.s32 q2, q5, q6 444 vadd.s32 q2, q5, q6
441 vsub.s32 q1, q5, q6 445 vsub.s32 q1, q5, q6
442 vadd.s32 q6, q2, q7 446 vadd.s32 q6, q2, q7
443 vsub.s32 q2, q2, q7 447 vsub.s32 q2, q2, q7
444 vadd.s32 q5, q1, q4 448 vadd.s32 q5, q1, q4
445 vsub.s32 q3, q1, q4 449 vsub.s32 q3, q1, q4
446 vshrn.s32 ROW3R, q2, #16 /* ROW7L <-> ROW3R */ 450 vshrn.s32 ROW3R, q2, #16 /* ROW7L <-> ROW3R */
447 vshrn.s32 ROW3L, q5, #16 451 vshrn.s32 ROW3L, q5, #16
448 vshrn.s32 ROW0L, q6, #16 452 vshrn.s32 ROW0L, q6, #16
449 vshrn.s32 ROW0R, q3, #16 /* ROW4L <-> ROW0R */ 453 vshrn.s32 ROW0R, q3, #16 /* ROW4L <-> ROW0R */
450 /* 1-D IDCT, pass 2, right 4x8 half */ 454 /* 1-D IDCT, pass 2, right 4x8 half */
451 vld1.s16 {d2}, [ip, :64] /* reload constants */ 455 vld1.s16 {d2}, [ip, :64] /* reload constants */
452 vmull.s16 q6, ROW5R, XFIX_1_175875602 456 vmull.s16 q6, ROW5R, XFIX_1_175875602
453 vmlal.s16 q6, ROW5L, XFIX_1_175875602 /* ROW5L <-> ROW1R */ 457 vmlal.s16 q6, ROW5L, XFIX_1_175875602 /* ROW5L <-> ROW1R */
454 vmlal.s16 q6, ROW7R, XFIX_1_175875602_MINUS_1_961570560 458 vmlal.s16 q6, ROW7R, XFIX_1_175875602_MINUS_1_961570560
455 vmlal.s16 q6, ROW7L, XFIX_1_175875602_MINUS_1_961570560 /* ROW7L <- > ROW3R */ 459 vmlal.s16 q6, ROW7L, XFIX_1_175875602_MINUS_1_961570560 /* ROW7L <-> ROW3R */
456 vmull.s16 q7, ROW7R, XFIX_1_175875602 460 vmull.s16 q7, ROW7R, XFIX_1_175875602
457 vmlal.s16 q7, ROW7L, XFIX_1_175875602 /* ROW7L <-> ROW3R */ 461 vmlal.s16 q7, ROW7L, XFIX_1_175875602 /* ROW7L <-> ROW3R */
458 vmlal.s16 q7, ROW5R, XFIX_1_175875602_MINUS_0_390180644 462 vmlal.s16 q7, ROW5R, XFIX_1_175875602_MINUS_0_390180644
459 vmlal.s16 q7, ROW5L, XFIX_1_175875602_MINUS_0_390180644 /* ROW5L <- > ROW1R */ 463 vmlal.s16 q7, ROW5L, XFIX_1_175875602_MINUS_0_390180644 /* ROW5L <-> ROW1R */
460 vsubl.s16 q3, ROW4L, ROW4R /* ROW4L <-> ROW0R */ 464 vsubl.s16 q3, ROW4L, ROW4R /* ROW4L <-> ROW0R */
461 vmull.s16 q2, ROW6L, XFIX_0_541196100 /* ROW6L <-> ROW2R */ 465 vmull.s16 q2, ROW6L, XFIX_0_541196100 /* ROW6L <-> ROW2R */
462 vmlal.s16 q2, ROW6R, XFIX_0_541196100_MINUS_1_847759065 466 vmlal.s16 q2, ROW6R, XFIX_0_541196100_MINUS_1_847759065
463 vmov q4, q6 467 vmov q4, q6
464 vmlsl.s16 q6, ROW5R, XFIX_2_562915447 468 vmlsl.s16 q6, ROW5R, XFIX_2_562915447
465 vmlal.s16 q6, ROW7L, XFIX_3_072711026_MINUS_2_562915447 /* ROW7L <- > ROW3R */ 469 vmlal.s16 q6, ROW7L, XFIX_3_072711026_MINUS_2_562915447 /* ROW7L <-> ROW3R */
466 vshl.s32 q3, q3, #13 470 vshl.s32 q3, q3, #13
467 vmlsl.s16 q4, ROW5L, XFIX_0_899976223 /* ROW5L <-> ROW1R */ 471 vmlsl.s16 q4, ROW5L, XFIX_0_899976223 /* ROW5L <-> ROW1R */
468 vadd.s32 q1, q3, q2 472 vadd.s32 q1, q3, q2
469 vmov q5, q7 473 vmov q5, q7
470 vadd.s32 q1, q1, q6 474 vadd.s32 q1, q1, q6
471 vmlsl.s16 q7, ROW7R, XFIX_0_899976223 475 vmlsl.s16 q7, ROW7R, XFIX_0_899976223
472 vmlal.s16 q7, ROW5L, XFIX_1_501321110_MINUS_0_899976223 /* ROW5L <- > ROW1R */ 476 vmlal.s16 q7, ROW5L, XFIX_1_501321110_MINUS_0_899976223 /* ROW5L <-> ROW1R */
473 vshrn.s32 ROW5L, q1, #16 /* ROW5L <-> ROW1R */ 477 vshrn.s32 ROW5L, q1, #16 /* ROW5L <-> ROW1R */
474 vsub.s32 q1, q1, q6 478 vsub.s32 q1, q1, q6
475 vmlal.s16 q5, ROW5R, XFIX_2_053119869_MINUS_2_562915447 479 vmlal.s16 q5, ROW5R, XFIX_2_053119869_MINUS_2_562915447
476 vmlsl.s16 q5, ROW7L, XFIX_2_562915447 /* ROW7L <-> ROW3R */ 480 vmlsl.s16 q5, ROW7L, XFIX_2_562915447 /* ROW7L <-> ROW3R */
477 vsub.s32 q1, q1, q6 481 vsub.s32 q1, q1, q6
478 vmull.s16 q6, ROW6L, XFIX_0_541196100_PLUS_0_765366865 /* ROW6L <-> ROW2R */ 482 vmull.s16 q6, ROW6L, XFIX_0_541196100_PLUS_0_765366865 /* ROW6L <-> R OW2R */
479 vmlal.s16 q6, ROW6R, XFIX_0_541196100 483 vmlal.s16 q6, ROW6R, XFIX_0_541196100
480 vsub.s32 q3, q3, q2 484 vsub.s32 q3, q3, q2
481 vshrn.s32 ROW6R, q1, #16 485 vshrn.s32 ROW6R, q1, #16
482 vadd.s32 q1, q3, q5 486 vadd.s32 q1, q3, q5
483 vsub.s32 q3, q3, q5 487 vsub.s32 q3, q3, q5
484 vaddl.s16 q5, ROW4L, ROW4R /* ROW4L <-> ROW0R */ 488 vaddl.s16 q5, ROW4L, ROW4R /* ROW4L <-> ROW0R */
485 vshrn.s32 ROW6L, q1, #16 /* ROW6L <-> ROW2R */ 489 vshrn.s32 ROW6L, q1, #16 /* ROW6L <-> ROW2R */
486 vshrn.s32 ROW5R, q3, #16 490 vshrn.s32 ROW5R, q3, #16
487 vshl.s32 q5, q5, #13 491 vshl.s32 q5, q5, #13
488 vmlal.s16 q4, ROW7R, XFIX_0_298631336_MINUS_0_899976223 492 vmlal.s16 q4, ROW7R, XFIX_0_298631336_MINUS_0_899976223
489 vadd.s32 q2, q5, q6 493 vadd.s32 q2, q5, q6
490 vsub.s32 q1, q5, q6 494 vsub.s32 q1, q5, q6
491 vadd.s32 q6, q2, q7 495 vadd.s32 q6, q2, q7
492 vsub.s32 q2, q2, q7 496 vsub.s32 q2, q2, q7
493 vadd.s32 q5, q1, q4 497 vadd.s32 q5, q1, q4
494 vsub.s32 q3, q1, q4 498 vsub.s32 q3, q1, q4
495 vshrn.s32 ROW7R, q2, #16 499 vshrn.s32 ROW7R, q2, #16
496 vshrn.s32 ROW7L, q5, #16 /* ROW7L <-> ROW3R */ 500 vshrn.s32 ROW7L, q5, #16 /* ROW7L <-> ROW3R */
497 vshrn.s32 ROW4L, q6, #16 /* ROW4L <-> ROW0R */ 501 vshrn.s32 ROW4L, q6, #16 /* ROW4L <-> ROW0R */
498 vshrn.s32 ROW4R, q3, #16 502 vshrn.s32 ROW4R, q3, #16
499 503
500 2: /* Descale to 8-bit and range limit */ 504 2: /* Descale to 8-bit and range limit */
501 vqrshrn.s16 d16, q8, #2 505 vqrshrn.s16 d16, q8, #2
502 vqrshrn.s16 d17, q9, #2 506 vqrshrn.s16 d17, q9, #2
503 vqrshrn.s16 d18, q10, #2 507 vqrshrn.s16 d18, q10, #2
504 vqrshrn.s16 d19, q11, #2 508 vqrshrn.s16 d19, q11, #2
505 vpop {d8-d15} /* restore NEON registers */ 509 vpop {d8-d15} /* restore NEON registers */
506 vqrshrn.s16 d20, q12, #2 510 vqrshrn.s16 d20, q12, #2
507 /* Transpose the final 8-bit samples and do signed->unsigned conversion */ 511 /* Transpose the final 8-bit samples and do signed->unsigned conversion */
508 vtrn.16 q8, q9 512 vtrn.16 q8, q9
509 vqrshrn.s16 d21, q13, #2 513 vqrshrn.s16 d21, q13, #2
510 vqrshrn.s16 d22, q14, #2 514 vqrshrn.s16 d22, q14, #2
511 vmov.u8 q0, #(CENTERJSAMPLE) 515 vmov.u8 q0, #(CENTERJSAMPLE)
512 vqrshrn.s16 d23, q15, #2 516 vqrshrn.s16 d23, q15, #2
513 vtrn.8 d16, d17 517 vtrn.8 d16, d17
514 vtrn.8 d18, d19 518 vtrn.8 d18, d19
515 vadd.u8 q8, q8, q0 519 vadd.u8 q8, q8, q0
516 vadd.u8 q9, q9, q0 520 vadd.u8 q9, q9, q0
517 vtrn.16 q10, q11 521 vtrn.16 q10, q11
518 /* Store results to the output buffer */ 522 /* Store results to the output buffer */
519 ldmia OUTPUT_BUF!, {TMP1, TMP2} 523 ldmia OUTPUT_BUF!, {TMP1, TMP2}
520 add TMP1, TMP1, OUTPUT_COL 524 add TMP1, TMP1, OUTPUT_COL
521 add TMP2, TMP2, OUTPUT_COL 525 add TMP2, TMP2, OUTPUT_COL
522 vst1.8 {d16}, [TMP1] 526 vst1.8 {d16}, [TMP1]
523 vtrn.8 d20, d21 527 vtrn.8 d20, d21
524 vst1.8 {d17}, [TMP2] 528 vst1.8 {d17}, [TMP2]
525 ldmia OUTPUT_BUF!, {TMP1, TMP2} 529 ldmia OUTPUT_BUF!, {TMP1, TMP2}
526 add TMP1, TMP1, OUTPUT_COL 530 add TMP1, TMP1, OUTPUT_COL
527 add TMP2, TMP2, OUTPUT_COL 531 add TMP2, TMP2, OUTPUT_COL
528 vst1.8 {d18}, [TMP1] 532 vst1.8 {d18}, [TMP1]
529 vadd.u8 q10, q10, q0 533 vadd.u8 q10, q10, q0
530 vst1.8 {d19}, [TMP2] 534 vst1.8 {d19}, [TMP2]
531 ldmia OUTPUT_BUF, {TMP1, TMP2, TMP3, TMP4} 535 ldmia OUTPUT_BUF, {TMP1, TMP2, TMP3, TMP4}
532 add TMP1, TMP1, OUTPUT_COL 536 add TMP1, TMP1, OUTPUT_COL
533 add TMP2, TMP2, OUTPUT_COL 537 add TMP2, TMP2, OUTPUT_COL
534 add TMP3, TMP3, OUTPUT_COL 538 add TMP3, TMP3, OUTPUT_COL
535 add TMP4, TMP4, OUTPUT_COL 539 add TMP4, TMP4, OUTPUT_COL
536 vtrn.8 d22, d23 540 vtrn.8 d22, d23
537 vst1.8 {d20}, [TMP1] 541 vst1.8 {d20}, [TMP1]
538 vadd.u8 q11, q11, q0 542 vadd.u8 q11, q11, q0
539 vst1.8 {d21}, [TMP2] 543 vst1.8 {d21}, [TMP2]
540 vst1.8 {d22}, [TMP3] 544 vst1.8 {d22}, [TMP3]
541 vst1.8 {d23}, [TMP4] 545 vst1.8 {d23}, [TMP4]
542 bx lr 546 bx lr
543 547
544 3: /* Left 4x8 half is done, right 4x8 half contains mostly zeros */ 548 3: /* Left 4x8 half is done, right 4x8 half contains mostly zeros */
545 549
546 /* Transpose left 4x8 half */ 550 /* Transpose left 4x8 half */
547 vtrn.16 ROW6L, ROW7L 551 vtrn.16 ROW6L, ROW7L
548 vtrn.16 ROW2L, ROW3L 552 vtrn.16 ROW2L, ROW3L
549 vtrn.16 ROW0L, ROW1L 553 vtrn.16 ROW0L, ROW1L
550 vtrn.16 ROW4L, ROW5L 554 vtrn.16 ROW4L, ROW5L
551 vshl.s16 ROW0R, ROW0R, #2 /* PASS1_BITS */ 555 vshl.s16 ROW0R, ROW0R, #2 /* PASS1_BITS */
552 vtrn.32 ROW1L, ROW3L 556 vtrn.32 ROW1L, ROW3L
553 vtrn.32 ROW4L, ROW6L 557 vtrn.32 ROW4L, ROW6L
554 vtrn.32 ROW0L, ROW2L 558 vtrn.32 ROW0L, ROW2L
555 vtrn.32 ROW5L, ROW7L 559 vtrn.32 ROW5L, ROW7L
556 560
557 cmp r0, #0 561 cmp r0, #0
558 beq 4f /* Right 4x8 half has all zeros, go to 'sparse' second pa ss */ 562 beq 4f /* Right 4x8 half has all zeros, go to 'sparse' second
563 pass */
559 564
560 /* Only row 0 is non-zero for the right 4x8 half */ 565 /* Only row 0 is non-zero for the right 4x8 half */
561 vdup.s16 ROW1R, ROW0R[1] 566 vdup.s16 ROW1R, ROW0R[1]
562 vdup.s16 ROW2R, ROW0R[2] 567 vdup.s16 ROW2R, ROW0R[2]
563 vdup.s16 ROW3R, ROW0R[3] 568 vdup.s16 ROW3R, ROW0R[3]
564 vdup.s16 ROW4R, ROW0R[0] 569 vdup.s16 ROW4R, ROW0R[0]
565 vdup.s16 ROW5R, ROW0R[1] 570 vdup.s16 ROW5R, ROW0R[1]
566 vdup.s16 ROW6R, ROW0R[2] 571 vdup.s16 ROW6R, ROW0R[2]
567 vdup.s16 ROW7R, ROW0R[3] 572 vdup.s16 ROW7R, ROW0R[3]
568 vdup.s16 ROW0R, ROW0R[0] 573 vdup.s16 ROW0R, ROW0R[0]
569 b 1b /* Go to 'normal' second pass */ 574 b 1b /* Go to 'normal' second pass */
570 575
571 4: /* 1-D IDCT, pass 2 (sparse variant with zero rows 4-7), left 4x8 half */ 576 4: /* 1-D IDCT, pass 2 (sparse variant with zero rows 4-7), left 4x8 half */
572 vld1.s16 {d2}, [ip, :64] /* reload constants */ 577 vld1.s16 {d2}, [ip, :64] /* reload constants */
573 vmull.s16 q6, ROW1L, XFIX_1_175875602 578 vmull.s16 q6, ROW1L, XFIX_1_175875602
574 vmlal.s16 q6, ROW3L, XFIX_1_175875602_MINUS_1_961570560 579 vmlal.s16 q6, ROW3L, XFIX_1_175875602_MINUS_1_961570560
575 vmull.s16 q7, ROW3L, XFIX_1_175875602 580 vmull.s16 q7, ROW3L, XFIX_1_175875602
576 vmlal.s16 q7, ROW1L, XFIX_1_175875602_MINUS_0_390180644 581 vmlal.s16 q7, ROW1L, XFIX_1_175875602_MINUS_0_390180644
577 vmull.s16 q2, ROW2L, XFIX_0_541196100 582 vmull.s16 q2, ROW2L, XFIX_0_541196100
578 vshll.s16 q3, ROW0L, #13 583 vshll.s16 q3, ROW0L, #13
579 vmov q4, q6 584 vmov q4, q6
580 vmlal.s16 q6, ROW3L, XFIX_3_072711026_MINUS_2_562915447 585 vmlal.s16 q6, ROW3L, XFIX_3_072711026_MINUS_2_562915447
581 vmlsl.s16 q4, ROW1L, XFIX_0_899976223 586 vmlsl.s16 q4, ROW1L, XFIX_0_899976223
582 vadd.s32 q1, q3, q2 587 vadd.s32 q1, q3, q2
583 vmov q5, q7 588 vmov q5, q7
584 vmlal.s16 q7, ROW1L, XFIX_1_501321110_MINUS_0_899976223 589 vmlal.s16 q7, ROW1L, XFIX_1_501321110_MINUS_0_899976223
585 vadd.s32 q1, q1, q6 590 vadd.s32 q1, q1, q6
586 vadd.s32 q6, q6, q6 591 vadd.s32 q6, q6, q6
587 vmlsl.s16 q5, ROW3L, XFIX_2_562915447 592 vmlsl.s16 q5, ROW3L, XFIX_2_562915447
588 vshrn.s32 ROW1L, q1, #16 593 vshrn.s32 ROW1L, q1, #16
589 vsub.s32 q1, q1, q6 594 vsub.s32 q1, q1, q6
590 vmull.s16 q6, ROW2L, XFIX_0_541196100_PLUS_0_765366865 595 vmull.s16 q6, ROW2L, XFIX_0_541196100_PLUS_0_765366865
591 vsub.s32 q3, q3, q2 596 vsub.s32 q3, q3, q2
592 vshrn.s32 ROW2R, q1, #16 /* ROW6L <-> ROW2R */ 597 vshrn.s32 ROW2R, q1, #16 /* ROW6L <-> ROW2R */
593 vadd.s32 q1, q3, q5 598 vadd.s32 q1, q3, q5
594 vsub.s32 q3, q3, q5 599 vsub.s32 q3, q3, q5
595 vshll.s16 q5, ROW0L, #13 600 vshll.s16 q5, ROW0L, #13
596 vshrn.s32 ROW2L, q1, #16 601 vshrn.s32 ROW2L, q1, #16
597 vshrn.s32 ROW1R, q3, #16 /* ROW5L <-> ROW1R */ 602 vshrn.s32 ROW1R, q3, #16 /* ROW5L <-> ROW1R */
598 vadd.s32 q2, q5, q6 603 vadd.s32 q2, q5, q6
599 vsub.s32 q1, q5, q6 604 vsub.s32 q1, q5, q6
600 vadd.s32 q6, q2, q7 605 vadd.s32 q6, q2, q7
601 vsub.s32 q2, q2, q7 606 vsub.s32 q2, q2, q7
602 vadd.s32 q5, q1, q4 607 vadd.s32 q5, q1, q4
603 vsub.s32 q3, q1, q4 608 vsub.s32 q3, q1, q4
604 vshrn.s32 ROW3R, q2, #16 /* ROW7L <-> ROW3R */ 609 vshrn.s32 ROW3R, q2, #16 /* ROW7L <-> ROW3R */
605 vshrn.s32 ROW3L, q5, #16 610 vshrn.s32 ROW3L, q5, #16
606 vshrn.s32 ROW0L, q6, #16 611 vshrn.s32 ROW0L, q6, #16
607 vshrn.s32 ROW0R, q3, #16 /* ROW4L <-> ROW0R */ 612 vshrn.s32 ROW0R, q3, #16 /* ROW4L <-> ROW0R */
608 /* 1-D IDCT, pass 2 (sparse variant with zero rows 4-7), right 4x8 half */ 613 /* 1-D IDCT, pass 2 (sparse variant with zero rows 4-7), right 4x8 half */
609 vld1.s16 {d2}, [ip, :64] /* reload constants */ 614 vld1.s16 {d2}, [ip, :64] /* reload constants */
610 vmull.s16 q6, ROW5L, XFIX_1_175875602 615 vmull.s16 q6, ROW5L, XFIX_1_175875602
611 vmlal.s16 q6, ROW7L, XFIX_1_175875602_MINUS_1_961570560 616 vmlal.s16 q6, ROW7L, XFIX_1_175875602_MINUS_1_961570560
612 vmull.s16 q7, ROW7L, XFIX_1_175875602 617 vmull.s16 q7, ROW7L, XFIX_1_175875602
613 vmlal.s16 q7, ROW5L, XFIX_1_175875602_MINUS_0_390180644 618 vmlal.s16 q7, ROW5L, XFIX_1_175875602_MINUS_0_390180644
614 vmull.s16 q2, ROW6L, XFIX_0_541196100 619 vmull.s16 q2, ROW6L, XFIX_0_541196100
615 vshll.s16 q3, ROW4L, #13 620 vshll.s16 q3, ROW4L, #13
616 vmov q4, q6 621 vmov q4, q6
617 vmlal.s16 q6, ROW7L, XFIX_3_072711026_MINUS_2_562915447 622 vmlal.s16 q6, ROW7L, XFIX_3_072711026_MINUS_2_562915447
618 vmlsl.s16 q4, ROW5L, XFIX_0_899976223 623 vmlsl.s16 q4, ROW5L, XFIX_0_899976223
619 vadd.s32 q1, q3, q2 624 vadd.s32 q1, q3, q2
620 vmov q5, q7 625 vmov q5, q7
621 vmlal.s16 q7, ROW5L, XFIX_1_501321110_MINUS_0_899976223 626 vmlal.s16 q7, ROW5L, XFIX_1_501321110_MINUS_0_899976223
622 vadd.s32 q1, q1, q6 627 vadd.s32 q1, q1, q6
623 vadd.s32 q6, q6, q6 628 vadd.s32 q6, q6, q6
624 vmlsl.s16 q5, ROW7L, XFIX_2_562915447 629 vmlsl.s16 q5, ROW7L, XFIX_2_562915447
625 vshrn.s32 ROW5L, q1, #16 /* ROW5L <-> ROW1R */ 630 vshrn.s32 ROW5L, q1, #16 /* ROW5L <-> ROW1R */
626 vsub.s32 q1, q1, q6 631 vsub.s32 q1, q1, q6
627 vmull.s16 q6, ROW6L, XFIX_0_541196100_PLUS_0_765366865 632 vmull.s16 q6, ROW6L, XFIX_0_541196100_PLUS_0_765366865
628 vsub.s32 q3, q3, q2 633 vsub.s32 q3, q3, q2
629 vshrn.s32 ROW6R, q1, #16 634 vshrn.s32 ROW6R, q1, #16
630 vadd.s32 q1, q3, q5 635 vadd.s32 q1, q3, q5
631 vsub.s32 q3, q3, q5 636 vsub.s32 q3, q3, q5
632 vshll.s16 q5, ROW4L, #13 637 vshll.s16 q5, ROW4L, #13
633 vshrn.s32 ROW6L, q1, #16 /* ROW6L <-> ROW2R */ 638 vshrn.s32 ROW6L, q1, #16 /* ROW6L <-> ROW2R */
634 vshrn.s32 ROW5R, q3, #16 639 vshrn.s32 ROW5R, q3, #16
635 vadd.s32 q2, q5, q6 640 vadd.s32 q2, q5, q6
636 vsub.s32 q1, q5, q6 641 vsub.s32 q1, q5, q6
637 vadd.s32 q6, q2, q7 642 vadd.s32 q6, q2, q7
638 vsub.s32 q2, q2, q7 643 vsub.s32 q2, q2, q7
639 vadd.s32 q5, q1, q4 644 vadd.s32 q5, q1, q4
640 vsub.s32 q3, q1, q4 645 vsub.s32 q3, q1, q4
641 vshrn.s32 ROW7R, q2, #16 646 vshrn.s32 ROW7R, q2, #16
642 vshrn.s32 ROW7L, q5, #16 /* ROW7L <-> ROW3R */ 647 vshrn.s32 ROW7L, q5, #16 /* ROW7L <-> ROW3R */
643 vshrn.s32 ROW4L, q6, #16 /* ROW4L <-> ROW0R */ 648 vshrn.s32 ROW4L, q6, #16 /* ROW4L <-> ROW0R */
644 vshrn.s32 ROW4R, q3, #16 649 vshrn.s32 ROW4R, q3, #16
645 b 2b /* Go to epilogue */ 650 b 2b /* Go to epilogue */
646 651
647 .unreq DCT_TABLE 652 .unreq DCT_TABLE
648 .unreq COEF_BLOCK 653 .unreq COEF_BLOCK
649 .unreq OUTPUT_BUF 654 .unreq OUTPUT_BUF
650 .unreq OUTPUT_COL 655 .unreq OUTPUT_COL
651 .unreq TMP1 656 .unreq TMP1
652 .unreq TMP2 657 .unreq TMP2
653 .unreq TMP3 658 .unreq TMP3
654 .unreq TMP4 659 .unreq TMP4
655 660
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
689 * per 1-D IDCT pass, totalling to 5 VQDMULH and 35 VADD/VSUB instructions. 694 * per 1-D IDCT pass, totalling to 5 VQDMULH and 35 VADD/VSUB instructions.
690 */ 695 */
691 696
692 #define XFIX_1_082392200 d0[0] 697 #define XFIX_1_082392200 d0[0]
693 #define XFIX_1_414213562 d0[1] 698 #define XFIX_1_414213562 d0[1]
694 #define XFIX_1_847759065 d0[2] 699 #define XFIX_1_847759065 d0[2]
695 #define XFIX_2_613125930 d0[3] 700 #define XFIX_2_613125930 d0[3]
696 701
697 .balign 16 702 .balign 16
698 jsimd_idct_ifast_neon_consts: 703 jsimd_idct_ifast_neon_consts:
699 .short (277 * 128 - 256 * 128) /* XFIX_1_082392200 */ 704 .short (277 * 128 - 256 * 128) /* XFIX_1_082392200 */
700 .short (362 * 128 - 256 * 128) /* XFIX_1_414213562 */ 705 .short (362 * 128 - 256 * 128) /* XFIX_1_414213562 */
701 .short (473 * 128 - 256 * 128) /* XFIX_1_847759065 */ 706 .short (473 * 128 - 256 * 128) /* XFIX_1_847759065 */
702 .short (669 * 128 - 512 * 128) /* XFIX_2_613125930 */ 707 .short (669 * 128 - 512 * 128) /* XFIX_2_613125930 */
703 708
704 asm_function jsimd_idct_ifast_neon 709 asm_function jsimd_idct_ifast_neon
705 710
706 DCT_TABLE .req r0 711 DCT_TABLE .req r0
707 COEF_BLOCK .req r1 712 COEF_BLOCK .req r1
708 OUTPUT_BUF .req r2 713 OUTPUT_BUF .req r2
709 OUTPUT_COL .req r3 714 OUTPUT_COL .req r3
710 TMP1 .req r0 715 TMP1 .req r0
711 TMP2 .req r1 716 TMP2 .req r1
712 TMP3 .req r2 717 TMP3 .req r2
713 TMP4 .req ip 718 TMP4 .req ip
714 719
715 /* Load and dequantize coefficients into NEON registers 720 /* Load and dequantize coefficients into NEON registers
716 * with the following allocation: 721 * with the following allocation:
717 * 0 1 2 3 | 4 5 6 7 722 * 0 1 2 3 | 4 5 6 7
718 * ---------+-------- 723 * ---------+--------
719 * 0 | d16 | d17 ( q8 ) 724 * 0 | d16 | d17 ( q8 )
720 * 1 | d18 | d19 ( q9 ) 725 * 1 | d18 | d19 ( q9 )
721 * 2 | d20 | d21 ( q10 ) 726 * 2 | d20 | d21 ( q10 )
722 * 3 | d22 | d23 ( q11 ) 727 * 3 | d22 | d23 ( q11 )
723 * 4 | d24 | d25 ( q12 ) 728 * 4 | d24 | d25 ( q12 )
724 * 5 | d26 | d27 ( q13 ) 729 * 5 | d26 | d27 ( q13 )
725 * 6 | d28 | d29 ( q14 ) 730 * 6 | d28 | d29 ( q14 )
726 * 7 | d30 | d31 ( q15 ) 731 * 7 | d30 | d31 ( q15 )
727 */ 732 */
728 adr ip, jsimd_idct_ifast_neon_consts 733 adr ip, jsimd_idct_ifast_neon_consts
729 vld1.16 {d16, d17, d18, d19}, [COEF_BLOCK, :128]! 734 vld1.16 {d16, d17, d18, d19}, [COEF_BLOCK, :128]!
730 vld1.16 {d0, d1, d2, d3}, [DCT_TABLE, :128]! 735 vld1.16 {d0, d1, d2, d3}, [DCT_TABLE, :128]!
731 vld1.16 {d20, d21, d22, d23}, [COEF_BLOCK, :128]! 736 vld1.16 {d20, d21, d22, d23}, [COEF_BLOCK, :128]!
732 vmul.s16 q8, q8, q0 737 vmul.s16 q8, q8, q0
733 vld1.16 {d4, d5, d6, d7}, [DCT_TABLE, :128]! 738 vld1.16 {d4, d5, d6, d7}, [DCT_TABLE, :128]!
734 vmul.s16 q9, q9, q1 739 vmul.s16 q9, q9, q1
735 vld1.16 {d24, d25, d26, d27}, [COEF_BLOCK, :128]! 740 vld1.16 {d24, d25, d26, d27}, [COEF_BLOCK, :128]!
736 vmul.s16 q10, q10, q2 741 vmul.s16 q10, q10, q2
737 vld1.16 {d0, d1, d2, d3}, [DCT_TABLE, :128]! 742 vld1.16 {d0, d1, d2, d3}, [DCT_TABLE, :128]!
738 vmul.s16 q11, q11, q3 743 vmul.s16 q11, q11, q3
739 vld1.16 {d28, d29, d30, d31}, [COEF_BLOCK, :128] 744 vld1.16 {d28, d29, d30, d31}, [COEF_BLOCK, :128]
740 vmul.s16 q12, q12, q0 745 vmul.s16 q12, q12, q0
741 vld1.16 {d4, d5, d6, d7}, [DCT_TABLE, :128]! 746 vld1.16 {d4, d5, d6, d7}, [DCT_TABLE, :128]!
742 vmul.s16 q14, q14, q2 747 vmul.s16 q14, q14, q2
743 vmul.s16 q13, q13, q1 748 vmul.s16 q13, q13, q1
744 vld1.16 {d0}, [ip, :64] /* load constants */ 749 vld1.16 {d0}, [ip, :64] /* load constants */
745 vmul.s16 q15, q15, q3 750 vmul.s16 q15, q15, q3
746 vpush {d8-d13} /* save NEON registers */ 751 vpush {d8-d13} /* save NEON registers */
747 /* 1-D IDCT, pass 1 */ 752 /* 1-D IDCT, pass 1 */
748 vsub.s16 q2, q10, q14 753 vsub.s16 q2, q10, q14
749 vadd.s16 q14, q10, q14 754 vadd.s16 q14, q10, q14
750 vsub.s16 q1, q11, q13 755 vsub.s16 q1, q11, q13
751 vadd.s16 q13, q11, q13 756 vadd.s16 q13, q11, q13
752 vsub.s16 q5, q9, q15 757 vsub.s16 q5, q9, q15
753 vadd.s16 q15, q9, q15 758 vadd.s16 q15, q9, q15
754 vqdmulh.s16 q4, q2, XFIX_1_414213562 759 vqdmulh.s16 q4, q2, XFIX_1_414213562
755 vqdmulh.s16 q6, q1, XFIX_2_613125930 760 vqdmulh.s16 q6, q1, XFIX_2_613125930
756 vadd.s16 q3, q1, q1 761 vadd.s16 q3, q1, q1
757 vsub.s16 q1, q5, q1 762 vsub.s16 q1, q5, q1
758 vadd.s16 q10, q2, q4 763 vadd.s16 q10, q2, q4
759 vqdmulh.s16 q4, q1, XFIX_1_847759065 764 vqdmulh.s16 q4, q1, XFIX_1_847759065
760 vsub.s16 q2, q15, q13 765 vsub.s16 q2, q15, q13
761 vadd.s16 q3, q3, q6 766 vadd.s16 q3, q3, q6
762 vqdmulh.s16 q6, q2, XFIX_1_414213562 767 vqdmulh.s16 q6, q2, XFIX_1_414213562
763 vadd.s16 q1, q1, q4 768 vadd.s16 q1, q1, q4
764 vqdmulh.s16 q4, q5, XFIX_1_082392200 769 vqdmulh.s16 q4, q5, XFIX_1_082392200
765 vsub.s16 q10, q10, q14 770 vsub.s16 q10, q10, q14
766 vadd.s16 q2, q2, q6 771 vadd.s16 q2, q2, q6
767 vsub.s16 q6, q8, q12 772 vsub.s16 q6, q8, q12
768 vadd.s16 q12, q8, q12 773 vadd.s16 q12, q8, q12
769 vadd.s16 q9, q5, q4 774 vadd.s16 q9, q5, q4
770 vadd.s16 q5, q6, q10 775 vadd.s16 q5, q6, q10
771 vsub.s16 q10, q6, q10 776 vsub.s16 q10, q6, q10
772 vadd.s16 q6, q15, q13 777 vadd.s16 q6, q15, q13
773 vadd.s16 q8, q12, q14 778 vadd.s16 q8, q12, q14
774 vsub.s16 q3, q6, q3 779 vsub.s16 q3, q6, q3
775 vsub.s16 q12, q12, q14 780 vsub.s16 q12, q12, q14
776 vsub.s16 q3, q3, q1 781 vsub.s16 q3, q3, q1
777 vsub.s16 q1, q9, q1 782 vsub.s16 q1, q9, q1
778 vadd.s16 q2, q3, q2 783 vadd.s16 q2, q3, q2
779 vsub.s16 q15, q8, q6 784 vsub.s16 q15, q8, q6
780 vadd.s16 q1, q1, q2 785 vadd.s16 q1, q1, q2
781 vadd.s16 q8, q8, q6 786 vadd.s16 q8, q8, q6
782 vadd.s16 q14, q5, q3 787 vadd.s16 q14, q5, q3
783 vsub.s16 q9, q5, q3 788 vsub.s16 q9, q5, q3
784 vsub.s16 q13, q10, q2 789 vsub.s16 q13, q10, q2
785 vadd.s16 q10, q10, q2 790 vadd.s16 q10, q10, q2
786 /* Transpose */ 791 /* Transpose */
787 vtrn.16 q8, q9 792 vtrn.16 q8, q9
788 vsub.s16 q11, q12, q1 793 vsub.s16 q11, q12, q1
789 vtrn.16 q14, q15 794 vtrn.16 q14, q15
790 vadd.s16 q12, q12, q1 795 vadd.s16 q12, q12, q1
791 vtrn.16 q10, q11 796 vtrn.16 q10, q11
792 vtrn.16 q12, q13 797 vtrn.16 q12, q13
793 vtrn.32 q9, q11 798 vtrn.32 q9, q11
794 vtrn.32 q12, q14 799 vtrn.32 q12, q14
795 vtrn.32 q8, q10 800 vtrn.32 q8, q10
796 vtrn.32 q13, q15 801 vtrn.32 q13, q15
797 vswp d28, d21 802 vswp d28, d21
798 vswp d26, d19 803 vswp d26, d19
799 /* 1-D IDCT, pass 2 */ 804 /* 1-D IDCT, pass 2 */
800 vsub.s16 q2, q10, q14 805 vsub.s16 q2, q10, q14
801 vswp d30, d23 806 vswp d30, d23
802 vadd.s16 q14, q10, q14 807 vadd.s16 q14, q10, q14
803 vswp d24, d17 808 vswp d24, d17
804 vsub.s16 q1, q11, q13 809 vsub.s16 q1, q11, q13
805 vadd.s16 q13, q11, q13 810 vadd.s16 q13, q11, q13
806 vsub.s16 q5, q9, q15 811 vsub.s16 q5, q9, q15
807 vadd.s16 q15, q9, q15 812 vadd.s16 q15, q9, q15
808 vqdmulh.s16 q4, q2, XFIX_1_414213562 813 vqdmulh.s16 q4, q2, XFIX_1_414213562
809 vqdmulh.s16 q6, q1, XFIX_2_613125930 814 vqdmulh.s16 q6, q1, XFIX_2_613125930
810 vadd.s16 q3, q1, q1 815 vadd.s16 q3, q1, q1
811 vsub.s16 q1, q5, q1 816 vsub.s16 q1, q5, q1
812 vadd.s16 q10, q2, q4 817 vadd.s16 q10, q2, q4
813 vqdmulh.s16 q4, q1, XFIX_1_847759065 818 vqdmulh.s16 q4, q1, XFIX_1_847759065
814 vsub.s16 q2, q15, q13 819 vsub.s16 q2, q15, q13
815 vadd.s16 q3, q3, q6 820 vadd.s16 q3, q3, q6
816 vqdmulh.s16 q6, q2, XFIX_1_414213562 821 vqdmulh.s16 q6, q2, XFIX_1_414213562
817 vadd.s16 q1, q1, q4 822 vadd.s16 q1, q1, q4
818 vqdmulh.s16 q4, q5, XFIX_1_082392200 823 vqdmulh.s16 q4, q5, XFIX_1_082392200
819 vsub.s16 q10, q10, q14 824 vsub.s16 q10, q10, q14
820 vadd.s16 q2, q2, q6 825 vadd.s16 q2, q2, q6
821 vsub.s16 q6, q8, q12 826 vsub.s16 q6, q8, q12
822 vadd.s16 q12, q8, q12 827 vadd.s16 q12, q8, q12
823 vadd.s16 q9, q5, q4 828 vadd.s16 q9, q5, q4
824 vadd.s16 q5, q6, q10 829 vadd.s16 q5, q6, q10
825 vsub.s16 q10, q6, q10 830 vsub.s16 q10, q6, q10
826 vadd.s16 q6, q15, q13 831 vadd.s16 q6, q15, q13
827 vadd.s16 q8, q12, q14 832 vadd.s16 q8, q12, q14
828 vsub.s16 q3, q6, q3 833 vsub.s16 q3, q6, q3
829 vsub.s16 q12, q12, q14 834 vsub.s16 q12, q12, q14
830 vsub.s16 q3, q3, q1 835 vsub.s16 q3, q3, q1
831 vsub.s16 q1, q9, q1 836 vsub.s16 q1, q9, q1
832 vadd.s16 q2, q3, q2 837 vadd.s16 q2, q3, q2
833 vsub.s16 q15, q8, q6 838 vsub.s16 q15, q8, q6
834 vadd.s16 q1, q1, q2 839 vadd.s16 q1, q1, q2
835 vadd.s16 q8, q8, q6 840 vadd.s16 q8, q8, q6
836 vadd.s16 q14, q5, q3 841 vadd.s16 q14, q5, q3
837 vsub.s16 q9, q5, q3 842 vsub.s16 q9, q5, q3
838 vsub.s16 q13, q10, q2 843 vsub.s16 q13, q10, q2
839 vpop {d8-d13} /* restore NEON registers */ 844 vpop {d8-d13} /* restore NEON registers */
840 vadd.s16 q10, q10, q2 845 vadd.s16 q10, q10, q2
841 vsub.s16 q11, q12, q1 846 vsub.s16 q11, q12, q1
842 vadd.s16 q12, q12, q1 847 vadd.s16 q12, q12, q1
843 /* Descale to 8-bit and range limit */ 848 /* Descale to 8-bit and range limit */
844 vmov.u8 q0, #0x80 849 vmov.u8 q0, #0x80
845 vqshrn.s16 d16, q8, #5 850 vqshrn.s16 d16, q8, #5
846 vqshrn.s16 d17, q9, #5 851 vqshrn.s16 d17, q9, #5
847 vqshrn.s16 d18, q10, #5 852 vqshrn.s16 d18, q10, #5
848 vqshrn.s16 d19, q11, #5 853 vqshrn.s16 d19, q11, #5
849 vqshrn.s16 d20, q12, #5 854 vqshrn.s16 d20, q12, #5
850 vqshrn.s16 d21, q13, #5 855 vqshrn.s16 d21, q13, #5
851 vqshrn.s16 d22, q14, #5 856 vqshrn.s16 d22, q14, #5
852 vqshrn.s16 d23, q15, #5 857 vqshrn.s16 d23, q15, #5
853 vadd.u8 q8, q8, q0 858 vadd.u8 q8, q8, q0
854 vadd.u8 q9, q9, q0 859 vadd.u8 q9, q9, q0
855 vadd.u8 q10, q10, q0 860 vadd.u8 q10, q10, q0
856 vadd.u8 q11, q11, q0 861 vadd.u8 q11, q11, q0
857 /* Transpose the final 8-bit samples */ 862 /* Transpose the final 8-bit samples */
858 vtrn.16 q8, q9 863 vtrn.16 q8, q9
859 vtrn.16 q10, q11 864 vtrn.16 q10, q11
860 vtrn.32 q8, q10 865 vtrn.32 q8, q10
861 vtrn.32 q9, q11 866 vtrn.32 q9, q11
862 vtrn.8 d16, d17 867 vtrn.8 d16, d17
863 vtrn.8 d18, d19 868 vtrn.8 d18, d19
864 /* Store results to the output buffer */ 869 /* Store results to the output buffer */
865 ldmia OUTPUT_BUF!, {TMP1, TMP2} 870 ldmia OUTPUT_BUF!, {TMP1, TMP2}
866 add TMP1, TMP1, OUTPUT_COL 871 add TMP1, TMP1, OUTPUT_COL
867 add TMP2, TMP2, OUTPUT_COL 872 add TMP2, TMP2, OUTPUT_COL
868 vst1.8 {d16}, [TMP1] 873 vst1.8 {d16}, [TMP1]
869 vst1.8 {d17}, [TMP2] 874 vst1.8 {d17}, [TMP2]
870 ldmia OUTPUT_BUF!, {TMP1, TMP2} 875 ldmia OUTPUT_BUF!, {TMP1, TMP2}
871 add TMP1, TMP1, OUTPUT_COL 876 add TMP1, TMP1, OUTPUT_COL
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
910 * The primary purpose of this particular NEON optimized function is 915 * The primary purpose of this particular NEON optimized function is
911 * bit exact compatibility with jpeg-6b. 916 * bit exact compatibility with jpeg-6b.
912 * 917 *
913 * TODO: a bit better instructions scheduling can be achieved by expanding 918 * TODO: a bit better instructions scheduling can be achieved by expanding
914 * idct_helper/transpose_4x4 macros and reordering instructions, 919 * idct_helper/transpose_4x4 macros and reordering instructions,
915 * but readability will suffer somewhat. 920 * but readability will suffer somewhat.
916 */ 921 */
917 922
918 #define CONST_BITS 13 923 #define CONST_BITS 13
919 924
920 #define FIX_0_211164243 (1730) /* FIX(0.211164243) */ 925 #define FIX_0_211164243 (1730) /* FIX(0.211164243) */
921 #define FIX_0_509795579 (4176) /* FIX(0.509795579) */ 926 #define FIX_0_509795579 (4176) /* FIX(0.509795579) */
922 #define FIX_0_601344887 (4926) /* FIX(0.601344887) */ 927 #define FIX_0_601344887 (4926) /* FIX(0.601344887) */
923 #define FIX_0_720959822 (5906) /* FIX(0.720959822) */ 928 #define FIX_0_720959822 (5906) /* FIX(0.720959822) */
924 #define FIX_0_765366865 (6270) /* FIX(0.765366865) */ 929 #define FIX_0_765366865 (6270) /* FIX(0.765366865) */
925 #define FIX_0_850430095 (6967) /* FIX(0.850430095) */ 930 #define FIX_0_850430095 (6967) /* FIX(0.850430095) */
926 #define FIX_0_899976223 (7373) /* FIX(0.899976223) */ 931 #define FIX_0_899976223 (7373) /* FIX(0.899976223) */
927 #define FIX_1_061594337 (8697) /* FIX(1.061594337) */ 932 #define FIX_1_061594337 (8697) /* FIX(1.061594337) */
928 #define FIX_1_272758580 (10426) /* FIX(1.272758580) */ 933 #define FIX_1_272758580 (10426) /* FIX(1.272758580) */
929 #define FIX_1_451774981 (11893) /* FIX(1.451774981) */ 934 #define FIX_1_451774981 (11893) /* FIX(1.451774981) */
930 #define FIX_1_847759065 (15137) /* FIX(1.847759065) */ 935 #define FIX_1_847759065 (15137) /* FIX(1.847759065) */
931 #define FIX_2_172734803 (17799) /* FIX(2.172734803) */ 936 #define FIX_2_172734803 (17799) /* FIX(2.172734803) */
932 #define FIX_2_562915447 (20995) /* FIX(2.562915447) */ 937 #define FIX_2_562915447 (20995) /* FIX(2.562915447) */
933 #define FIX_3_624509785 (29692) /* FIX(3.624509785) */ 938 #define FIX_3_624509785 (29692) /* FIX(3.624509785) */
934 939
935 .balign 16 940 .balign 16
936 jsimd_idct_4x4_neon_consts: 941 jsimd_idct_4x4_neon_consts:
937 .short FIX_1_847759065 /* d0[0] */ 942 .short FIX_1_847759065 /* d0[0] */
938 .short -FIX_0_765366865 /* d0[1] */ 943 .short -FIX_0_765366865 /* d0[1] */
939 .short -FIX_0_211164243 /* d0[2] */ 944 .short -FIX_0_211164243 /* d0[2] */
940 .short FIX_1_451774981 /* d0[3] */ 945 .short FIX_1_451774981 /* d0[3] */
941 .short -FIX_2_172734803 /* d1[0] */ 946 .short -FIX_2_172734803 /* d1[0] */
942 .short FIX_1_061594337 /* d1[1] */ 947 .short FIX_1_061594337 /* d1[1] */
943 .short -FIX_0_509795579 /* d1[2] */ 948 .short -FIX_0_509795579 /* d1[2] */
944 .short -FIX_0_601344887 /* d1[3] */ 949 .short -FIX_0_601344887 /* d1[3] */
945 .short FIX_0_899976223 /* d2[0] */ 950 .short FIX_0_899976223 /* d2[0] */
946 .short FIX_2_562915447 /* d2[1] */ 951 .short FIX_2_562915447 /* d2[1] */
947 .short 1 << (CONST_BITS+1) /* d2[2] */ 952 .short 1 << (CONST_BITS+1) /* d2[2] */
948 .short 0 /* d2[3] */ 953 .short 0 /* d2[3] */
949 954
950 .macro idct_helper x4, x6, x8, x10, x12, x14, x16, shift, y26, y27, y28, y29 955 .macro idct_helper x4, x6, x8, x10, x12, x14, x16, shift, y26, y27, y28, y29
951 vmull.s16 q14, \x4, d2[2] 956 vmull.s16 q14, \x4, d2[2]
952 vmlal.s16 q14, \x8, d0[0] 957 vmlal.s16 q14, \x8, d0[0]
953 vmlal.s16 q14, \x14, d0[1] 958 vmlal.s16 q14, \x14, d0[1]
954 959
955 vmull.s16 q13, \x16, d1[2] 960 vmull.s16 q13, \x16, d1[2]
956 vmlal.s16 q13, \x12, d1[3] 961 vmlal.s16 q13, \x12, d1[3]
957 vmlal.s16 q13, \x10, d2[0] 962 vmlal.s16 q13, \x10, d2[0]
958 vmlal.s16 q13, \x6, d2[1] 963 vmlal.s16 q13, \x6, d2[1]
959 964
960 vmull.s16 q15, \x4, d2[2] 965 vmull.s16 q15, \x4, d2[2]
961 vmlsl.s16 q15, \x8, d0[0] 966 vmlsl.s16 q15, \x8, d0[0]
962 vmlsl.s16 q15, \x14, d0[1] 967 vmlsl.s16 q15, \x14, d0[1]
963 968
964 vmull.s16 q12, \x16, d0[2] 969 vmull.s16 q12, \x16, d0[2]
965 vmlal.s16 q12, \x12, d0[3] 970 vmlal.s16 q12, \x12, d0[3]
966 vmlal.s16 q12, \x10, d1[0] 971 vmlal.s16 q12, \x10, d1[0]
967 vmlal.s16 q12, \x6, d1[1] 972 vmlal.s16 q12, \x6, d1[1]
968 973
969 vadd.s32 q10, q14, q13 974 vadd.s32 q10, q14, q13
970 vsub.s32 q14, q14, q13 975 vsub.s32 q14, q14, q13
971 976
972 .if \shift > 16 977 .if \shift > 16
973 vrshr.s32 q10, q10, #\shift 978 vrshr.s32 q10, q10, #\shift
974 vrshr.s32 q14, q14, #\shift 979 vrshr.s32 q14, q14, #\shift
975 vmovn.s32 \y26, q10 980 vmovn.s32 \y26, q10
976 vmovn.s32 \y29, q14 981 vmovn.s32 \y29, q14
977 .else 982 .else
978 vrshrn.s32 \y26, q10, #\shift 983 vrshrn.s32 \y26, q10, #\shift
979 vrshrn.s32 \y29, q14, #\shift 984 vrshrn.s32 \y29, q14, #\shift
980 .endif 985 .endif
981 986
982 vadd.s32 q10, q15, q12 987 vadd.s32 q10, q15, q12
983 vsub.s32 q15, q15, q12 988 vsub.s32 q15, q15, q12
984 989
985 .if \shift > 16 990 .if \shift > 16
986 vrshr.s32 q10, q10, #\shift 991 vrshr.s32 q10, q10, #\shift
987 vrshr.s32 q15, q15, #\shift 992 vrshr.s32 q15, q15, #\shift
988 vmovn.s32 \y27, q10 993 vmovn.s32 \y27, q10
989 vmovn.s32 \y28, q15 994 vmovn.s32 \y28, q15
990 .else 995 .else
991 vrshrn.s32 \y27, q10, #\shift 996 vrshrn.s32 \y27, q10, #\shift
992 vrshrn.s32 \y28, q15, #\shift 997 vrshrn.s32 \y28, q15, #\shift
993 .endif 998 .endif
994
995 .endm 999 .endm
996 1000
997 asm_function jsimd_idct_4x4_neon 1001 asm_function jsimd_idct_4x4_neon
998 1002
999 DCT_TABLE .req r0 1003 DCT_TABLE .req r0
1000 COEF_BLOCK .req r1 1004 COEF_BLOCK .req r1
1001 OUTPUT_BUF .req r2 1005 OUTPUT_BUF .req r2
1002 OUTPUT_COL .req r3 1006 OUTPUT_COL .req r3
1003 TMP1 .req r0 1007 TMP1 .req r0
1004 TMP2 .req r1 1008 TMP2 .req r1
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
1120 * function from jpeg-6b (jidctred.c). 1124 * function from jpeg-6b (jidctred.c).
1121 * 1125 *
1122 * NOTE: jpeg-8 has an improved implementation of 2x2 inverse-DCT, which 1126 * NOTE: jpeg-8 has an improved implementation of 2x2 inverse-DCT, which
1123 * requires much less arithmetic operations and hence should be faster. 1127 * requires much less arithmetic operations and hence should be faster.
1124 * The primary purpose of this particular NEON optimized function is 1128 * The primary purpose of this particular NEON optimized function is
1125 * bit exact compatibility with jpeg-6b. 1129 * bit exact compatibility with jpeg-6b.
1126 */ 1130 */
1127 1131
1128 .balign 8 1132 .balign 8
1129 jsimd_idct_2x2_neon_consts: 1133 jsimd_idct_2x2_neon_consts:
1130 .short -FIX_0_720959822 /* d0[0] */ 1134 .short -FIX_0_720959822 /* d0[0] */
1131 .short FIX_0_850430095 /* d0[1] */ 1135 .short FIX_0_850430095 /* d0[1] */
1132 .short -FIX_1_272758580 /* d0[2] */ 1136 .short -FIX_1_272758580 /* d0[2] */
1133 .short FIX_3_624509785 /* d0[3] */ 1137 .short FIX_3_624509785 /* d0[3] */
1134 1138
1135 .macro idct_helper x4, x6, x10, x12, x16, shift, y26, y27 1139 .macro idct_helper x4, x6, x10, x12, x16, shift, y26, y27
1136 vshll.s16 q14, \x4, #15 1140 vshll.s16 q14, \x4, #15
1137 vmull.s16 q13, \x6, d0[3] 1141 vmull.s16 q13, \x6, d0[3]
1138 vmlal.s16 q13, \x10, d0[2] 1142 vmlal.s16 q13, \x10, d0[2]
1139 vmlal.s16 q13, \x12, d0[1] 1143 vmlal.s16 q13, \x12, d0[1]
1140 vmlal.s16 q13, \x16, d0[0] 1144 vmlal.s16 q13, \x16, d0[0]
1141 1145
1142 vadd.s32 q10, q14, q13 1146 vadd.s32 q10, q14, q13
1143 vsub.s32 q14, q14, q13 1147 vsub.s32 q14, q14, q13
1144 1148
1145 .if \shift > 16 1149 .if \shift > 16
1146 vrshr.s32 q10, q10, #\shift 1150 vrshr.s32 q10, q10, #\shift
1147 vrshr.s32 q14, q14, #\shift 1151 vrshr.s32 q14, q14, #\shift
1148 vmovn.s32 \y26, q10 1152 vmovn.s32 \y26, q10
1149 vmovn.s32 \y27, q14 1153 vmovn.s32 \y27, q14
1150 .else 1154 .else
1151 vrshrn.s32 \y26, q10, #\shift 1155 vrshrn.s32 \y26, q10, #\shift
1152 vrshrn.s32 \y27, q14, #\shift 1156 vrshrn.s32 \y27, q14, #\shift
1153 .endif 1157 .endif
1154
1155 .endm 1158 .endm
1156 1159
1157 asm_function jsimd_idct_2x2_neon 1160 asm_function jsimd_idct_2x2_neon
1158 1161
1159 DCT_TABLE .req r0 1162 DCT_TABLE .req r0
1160 COEF_BLOCK .req r1 1163 COEF_BLOCK .req r1
1161 OUTPUT_BUF .req r2 1164 OUTPUT_BUF .req r2
1162 OUTPUT_COL .req r3 1165 OUTPUT_COL .req r3
1163 TMP1 .req r0 1166 TMP1 .req r0
1164 TMP2 .req ip 1167 TMP2 .req ip
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
1198 add DCT_TABLE, DCT_TABLE, #16 1201 add DCT_TABLE, DCT_TABLE, #16
1199 vld1.16 {d26, d27}, [DCT_TABLE, :128]! 1202 vld1.16 {d26, d27}, [DCT_TABLE, :128]!
1200 vmul.s16 q6, q6, q13 1203 vmul.s16 q6, q6, q13
1201 add DCT_TABLE, DCT_TABLE, #16 1204 add DCT_TABLE, DCT_TABLE, #16
1202 vld1.16 {d30, d31}, [DCT_TABLE, :128]! 1205 vld1.16 {d30, d31}, [DCT_TABLE, :128]!
1203 vmul.s16 q8, q8, q15 1206 vmul.s16 q8, q8, q15
1204 1207
1205 /* Pass 1 */ 1208 /* Pass 1 */
1206 #if 0 1209 #if 0
1207 idct_helper d4, d6, d10, d12, d16, 13, d4, d6 1210 idct_helper d4, d6, d10, d12, d16, 13, d4, d6
1208 transpose_4x4 d4, d6, d8, d10 1211 transpose_4x4 d4, d6, d8, d10
1209 idct_helper d5, d7, d11, d13, d17, 13, d5, d7 1212 idct_helper d5, d7, d11, d13, d17, 13, d5, d7
1210 transpose_4x4 d5, d7, d9, d11 1213 transpose_4x4 d5, d7, d9, d11
1211 #else 1214 #else
1212 vmull.s16 q13, d6, d0[3] 1215 vmull.s16 q13, d6, d0[3]
1213 vmlal.s16 q13, d10, d0[2] 1216 vmlal.s16 q13, d10, d0[2]
1214 vmlal.s16 q13, d12, d0[1] 1217 vmlal.s16 q13, d12, d0[1]
1215 vmlal.s16 q13, d16, d0[0] 1218 vmlal.s16 q13, d16, d0[0]
1216 vmull.s16 q12, d7, d0[3] 1219 vmull.s16 q12, d7, d0[3]
1217 vmlal.s16 q12, d11, d0[2] 1220 vmlal.s16 q12, d11, d0[2]
1218 vmlal.s16 q12, d13, d0[1] 1221 vmlal.s16 q12, d13, d0[1]
1219 vmlal.s16 q12, d17, d0[0] 1222 vmlal.s16 q12, d17, d0[0]
1220 vshll.s16 q14, d4, #15 1223 vshll.s16 q14, d4, #15
1221 vshll.s16 q15, d5, #15 1224 vshll.s16 q15, d5, #15
1222 vadd.s32 q10, q14, q13 1225 vadd.s32 q10, q14, q13
1223 vsub.s32 q14, q14, q13 1226 vsub.s32 q14, q14, q13
1224 vrshrn.s32 d4, q10, #13 1227 vrshrn.s32 d4, q10, #13
1225 vrshrn.s32 d6, q14, #13 1228 vrshrn.s32 d6, q14, #13
1226 vadd.s32 q10, q15, q12 1229 vadd.s32 q10, q15, q12
1227 vsub.s32 q14, q15, q12 1230 vsub.s32 q14, q15, q12
1228 vrshrn.s32 d5, q10, #13 1231 vrshrn.s32 d5, q10, #13
1229 vrshrn.s32 d7, q14, #13 1232 vrshrn.s32 d7, q14, #13
1230 vtrn.16 q2, q3 1233 vtrn.16 q2, q3
1231 vtrn.32 q3, q5 1234 vtrn.32 q3, q5
1232 #endif 1235 #endif
1233 1236
1234 /* Pass 2 */ 1237 /* Pass 2 */
1235 idct_helper d4, d6, d10, d7, d11, 20, d26, d27 1238 idct_helper d4, d6, d10, d7, d11, 20, d26, d27
1236 1239
1237 /* Range limit */ 1240 /* Range limit */
1238 vmov.u16 q15, #0x80 1241 vmov.u16 q15, #0x80
1239 vadd.s16 q13, q13, q15 1242 vadd.s16 q13, q13, q15
1240 vqmovun.s16 d26, q13 1243 vqmovun.s16 d26, q13
1241 vqmovun.s16 d27, q13 1244 vqmovun.s16 d27, q13
(...skipping 29 matching lines...) Expand all
1271 * jsimd_ycc_extrgbx_convert_neon 1274 * jsimd_ycc_extrgbx_convert_neon
1272 * jsimd_ycc_extbgrx_convert_neon 1275 * jsimd_ycc_extbgrx_convert_neon
1273 * jsimd_ycc_extxbgr_convert_neon 1276 * jsimd_ycc_extxbgr_convert_neon
1274 * jsimd_ycc_extxrgb_convert_neon 1277 * jsimd_ycc_extxrgb_convert_neon
1275 * 1278 *
1276 * Colorspace conversion YCbCr -> RGB 1279 * Colorspace conversion YCbCr -> RGB
1277 */ 1280 */
1278 1281
1279 1282
1280 .macro do_load size 1283 .macro do_load size
1281 .if \size == 8 1284 .if \size == 8
1282 vld1.8 {d4}, [U, :64]! 1285 vld1.8 {d4}, [U, :64]!
1283 vld1.8 {d5}, [V, :64]! 1286 vld1.8 {d5}, [V, :64]!
1284 vld1.8 {d0}, [Y, :64]! 1287 vld1.8 {d0}, [Y, :64]!
1285 pld [U, #64] 1288 pld [U, #64]
1286 pld [V, #64] 1289 pld [V, #64]
1287 pld [Y, #64] 1290 pld [Y, #64]
1288 .elseif \size == 4 1291 .elseif \size == 4
1289 vld1.8 {d4[0]}, [U]! 1292 vld1.8 {d4[0]}, [U]!
1290 vld1.8 {d4[1]}, [U]! 1293 vld1.8 {d4[1]}, [U]!
1291 vld1.8 {d4[2]}, [U]! 1294 vld1.8 {d4[2]}, [U]!
1292 vld1.8 {d4[3]}, [U]! 1295 vld1.8 {d4[3]}, [U]!
1293 vld1.8 {d5[0]}, [V]! 1296 vld1.8 {d5[0]}, [V]!
1294 vld1.8 {d5[1]}, [V]! 1297 vld1.8 {d5[1]}, [V]!
1295 vld1.8 {d5[2]}, [V]! 1298 vld1.8 {d5[2]}, [V]!
1296 vld1.8 {d5[3]}, [V]! 1299 vld1.8 {d5[3]}, [V]!
1297 vld1.8 {d0[0]}, [Y]! 1300 vld1.8 {d0[0]}, [Y]!
1298 vld1.8 {d0[1]}, [Y]! 1301 vld1.8 {d0[1]}, [Y]!
1299 vld1.8 {d0[2]}, [Y]! 1302 vld1.8 {d0[2]}, [Y]!
1300 vld1.8 {d0[3]}, [Y]! 1303 vld1.8 {d0[3]}, [Y]!
1301 .elseif \size == 2 1304 .elseif \size == 2
1302 vld1.8 {d4[4]}, [U]! 1305 vld1.8 {d4[4]}, [U]!
1303 vld1.8 {d4[5]}, [U]! 1306 vld1.8 {d4[5]}, [U]!
1304 vld1.8 {d5[4]}, [V]! 1307 vld1.8 {d5[4]}, [V]!
1305 vld1.8 {d5[5]}, [V]! 1308 vld1.8 {d5[5]}, [V]!
1306 vld1.8 {d0[4]}, [Y]! 1309 vld1.8 {d0[4]}, [Y]!
1307 vld1.8 {d0[5]}, [Y]! 1310 vld1.8 {d0[5]}, [Y]!
1308 .elseif \size == 1 1311 .elseif \size == 1
1309 vld1.8 {d4[6]}, [U]! 1312 vld1.8 {d4[6]}, [U]!
1310 vld1.8 {d5[6]}, [V]! 1313 vld1.8 {d5[6]}, [V]!
1311 vld1.8 {d0[6]}, [Y]! 1314 vld1.8 {d0[6]}, [Y]!
1312 .else 1315 .else
1313 .error unsupported macroblock size 1316 .error unsupported macroblock size
1314 .endif 1317 .endif
1315 .endm 1318 .endm
1316 1319
1317 .macro do_store bpp, size 1320 .macro do_store bpp, size
1318 .if \bpp == 24 1321 .if \bpp == 24
1319 .if \size == 8 1322 .if \size == 8
1320 vst3.8 {d10, d11, d12}, [RGB]! 1323 vst3.8 {d10, d11, d12}, [RGB]!
1321 .elseif \size == 4 1324 .elseif \size == 4
1322 vst3.8 {d10[0], d11[0], d12[0]}, [RGB]! 1325 vst3.8 {d10[0], d11[0], d12[0]}, [RGB]!
1323 vst3.8 {d10[1], d11[1], d12[1]}, [RGB]! 1326 vst3.8 {d10[1], d11[1], d12[1]}, [RGB]!
1324 vst3.8 {d10[2], d11[2], d12[2]}, [RGB]! 1327 vst3.8 {d10[2], d11[2], d12[2]}, [RGB]!
1325 vst3.8 {d10[3], d11[3], d12[3]}, [RGB]! 1328 vst3.8 {d10[3], d11[3], d12[3]}, [RGB]!
1326 .elseif \size == 2 1329 .elseif \size == 2
1327 vst3.8 {d10[4], d11[4], d12[4]}, [RGB]! 1330 vst3.8 {d10[4], d11[4], d12[4]}, [RGB]!
1328 vst3.8 {d10[5], d11[5], d12[5]}, [RGB]! 1331 vst3.8 {d10[5], d11[5], d12[5]}, [RGB]!
1329 .elseif \size == 1 1332 .elseif \size == 1
1330 vst3.8 {d10[6], d11[6], d12[6]}, [RGB]! 1333 vst3.8 {d10[6], d11[6], d12[6]}, [RGB]!
1331 .else
1332 .error unsupported macroblock size
1333 .endif
1334 .elseif \bpp == 32
1335 .if \size == 8
1336 vst4.8 {d10, d11, d12, d13}, [RGB]!
1337 .elseif \size == 4
1338 vst4.8 {d10[0], d11[0], d12[0], d13[0]}, [RGB]!
1339 vst4.8 {d10[1], d11[1], d12[1], d13[1]}, [RGB]!
1340 vst4.8 {d10[2], d11[2], d12[2], d13[2]}, [RGB]!
1341 vst4.8 {d10[3], d11[3], d12[3], d13[3]}, [RGB]!
1342 .elseif \size == 2
1343 vst4.8 {d10[4], d11[4], d12[4], d13[4]}, [RGB]!
1344 vst4.8 {d10[5], d11[5], d12[5], d13[5]}, [RGB]!
1345 .elseif \size == 1
1346 vst4.8 {d10[6], d11[6], d12[6], d13[6]}, [RGB]!
1347 .else
1348 .error unsupported macroblock size
1349 .endif
1350 .elseif \bpp == 16
1351 .if \size == 8
1352 vst1.16 {q15}, [RGB]!
1353 .elseif \size == 4
1354 vst1.16 {d30}, [RGB]!
1355 .elseif \size == 2
1356 vst1.16 {d31[0]}, [RGB]!
1357 vst1.16 {d31[1]}, [RGB]!
1358 .elseif \size == 1
1359 vst1.16 {d31[2]}, [RGB]!
1360 .else
1361 .error unsupported macroblock size
1362 .endif
1363 .else 1334 .else
1364 .error unsupported bpp 1335 .error unsupported macroblock size
1365 .endif 1336 .endif
1337 .elseif \bpp == 32
1338 .if \size == 8
1339 vst4.8 {d10, d11, d12, d13}, [RGB]!
1340 .elseif \size == 4
1341 vst4.8 {d10[0], d11[0], d12[0], d13[0]}, [RGB]!
1342 vst4.8 {d10[1], d11[1], d12[1], d13[1]}, [RGB]!
1343 vst4.8 {d10[2], d11[2], d12[2], d13[2]}, [RGB]!
1344 vst4.8 {d10[3], d11[3], d12[3], d13[3]}, [RGB]!
1345 .elseif \size == 2
1346 vst4.8 {d10[4], d11[4], d12[4], d13[4]}, [RGB]!
1347 vst4.8 {d10[5], d11[5], d12[5], d13[5]}, [RGB]!
1348 .elseif \size == 1
1349 vst4.8 {d10[6], d11[6], d12[6], d13[6]}, [RGB]!
1350 .else
1351 .error unsupported macroblock size
1352 .endif
1353 .elseif \bpp == 16
1354 .if \size == 8
1355 vst1.16 {q15}, [RGB]!
1356 .elseif \size == 4
1357 vst1.16 {d30}, [RGB]!
1358 .elseif \size == 2
1359 vst1.16 {d31[0]}, [RGB]!
1360 vst1.16 {d31[1]}, [RGB]!
1361 .elseif \size == 1
1362 vst1.16 {d31[2]}, [RGB]!
1363 .else
1364 .error unsupported macroblock size
1365 .endif
1366 .else
1367 .error unsupported bpp
1368 .endif
1366 .endm 1369 .endm
1367 1370
1368 .macro generate_jsimd_ycc_rgb_convert_neon colorid, bpp, r_offs, g_offs, b_offs 1371 .macro generate_jsimd_ycc_rgb_convert_neon colorid, bpp, r_offs, g_offs, b_offs
1369 1372
1370 /* 1373 /*
1371 * 2 stage pipelined YCbCr->RGB conversion 1374 * 2-stage pipelined YCbCr->RGB conversion
1372 */ 1375 */
1373 1376
1374 .macro do_yuv_to_rgb_stage1 1377 .macro do_yuv_to_rgb_stage1
1375 vaddw.u8 q3, q1, d4 /* q3 = u - 128 */ 1378 vaddw.u8 q3, q1, d4 /* q3 = u - 128 */
1376 vaddw.u8 q4, q1, d5 /* q2 = v - 128 */ 1379 vaddw.u8 q4, q1, d5 /* q2 = v - 128 */
1377 vmull.s16 q10, d6, d1[1] /* multiply by -11277 */ 1380 vmull.s16 q10, d6, d1[1] /* multiply by -11277 */
1378 vmlal.s16 q10, d8, d1[2] /* multiply by -23401 */ 1381 vmlal.s16 q10, d8, d1[2] /* multiply by -23401 */
1379 vmull.s16 q11, d7, d1[1] /* multiply by -11277 */ 1382 vmull.s16 q11, d7, d1[1] /* multiply by -11277 */
1380 vmlal.s16 q11, d9, d1[2] /* multiply by -23401 */ 1383 vmlal.s16 q11, d9, d1[2] /* multiply by -23401 */
1381 vmull.s16 q12, d8, d1[0] /* multiply by 22971 */ 1384 vmull.s16 q12, d8, d1[0] /* multiply by 22971 */
1382 vmull.s16 q13, d9, d1[0] /* multiply by 22971 */ 1385 vmull.s16 q13, d9, d1[0] /* multiply by 22971 */
1383 vmull.s16 q14, d6, d1[3] /* multiply by 29033 */ 1386 vmull.s16 q14, d6, d1[3] /* multiply by 29033 */
1384 vmull.s16 q15, d7, d1[3] /* multiply by 29033 */ 1387 vmull.s16 q15, d7, d1[3] /* multiply by 29033 */
1385 .endm 1388 .endm
1386 1389
1387 .macro do_yuv_to_rgb_stage2 1390 .macro do_yuv_to_rgb_stage2
1388 vrshrn.s32 d20, q10, #15 1391 vrshrn.s32 d20, q10, #15
1389 vrshrn.s32 d21, q11, #15 1392 vrshrn.s32 d21, q11, #15
1390 vrshrn.s32 d24, q12, #14 1393 vrshrn.s32 d24, q12, #14
1391 vrshrn.s32 d25, q13, #14 1394 vrshrn.s32 d25, q13, #14
1392 vrshrn.s32 d28, q14, #14 1395 vrshrn.s32 d28, q14, #14
1393 vrshrn.s32 d29, q15, #14 1396 vrshrn.s32 d29, q15, #14
1394 vaddw.u8 q11, q10, d0 1397 vaddw.u8 q11, q10, d0
1395 vaddw.u8 q12, q12, d0 1398 vaddw.u8 q12, q12, d0
1396 vaddw.u8 q14, q14, d0 1399 vaddw.u8 q14, q14, d0
1397 .if \bpp != 16 1400 .if \bpp != 16
1398 vqmovun.s16 d1\g_offs, q11 1401 vqmovun.s16 d1\g_offs, q11
1399 vqmovun.s16 d1\r_offs, q12 1402 vqmovun.s16 d1\r_offs, q12
1400 vqmovun.s16 d1\b_offs, q14 1403 vqmovun.s16 d1\b_offs, q14
1401 .else /* rgb565 */ 1404 .else /* rgb565 */
1402 vqshlu.s16 q13, q11, #8 1405 vqshlu.s16 q13, q11, #8
1403 vqshlu.s16 q15, q12, #8 1406 vqshlu.s16 q15, q12, #8
1404 vqshlu.s16 q14, q14, #8 1407 vqshlu.s16 q14, q14, #8
1405 vsri.u16 q15, q13, #5 1408 vsri.u16 q15, q13, #5
1406 vsri.u16 q15, q14, #11 1409 vsri.u16 q15, q14, #11
1407 .endif 1410 .endif
1408 .endm 1411 .endm
1409 1412
1410 .macro do_yuv_to_rgb_stage2_store_load_stage1 1413 .macro do_yuv_to_rgb_stage2_store_load_stage1
1411 /* "do_yuv_to_rgb_stage2" and "store" */ 1414 /* "do_yuv_to_rgb_stage2" and "store" */
1412 vrshrn.s32 d20, q10, #15 1415 vrshrn.s32 d20, q10, #15
1413 /* "load" and "do_yuv_to_rgb_stage1" */ 1416 /* "load" and "do_yuv_to_rgb_stage1" */
1414 pld [U, #64] 1417 pld [U, #64]
1415 vrshrn.s32 d21, q11, #15 1418 vrshrn.s32 d21, q11, #15
1416 pld [V, #64] 1419 pld [V, #64]
1417 vrshrn.s32 d24, q12, #14 1420 vrshrn.s32 d24, q12, #14
1418 vrshrn.s32 d25, q13, #14 1421 vrshrn.s32 d25, q13, #14
1419 vld1.8 {d4}, [U, :64]! 1422 vld1.8 {d4}, [U, :64]!
1420 vrshrn.s32 d28, q14, #14 1423 vrshrn.s32 d28, q14, #14
1421 vld1.8 {d5}, [V, :64]! 1424 vld1.8 {d5}, [V, :64]!
1422 vrshrn.s32 d29, q15, #14 1425 vrshrn.s32 d29, q15, #14
1423 vaddw.u8 q3, q1, d4 /* q3 = u - 128 */ 1426 vaddw.u8 q3, q1, d4 /* q3 = u - 128 */
1424 vaddw.u8 q4, q1, d5 /* q2 = v - 128 */ 1427 vaddw.u8 q4, q1, d5 /* q2 = v - 128 */
1425 vaddw.u8 q11, q10, d0 1428 vaddw.u8 q11, q10, d0
1426 vmull.s16 q10, d6, d1[1] /* multiply by -11277 */ 1429 vmull.s16 q10, d6, d1[1] /* multiply by -11277 */
1427 vmlal.s16 q10, d8, d1[2] /* multiply by -23401 */ 1430 vmlal.s16 q10, d8, d1[2] /* multiply by -23401 */
1428 vaddw.u8 q12, q12, d0 1431 vaddw.u8 q12, q12, d0
1429 vaddw.u8 q14, q14, d0 1432 vaddw.u8 q14, q14, d0
1430 .if \bpp != 16 /**************** rgb24/rgb32 *********************************/ 1433 .if \bpp != 16 /**************** rgb24/rgb32 ******************************/
1431 vqmovun.s16 d1\g_offs, q11 1434 vqmovun.s16 d1\g_offs, q11
1432 pld [Y, #64] 1435 pld [Y, #64]
1433 vqmovun.s16 d1\r_offs, q12 1436 vqmovun.s16 d1\r_offs, q12
1434 vld1.8 {d0}, [Y, :64]! 1437 vld1.8 {d0}, [Y, :64]!
1435 vqmovun.s16 d1\b_offs, q14 1438 vqmovun.s16 d1\b_offs, q14
1436 vmull.s16 q11, d7, d1[1] /* multiply by -11277 */ 1439 vmull.s16 q11, d7, d1[1] /* multiply by -11277 */
1437 vmlal.s16 q11, d9, d1[2] /* multiply by -23401 */ 1440 vmlal.s16 q11, d9, d1[2] /* multiply by -23401 */
1438 do_store \bpp, 8 1441 do_store \bpp, 8
1439 vmull.s16 q12, d8, d1[0] /* multiply by 22971 */ 1442 vmull.s16 q12, d8, d1[0] /* multiply by 22971 */
1440 vmull.s16 q13, d9, d1[0] /* multiply by 22971 */ 1443 vmull.s16 q13, d9, d1[0] /* multiply by 22971 */
1441 vmull.s16 q14, d6, d1[3] /* multiply by 29033 */ 1444 vmull.s16 q14, d6, d1[3] /* multiply by 29033 */
1442 vmull.s16 q15, d7, d1[3] /* multiply by 29033 */ 1445 vmull.s16 q15, d7, d1[3] /* multiply by 29033 */
1443 .else /**************************** rgb565 ***********************************/ 1446 .else /**************************** rgb565 ********************************/
1444 vqshlu.s16 q13, q11, #8 1447 vqshlu.s16 q13, q11, #8
1445 pld [Y, #64] 1448 pld [Y, #64]
1446 vqshlu.s16 q15, q12, #8 1449 vqshlu.s16 q15, q12, #8
1447 vqshlu.s16 q14, q14, #8 1450 vqshlu.s16 q14, q14, #8
1448 vld1.8 {d0}, [Y, :64]! 1451 vld1.8 {d0}, [Y, :64]!
1449 vmull.s16 q11, d7, d1[1] 1452 vmull.s16 q11, d7, d1[1]
1450 vmlal.s16 q11, d9, d1[2] 1453 vmlal.s16 q11, d9, d1[2]
1451 vsri.u16 q15, q13, #5 1454 vsri.u16 q15, q13, #5
1452 vmull.s16 q12, d8, d1[0] 1455 vmull.s16 q12, d8, d1[0]
1453 vsri.u16 q15, q14, #11 1456 vsri.u16 q15, q14, #11
1454 vmull.s16 q13, d9, d1[0] 1457 vmull.s16 q13, d9, d1[0]
1455 vmull.s16 q14, d6, d1[3] 1458 vmull.s16 q14, d6, d1[3]
1456 do_store \bpp, 8 1459 do_store \bpp, 8
1457 vmull.s16 q15, d7, d1[3] 1460 vmull.s16 q15, d7, d1[3]
1458 .endif 1461 .endif
1459 .endm 1462 .endm
1460 1463
1461 .macro do_yuv_to_rgb 1464 .macro do_yuv_to_rgb
1462 do_yuv_to_rgb_stage1 1465 do_yuv_to_rgb_stage1
1463 do_yuv_to_rgb_stage2 1466 do_yuv_to_rgb_stage2
1464 .endm 1467 .endm
1465 1468
1466 /* Apple gas crashes on adrl, work around that by using adr. 1469 /* Apple gas crashes on adrl, work around that by using adr.
1467 * But this requires a copy of these constants for each function. 1470 * But this requires a copy of these constants for each function.
1468 */ 1471 */
1469 1472
1470 .balign 16 1473 .balign 16
1471 jsimd_ycc_\colorid\()_neon_consts: 1474 jsimd_ycc_\colorid\()_neon_consts:
1472 .short 0, 0, 0, 0 1475 .short 0, 0, 0, 0
1473 .short 22971, -11277, -23401, 29033 1476 .short 22971, -11277, -23401, 29033
1474 .short -128, -128, -128, -128 1477 .short -128, -128, -128, -128
1475 .short -128, -128, -128, -128 1478 .short -128, -128, -128, -128
1476 1479
1477 asm_function jsimd_ycc_\colorid\()_convert_neon 1480 asm_function jsimd_ycc_\colorid\()_convert_neon
1478 OUTPUT_WIDTH .req r0 1481 OUTPUT_WIDTH .req r0
1479 INPUT_BUF .req r1 1482 INPUT_BUF .req r1
1480 INPUT_ROW .req r2 1483 INPUT_ROW .req r2
1481 OUTPUT_BUF .req r3 1484 OUTPUT_BUF .req r3
1482 NUM_ROWS .req r4 1485 NUM_ROWS .req r4
1483 1486
1484 INPUT_BUF0 .req r5 1487 INPUT_BUF0 .req r5
1485 INPUT_BUF1 .req r6 1488 INPUT_BUF1 .req r6
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
1610 * jsimd_extbgr_ycc_convert_neon 1613 * jsimd_extbgr_ycc_convert_neon
1611 * jsimd_extrgbx_ycc_convert_neon 1614 * jsimd_extrgbx_ycc_convert_neon
1612 * jsimd_extbgrx_ycc_convert_neon 1615 * jsimd_extbgrx_ycc_convert_neon
1613 * jsimd_extxbgr_ycc_convert_neon 1616 * jsimd_extxbgr_ycc_convert_neon
1614 * jsimd_extxrgb_ycc_convert_neon 1617 * jsimd_extxrgb_ycc_convert_neon
1615 * 1618 *
1616 * Colorspace conversion RGB -> YCbCr 1619 * Colorspace conversion RGB -> YCbCr
1617 */ 1620 */
1618 1621
1619 .macro do_store size 1622 .macro do_store size
1620 .if \size == 8 1623 .if \size == 8
1621 vst1.8 {d20}, [Y]! 1624 vst1.8 {d20}, [Y]!
1622 vst1.8 {d21}, [U]! 1625 vst1.8 {d21}, [U]!
1623 vst1.8 {d22}, [V]! 1626 vst1.8 {d22}, [V]!
1624 .elseif \size == 4 1627 .elseif \size == 4
1625 vst1.8 {d20[0]}, [Y]! 1628 vst1.8 {d20[0]}, [Y]!
1626 vst1.8 {d20[1]}, [Y]! 1629 vst1.8 {d20[1]}, [Y]!
1627 vst1.8 {d20[2]}, [Y]! 1630 vst1.8 {d20[2]}, [Y]!
1628 vst1.8 {d20[3]}, [Y]! 1631 vst1.8 {d20[3]}, [Y]!
1629 vst1.8 {d21[0]}, [U]! 1632 vst1.8 {d21[0]}, [U]!
1630 vst1.8 {d21[1]}, [U]! 1633 vst1.8 {d21[1]}, [U]!
1631 vst1.8 {d21[2]}, [U]! 1634 vst1.8 {d21[2]}, [U]!
1632 vst1.8 {d21[3]}, [U]! 1635 vst1.8 {d21[3]}, [U]!
1633 vst1.8 {d22[0]}, [V]! 1636 vst1.8 {d22[0]}, [V]!
1634 vst1.8 {d22[1]}, [V]! 1637 vst1.8 {d22[1]}, [V]!
1635 vst1.8 {d22[2]}, [V]! 1638 vst1.8 {d22[2]}, [V]!
1636 vst1.8 {d22[3]}, [V]! 1639 vst1.8 {d22[3]}, [V]!
1637 .elseif \size == 2 1640 .elseif \size == 2
1638 vst1.8 {d20[4]}, [Y]! 1641 vst1.8 {d20[4]}, [Y]!
1639 vst1.8 {d20[5]}, [Y]! 1642 vst1.8 {d20[5]}, [Y]!
1640 vst1.8 {d21[4]}, [U]! 1643 vst1.8 {d21[4]}, [U]!
1641 vst1.8 {d21[5]}, [U]! 1644 vst1.8 {d21[5]}, [U]!
1642 vst1.8 {d22[4]}, [V]! 1645 vst1.8 {d22[4]}, [V]!
1643 vst1.8 {d22[5]}, [V]! 1646 vst1.8 {d22[5]}, [V]!
1644 .elseif \size == 1 1647 .elseif \size == 1
1645 vst1.8 {d20[6]}, [Y]! 1648 vst1.8 {d20[6]}, [Y]!
1646 vst1.8 {d21[6]}, [U]! 1649 vst1.8 {d21[6]}, [U]!
1647 vst1.8 {d22[6]}, [V]! 1650 vst1.8 {d22[6]}, [V]!
1648 .else 1651 .else
1649 .error unsupported macroblock size 1652 .error unsupported macroblock size
1650 .endif 1653 .endif
1651 .endm 1654 .endm
1652 1655
1653 .macro do_load bpp, size 1656 .macro do_load bpp, size
1654 .if \bpp == 24 1657 .if \bpp == 24
1655 .if \size == 8 1658 .if \size == 8
1656 vld3.8 {d10, d11, d12}, [RGB]! 1659 vld3.8 {d10, d11, d12}, [RGB]!
1657 pld [RGB, #128] 1660 pld [RGB, #128]
1658 .elseif \size == 4 1661 .elseif \size == 4
1659 vld3.8 {d10[0], d11[0], d12[0]}, [RGB]! 1662 vld3.8 {d10[0], d11[0], d12[0]}, [RGB]!
1660 vld3.8 {d10[1], d11[1], d12[1]}, [RGB]! 1663 vld3.8 {d10[1], d11[1], d12[1]}, [RGB]!
1661 vld3.8 {d10[2], d11[2], d12[2]}, [RGB]! 1664 vld3.8 {d10[2], d11[2], d12[2]}, [RGB]!
1662 vld3.8 {d10[3], d11[3], d12[3]}, [RGB]! 1665 vld3.8 {d10[3], d11[3], d12[3]}, [RGB]!
1663 .elseif \size == 2 1666 .elseif \size == 2
1664 vld3.8 {d10[4], d11[4], d12[4]}, [RGB]! 1667 vld3.8 {d10[4], d11[4], d12[4]}, [RGB]!
1665 vld3.8 {d10[5], d11[5], d12[5]}, [RGB]! 1668 vld3.8 {d10[5], d11[5], d12[5]}, [RGB]!
1666 .elseif \size == 1 1669 .elseif \size == 1
1667 vld3.8 {d10[6], d11[6], d12[6]}, [RGB]! 1670 vld3.8 {d10[6], d11[6], d12[6]}, [RGB]!
1668 .else
1669 .error unsupported macroblock size
1670 .endif
1671 .elseif \bpp == 32
1672 .if \size == 8
1673 vld4.8 {d10, d11, d12, d13}, [RGB]!
1674 pld [RGB, #128]
1675 .elseif \size == 4
1676 vld4.8 {d10[0], d11[0], d12[0], d13[0]}, [RGB]!
1677 vld4.8 {d10[1], d11[1], d12[1], d13[1]}, [RGB]!
1678 vld4.8 {d10[2], d11[2], d12[2], d13[2]}, [RGB]!
1679 vld4.8 {d10[3], d11[3], d12[3], d13[3]}, [RGB]!
1680 .elseif \size == 2
1681 vld4.8 {d10[4], d11[4], d12[4], d13[4]}, [RGB]!
1682 vld4.8 {d10[5], d11[5], d12[5], d13[5]}, [RGB]!
1683 .elseif \size == 1
1684 vld4.8 {d10[6], d11[6], d12[6], d13[6]}, [RGB]!
1685 .else
1686 .error unsupported macroblock size
1687 .endif
1688 .else 1671 .else
1689 .error unsupported bpp 1672 .error unsupported macroblock size
1690 .endif 1673 .endif
1674 .elseif \bpp == 32
1675 .if \size == 8
1676 vld4.8 {d10, d11, d12, d13}, [RGB]!
1677 pld [RGB, #128]
1678 .elseif \size == 4
1679 vld4.8 {d10[0], d11[0], d12[0], d13[0]}, [RGB]!
1680 vld4.8 {d10[1], d11[1], d12[1], d13[1]}, [RGB]!
1681 vld4.8 {d10[2], d11[2], d12[2], d13[2]}, [RGB]!
1682 vld4.8 {d10[3], d11[3], d12[3], d13[3]}, [RGB]!
1683 .elseif \size == 2
1684 vld4.8 {d10[4], d11[4], d12[4], d13[4]}, [RGB]!
1685 vld4.8 {d10[5], d11[5], d12[5], d13[5]}, [RGB]!
1686 .elseif \size == 1
1687 vld4.8 {d10[6], d11[6], d12[6], d13[6]}, [RGB]!
1688 .else
1689 .error unsupported macroblock size
1690 .endif
1691 .else
1692 .error unsupported bpp
1693 .endif
1691 .endm 1694 .endm
1692 1695
1693 .macro generate_jsimd_rgb_ycc_convert_neon colorid, bpp, r_offs, g_offs, b_offs 1696 .macro generate_jsimd_rgb_ycc_convert_neon colorid, bpp, r_offs, g_offs, b_offs
1694 1697
1695 /* 1698 /*
1696 * 2 stage pipelined RGB->YCbCr conversion 1699 * 2-stage pipelined RGB->YCbCr conversion
1697 */ 1700 */
1698 1701
1699 .macro do_rgb_to_yuv_stage1 1702 .macro do_rgb_to_yuv_stage1
1700 vmovl.u8 q2, d1\r_offs /* r = { d4, d5 } */ 1703 vmovl.u8 q2, d1\r_offs /* r = { d4, d5 } */
1701 vmovl.u8 q3, d1\g_offs /* g = { d6, d7 } */ 1704 vmovl.u8 q3, d1\g_offs /* g = { d6, d7 } */
1702 vmovl.u8 q4, d1\b_offs /* b = { d8, d9 } */ 1705 vmovl.u8 q4, d1\b_offs /* b = { d8, d9 } */
1703 vmull.u16 q7, d4, d0[0] 1706 vmull.u16 q7, d4, d0[0]
1704 vmlal.u16 q7, d6, d0[1] 1707 vmlal.u16 q7, d6, d0[1]
1705 vmlal.u16 q7, d8, d0[2] 1708 vmlal.u16 q7, d8, d0[2]
1706 vmull.u16 q8, d5, d0[0] 1709 vmull.u16 q8, d5, d0[0]
1707 vmlal.u16 q8, d7, d0[1] 1710 vmlal.u16 q8, d7, d0[1]
1708 vmlal.u16 q8, d9, d0[2] 1711 vmlal.u16 q8, d9, d0[2]
1709 vrev64.32 q9, q1 1712 vrev64.32 q9, q1
1710 vrev64.32 q13, q1 1713 vrev64.32 q13, q1
1711 vmlsl.u16 q9, d4, d0[3] 1714 vmlsl.u16 q9, d4, d0[3]
1712 vmlsl.u16 q9, d6, d1[0] 1715 vmlsl.u16 q9, d6, d1[0]
1713 vmlal.u16 q9, d8, d1[1] 1716 vmlal.u16 q9, d8, d1[1]
1714 vmlsl.u16 q13, d5, d0[3] 1717 vmlsl.u16 q13, d5, d0[3]
1715 vmlsl.u16 q13, d7, d1[0] 1718 vmlsl.u16 q13, d7, d1[0]
1716 vmlal.u16 q13, d9, d1[1] 1719 vmlal.u16 q13, d9, d1[1]
1717 vrev64.32 q14, q1 1720 vrev64.32 q14, q1
1718 vrev64.32 q15, q1 1721 vrev64.32 q15, q1
1719 vmlal.u16 q14, d4, d1[1] 1722 vmlal.u16 q14, d4, d1[1]
1720 vmlsl.u16 q14, d6, d1[2] 1723 vmlsl.u16 q14, d6, d1[2]
1721 vmlsl.u16 q14, d8, d1[3] 1724 vmlsl.u16 q14, d8, d1[3]
1722 vmlal.u16 q15, d5, d1[1] 1725 vmlal.u16 q15, d5, d1[1]
1723 vmlsl.u16 q15, d7, d1[2] 1726 vmlsl.u16 q15, d7, d1[2]
1724 vmlsl.u16 q15, d9, d1[3] 1727 vmlsl.u16 q15, d9, d1[3]
1725 .endm 1728 .endm
1726 1729
1727 .macro do_rgb_to_yuv_stage2 1730 .macro do_rgb_to_yuv_stage2
1728 vrshrn.u32 d20, q7, #16 1731 vrshrn.u32 d20, q7, #16
1729 vrshrn.u32 d21, q8, #16 1732 vrshrn.u32 d21, q8, #16
1730 vshrn.u32 d22, q9, #16 1733 vshrn.u32 d22, q9, #16
1731 vshrn.u32 d23, q13, #16 1734 vshrn.u32 d23, q13, #16
1732 vshrn.u32 d24, q14, #16 1735 vshrn.u32 d24, q14, #16
1733 vshrn.u32 d25, q15, #16 1736 vshrn.u32 d25, q15, #16
1734 vmovn.u16 d20, q10 /* d20 = y */ 1737 vmovn.u16 d20, q10 /* d20 = y */
1735 vmovn.u16 d21, q11 /* d21 = u */ 1738 vmovn.u16 d21, q11 /* d21 = u */
1736 vmovn.u16 d22, q12 /* d22 = v */ 1739 vmovn.u16 d22, q12 /* d22 = v */
1737 .endm 1740 .endm
1738 1741
1739 .macro do_rgb_to_yuv 1742 .macro do_rgb_to_yuv
1740 do_rgb_to_yuv_stage1 1743 do_rgb_to_yuv_stage1
1741 do_rgb_to_yuv_stage2 1744 do_rgb_to_yuv_stage2
1742 .endm 1745 .endm
1743 1746
1744 .macro do_rgb_to_yuv_stage2_store_load_stage1 1747 .macro do_rgb_to_yuv_stage2_store_load_stage1
1745 vrshrn.u32 d20, q7, #16 1748 vrshrn.u32 d20, q7, #16
1746 vrshrn.u32 d21, q8, #16 1749 vrshrn.u32 d21, q8, #16
1747 vshrn.u32 d22, q9, #16 1750 vshrn.u32 d22, q9, #16
1748 vrev64.32 q9, q1 1751 vrev64.32 q9, q1
1749 vshrn.u32 d23, q13, #16 1752 vshrn.u32 d23, q13, #16
1750 vrev64.32 q13, q1 1753 vrev64.32 q13, q1
1751 vshrn.u32 d24, q14, #16 1754 vshrn.u32 d24, q14, #16
1752 vshrn.u32 d25, q15, #16 1755 vshrn.u32 d25, q15, #16
1753 do_load \bpp, 8 1756 do_load \bpp, 8
1754 vmovn.u16 d20, q10 /* d20 = y */ 1757 vmovn.u16 d20, q10 /* d20 = y */
1755 vmovl.u8 q2, d1\r_offs /* r = { d4, d5 } */ 1758 vmovl.u8 q2, d1\r_offs /* r = { d4, d5 } */
1756 vmovn.u16 d21, q11 /* d21 = u */ 1759 vmovn.u16 d21, q11 /* d21 = u */
1757 vmovl.u8 q3, d1\g_offs /* g = { d6, d7 } */ 1760 vmovl.u8 q3, d1\g_offs /* g = { d6, d7 } */
1758 vmovn.u16 d22, q12 /* d22 = v */ 1761 vmovn.u16 d22, q12 /* d22 = v */
1759 vmovl.u8 q4, d1\b_offs /* b = { d8, d9 } */ 1762 vmovl.u8 q4, d1\b_offs /* b = { d8, d9 } */
1760 vmull.u16 q7, d4, d0[0] 1763 vmull.u16 q7, d4, d0[0]
1761 vmlal.u16 q7, d6, d0[1] 1764 vmlal.u16 q7, d6, d0[1]
1762 vmlal.u16 q7, d8, d0[2] 1765 vmlal.u16 q7, d8, d0[2]
1763 vst1.8 {d20}, [Y]! 1766 vst1.8 {d20}, [Y]!
1764 vmull.u16 q8, d5, d0[0] 1767 vmull.u16 q8, d5, d0[0]
1765 vmlal.u16 q8, d7, d0[1] 1768 vmlal.u16 q8, d7, d0[1]
1766 vmlal.u16 q8, d9, d0[2] 1769 vmlal.u16 q8, d9, d0[2]
1767 vmlsl.u16 q9, d4, d0[3] 1770 vmlsl.u16 q9, d4, d0[3]
1768 vmlsl.u16 q9, d6, d1[0] 1771 vmlsl.u16 q9, d6, d1[0]
1769 vmlal.u16 q9, d8, d1[1] 1772 vmlal.u16 q9, d8, d1[1]
1770 vst1.8 {d21}, [U]! 1773 vst1.8 {d21}, [U]!
1771 vmlsl.u16 q13, d5, d0[3] 1774 vmlsl.u16 q13, d5, d0[3]
1772 vmlsl.u16 q13, d7, d1[0] 1775 vmlsl.u16 q13, d7, d1[0]
1773 vmlal.u16 q13, d9, d1[1] 1776 vmlal.u16 q13, d9, d1[1]
1774 vrev64.32 q14, q1 1777 vrev64.32 q14, q1
1775 vrev64.32 q15, q1 1778 vrev64.32 q15, q1
1776 vmlal.u16 q14, d4, d1[1] 1779 vmlal.u16 q14, d4, d1[1]
1777 vmlsl.u16 q14, d6, d1[2] 1780 vmlsl.u16 q14, d6, d1[2]
1778 vmlsl.u16 q14, d8, d1[3] 1781 vmlsl.u16 q14, d8, d1[3]
1779 vst1.8 {d22}, [V]! 1782 vst1.8 {d22}, [V]!
1780 vmlal.u16 q15, d5, d1[1] 1783 vmlal.u16 q15, d5, d1[1]
1781 vmlsl.u16 q15, d7, d1[2] 1784 vmlsl.u16 q15, d7, d1[2]
1782 vmlsl.u16 q15, d9, d1[3] 1785 vmlsl.u16 q15, d9, d1[3]
1783 .endm 1786 .endm
1784 1787
1785 .balign 16 1788 .balign 16
1786 jsimd_\colorid\()_ycc_neon_consts: 1789 jsimd_\colorid\()_ycc_neon_consts:
1787 .short 19595, 38470, 7471, 11059 1790 .short 19595, 38470, 7471, 11059
1788 .short 21709, 32768, 27439, 5329 1791 .short 21709, 32768, 27439, 5329
1789 .short 32767, 128, 32767, 128 1792 .short 32767, 128, 32767, 128
1790 .short 32767, 128, 32767, 128 1793 .short 32767, 128, 32767, 128
1791 1794
1792 asm_function jsimd_\colorid\()_ycc_convert_neon 1795 asm_function jsimd_\colorid\()_ycc_convert_neon
1793 OUTPUT_WIDTH .req r0 1796 OUTPUT_WIDTH .req r0
1794 INPUT_BUF .req r1 1797 INPUT_BUF .req r1
1795 OUTPUT_BUF .req r2 1798 OUTPUT_BUF .req r2
1796 OUTPUT_ROW .req r3 1799 OUTPUT_ROW .req r3
1797 NUM_ROWS .req r4 1800 NUM_ROWS .req r4
1798 1801
1799 OUTPUT_BUF0 .req r5 1802 OUTPUT_BUF0 .req r5
1800 OUTPUT_BUF1 .req r6 1803 OUTPUT_BUF1 .req r6
(...skipping 189 matching lines...) Expand 10 before | Expand all | Expand 10 after
1990 * rid of a bunch of VLD1.16 instructions 1993 * rid of a bunch of VLD1.16 instructions
1991 */ 1994 */
1992 1995
1993 #define XFIX_0_382683433 d0[0] 1996 #define XFIX_0_382683433 d0[0]
1994 #define XFIX_0_541196100 d0[1] 1997 #define XFIX_0_541196100 d0[1]
1995 #define XFIX_0_707106781 d0[2] 1998 #define XFIX_0_707106781 d0[2]
1996 #define XFIX_1_306562965 d0[3] 1999 #define XFIX_1_306562965 d0[3]
1997 2000
1998 .balign 16 2001 .balign 16
1999 jsimd_fdct_ifast_neon_consts: 2002 jsimd_fdct_ifast_neon_consts:
2000 .short (98 * 128) /* XFIX_0_382683433 */ 2003 .short (98 * 128) /* XFIX_0_382683433 */
2001 .short (139 * 128) /* XFIX_0_541196100 */ 2004 .short (139 * 128) /* XFIX_0_541196100 */
2002 .short (181 * 128) /* XFIX_0_707106781 */ 2005 .short (181 * 128) /* XFIX_0_707106781 */
2003 .short (334 * 128 - 256 * 128) /* XFIX_1_306562965 */ 2006 .short (334 * 128 - 256 * 128) /* XFIX_1_306562965 */
2004 2007
2005 asm_function jsimd_fdct_ifast_neon 2008 asm_function jsimd_fdct_ifast_neon
2006 2009
2007 DATA .req r0 2010 DATA .req r0
2008 TMP .req ip 2011 TMP .req ip
2009 2012
2010 vpush {d8-d15} 2013 vpush {d8-d15}
2011 2014
2012 /* Load constants */ 2015 /* Load constants */
2013 adr TMP, jsimd_fdct_ifast_neon_consts 2016 adr TMP, jsimd_fdct_ifast_neon_consts
(...skipping 16 matching lines...) Expand all
2030 vld1.16 {d20, d21, d22, d23}, [DATA, :128]! 2033 vld1.16 {d20, d21, d22, d23}, [DATA, :128]!
2031 vld1.16 {d24, d25, d26, d27}, [DATA, :128]! 2034 vld1.16 {d24, d25, d26, d27}, [DATA, :128]!
2032 vld1.16 {d28, d29, d30, d31}, [DATA, :128] 2035 vld1.16 {d28, d29, d30, d31}, [DATA, :128]
2033 sub DATA, DATA, #(128 - 32) 2036 sub DATA, DATA, #(128 - 32)
2034 2037
2035 mov TMP, #2 2038 mov TMP, #2
2036 1: 2039 1:
2037 /* Transpose */ 2040 /* Transpose */
2038 vtrn.16 q12, q13 2041 vtrn.16 q12, q13
2039 vtrn.16 q10, q11 2042 vtrn.16 q10, q11
2040 vtrn.16 q8, q9 2043 vtrn.16 q8, q9
2041 vtrn.16 q14, q15 2044 vtrn.16 q14, q15
2042 vtrn.32 q9, q11 2045 vtrn.32 q9, q11
2043 vtrn.32 q13, q15 2046 vtrn.32 q13, q15
2044 vtrn.32 q8, q10 2047 vtrn.32 q8, q10
2045 vtrn.32 q12, q14 2048 vtrn.32 q12, q14
2046 vswp d30, d23 2049 vswp d30, d23
2047 vswp d24, d17 2050 vswp d24, d17
2048 vswp d26, d19 2051 vswp d26, d19
2049 /* 1-D FDCT */ 2052 /* 1-D FDCT */
2050 vadd.s16 q2, q11, q12 2053 vadd.s16 q2, q11, q12
2051 vswp d28, d21 2054 vswp d28, d21
2052 vsub.s16 q12, q11, q12 2055 vsub.s16 q12, q11, q12
2053 vsub.s16 q6, q10, q13 2056 vsub.s16 q6, q10, q13
2054 vadd.s16 q10, q10, q13 2057 vadd.s16 q10, q10, q13
2055 vsub.s16 q7, q9, q14 2058 vsub.s16 q7, q9, q14
2056 vadd.s16 q9, q9, q14 2059 vadd.s16 q9, q9, q14
2057 vsub.s16 q1, q8, q15 2060 vsub.s16 q1, q8, q15
2058 vadd.s16 q8, q8, q15 2061 vadd.s16 q8, q8, q15
2059 vsub.s16 q4, q9, q10 2062 vsub.s16 q4, q9, q10
2060 vsub.s16 q5, q8, q2 2063 vsub.s16 q5, q8, q2
2061 vadd.s16 q3, q9, q10 2064 vadd.s16 q3, q9, q10
2062 vadd.s16 q4, q4, q5 2065 vadd.s16 q4, q4, q5
2063 vadd.s16 q2, q8, q2 2066 vadd.s16 q2, q8, q2
2064 vqdmulh.s16 q4, q4, XFIX_0_707106781 2067 vqdmulh.s16 q4, q4, XFIX_0_707106781
2065 vadd.s16 q11, q12, q6 2068 vadd.s16 q11, q12, q6
2066 vadd.s16 q8, q2, q3 2069 vadd.s16 q8, q2, q3
2067 vsub.s16 q12, q2, q3 2070 vsub.s16 q12, q2, q3
2068 vadd.s16 q3, q6, q7 2071 vadd.s16 q3, q6, q7
2069 vadd.s16 q7, q7, q1 2072 vadd.s16 q7, q7, q1
2070 vqdmulh.s16 q3, q3, XFIX_0_707106781 2073 vqdmulh.s16 q3, q3, XFIX_0_707106781
2071 vsub.s16 q6, q11, q7 2074 vsub.s16 q6, q11, q7
2072 vadd.s16 q10, q5, q4 2075 vadd.s16 q10, q5, q4
2073 vqdmulh.s16 q6, q6, XFIX_0_382683433 2076 vqdmulh.s16 q6, q6, XFIX_0_382683433
2074 vsub.s16 q14, q5, q4 2077 vsub.s16 q14, q5, q4
2075 vqdmulh.s16 q11, q11, XFIX_0_541196100 2078 vqdmulh.s16 q11, q11, XFIX_0_541196100
2076 vqdmulh.s16 q5, q7, XFIX_1_306562965 2079 vqdmulh.s16 q5, q7, XFIX_1_306562965
2077 vadd.s16 q4, q1, q3 2080 vadd.s16 q4, q1, q3
2078 vsub.s16 q3, q1, q3 2081 vsub.s16 q3, q1, q3
2079 vadd.s16 q7, q7, q6 2082 vadd.s16 q7, q7, q6
2080 vadd.s16 q11, q11, q6 2083 vadd.s16 q11, q11, q6
2081 vadd.s16 q7, q7, q5 2084 vadd.s16 q7, q7, q5
2082 vadd.s16 q13, q3, q11 2085 vadd.s16 q13, q3, q11
2083 vsub.s16 q11, q3, q11 2086 vsub.s16 q11, q3, q11
2084 vadd.s16 q9, q4, q7 2087 vadd.s16 q9, q4, q7
2085 vsub.s16 q15, q4, q7 2088 vsub.s16 q15, q4, q7
2086 subs TMP, TMP, #1 2089 subs TMP, TMP, #1
2087 bne 1b 2090 bne 1b
2088 2091
2089 /* store results */ 2092 /* store results */
2090 vst1.16 {d16, d17, d18, d19}, [DATA, :128]! 2093 vst1.16 {d16, d17, d18, d19}, [DATA, :128]!
2091 vst1.16 {d20, d21, d22, d23}, [DATA, :128]! 2094 vst1.16 {d20, d21, d22, d23}, [DATA, :128]!
2092 vst1.16 {d24, d25, d26, d27}, [DATA, :128]! 2095 vst1.16 {d24, d25, d26, d27}, [DATA, :128]!
2093 vst1.16 {d28, d29, d30, d31}, [DATA, :128] 2096 vst1.16 {d28, d29, d30, d31}, [DATA, :128]
2094 2097
2095 vpop {d8-d15} 2098 vpop {d8-d15}
2096 bx lr 2099 bx lr
2097 2100
2098 .unreq DATA 2101 .unreq DATA
2099 .unreq TMP 2102 .unreq TMP
2100 2103
2101 2104
2102 /*****************************************************************************/ 2105 /*****************************************************************************/
2103 2106
2104 /* 2107 /*
2105 * GLOBAL(void) 2108 * GLOBAL(void)
2106 * jsimd_quantize_neon (JCOEFPTR coef_block, DCTELEM * divisors, 2109 * jsimd_quantize_neon (JCOEFPTR coef_block, DCTELEM *divisors,
2107 * DCTELEM * workspace); 2110 * DCTELEM *workspace);
2108 * 2111 *
2109 * Note: the code uses 2 stage pipelining in order to improve instructions 2112 * Note: the code uses 2 stage pipelining in order to improve instructions
2110 * scheduling and eliminate stalls (this provides ~15% better 2113 * scheduling and eliminate stalls (this provides ~15% better
2111 * performance for this function on both ARM Cortex-A8 and 2114 * performance for this function on both ARM Cortex-A8 and
2112 * ARM Cortex-A9 when compared to the non-pipelined variant). 2115 * ARM Cortex-A9 when compared to the non-pipelined variant).
2113 * The instructions which belong to the second stage use different 2116 * The instructions which belong to the second stage use different
2114 * indentation for better readiability. 2117 * indentation for better readiability.
2115 */ 2118 */
2116 asm_function jsimd_quantize_neon 2119 asm_function jsimd_quantize_neon
2117 2120
2118 COEF_BLOCK .req r0 2121 COEF_BLOCK .req r0
2119 DIVISORS .req r1 2122 DIVISORS .req r1
2120 WORKSPACE .req r2 2123 WORKSPACE .req r2
2121 2124
2122 RECIPROCAL .req DIVISORS 2125 RECIPROCAL .req DIVISORS
2123 CORRECTION .req r3 2126 CORRECTION .req r3
2124 SHIFT .req ip 2127 SHIFT .req ip
2125 LOOP_COUNT .req r4 2128 LOOP_COUNT .req r4
2126 2129
2127 vld1.16 {d0, d1, d2, d3}, [WORKSPACE, :128]! 2130 vld1.16 {d0, d1, d2, d3}, [WORKSPACE, :128]!
2128 vabs.s16 q12, q0 2131 vabs.s16 q12, q0
2129 add CORRECTION, DIVISORS, #(64 * 2) 2132 add CORRECTION, DIVISORS, #(64 * 2)
2130 add SHIFT, DIVISORS, #(64 * 6) 2133 add SHIFT, DIVISORS, #(64 * 6)
2131 vld1.16 {d20, d21, d22, d23}, [CORRECTION, :128]! 2134 vld1.16 {d20, d21, d22, d23}, [CORRECTION, :128]!
2132 vabs.s16 q13, q1 2135 vabs.s16 q13, q1
2133 vld1.16 {d16, d17, d18, d19}, [RECIPROCAL, :128]! 2136 vld1.16 {d16, d17, d18, d19}, [RECIPROCAL, :128]!
2134 vadd.u16 q12, q12, q10 /* add correction */ 2137 vadd.u16 q12, q12, q10 /* add correction */
2135 vadd.u16 q13, q13, q11 2138 vadd.u16 q13, q13, q11
2136 vmull.u16 q10, d24, d16 /* multiply by reciprocal */ 2139 vmull.u16 q10, d24, d16 /* multiply by reciprocal */
2137 vmull.u16 q11, d25, d17 2140 vmull.u16 q11, d25, d17
2138 vmull.u16 q8, d26, d18 2141 vmull.u16 q8, d26, d18
2139 vmull.u16 q9, d27, d19 2142 vmull.u16 q9, d27, d19
2140 vld1.16 {d24, d25, d26, d27}, [SHIFT, :128]! 2143 vld1.16 {d24, d25, d26, d27}, [SHIFT, :128]!
2141 vshrn.u32 d20, q10, #16 2144 vshrn.u32 d20, q10, #16
2142 vshrn.u32 d21, q11, #16 2145 vshrn.u32 d21, q11, #16
2143 vshrn.u32 d22, q8, #16 2146 vshrn.u32 d22, q8, #16
2144 vshrn.u32 d23, q9, #16 2147 vshrn.u32 d23, q9, #16
2145 vneg.s16 q12, q12 2148 vneg.s16 q12, q12
2146 vneg.s16 q13, q13 2149 vneg.s16 q13, q13
2147 vshr.s16 q2, q0, #15 /* extract sign */ 2150 vshr.s16 q2, q0, #15 /* extract sign */
2148 vshr.s16 q3, q1, #15 2151 vshr.s16 q3, q1, #15
2149 vshl.u16 q14, q10, q12 /* shift */ 2152 vshl.u16 q14, q10, q12 /* shift */
2150 vshl.u16 q15, q11, q13 2153 vshl.u16 q15, q11, q13
2151 2154
2152 push {r4, r5} 2155 push {r4, r5}
2153 mov LOOP_COUNT, #3 2156 mov LOOP_COUNT, #3
2154 1: 2157 1:
2155 vld1.16 {d0, d1, d2, d3}, [WORKSPACE, :128]! 2158 vld1.16 {d0, d1, d2, d3}, [WORKSPACE, :128]!
2156 veor.u16 q14, q14, q2 /* restore sign */ 2159 veor.u16 q14, q14, q2 /* restore sign */
2157 vabs.s16 q12, q0 2160 vabs.s16 q12, q0
2158 vld1.16 {d20, d21, d22, d23}, [CORRECTION, :128]! 2161 vld1.16 {d20, d21, d22, d23}, [CORRECTION, :128]!
2159 vabs.s16 q13, q1 2162 vabs.s16 q13, q1
2160 veor.u16 q15, q15, q3 2163 veor.u16 q15, q15, q3
2161 vld1.16 {d16, d17, d18, d19}, [RECIPROCAL, :128]! 2164 vld1.16 {d16, d17, d18, d19}, [RECIPROCAL, :128]!
2162 vadd.u16 q12, q12, q10 /* add correction */ 2165 vadd.u16 q12, q12, q10 /* add correction */
2163 vadd.u16 q13, q13, q11 2166 vadd.u16 q13, q13, q11
2164 vmull.u16 q10, d24, d16 /* multiply by reciprocal */ 2167 vmull.u16 q10, d24, d16 /* multiply by reciprocal */
2165 vmull.u16 q11, d25, d17 2168 vmull.u16 q11, d25, d17
2166 vmull.u16 q8, d26, d18 2169 vmull.u16 q8, d26, d18
2167 vmull.u16 q9, d27, d19 2170 vmull.u16 q9, d27, d19
2168 vsub.u16 q14, q14, q2 2171 vsub.u16 q14, q14, q2
2169 vld1.16 {d24, d25, d26, d27}, [SHIFT, :128]! 2172 vld1.16 {d24, d25, d26, d27}, [SHIFT, :128]!
2170 vsub.u16 q15, q15, q3 2173 vsub.u16 q15, q15, q3
2171 vshrn.u32 d20, q10, #16 2174 vshrn.u32 d20, q10, #16
2172 vshrn.u32 d21, q11, #16 2175 vshrn.u32 d21, q11, #16
2173 vst1.16 {d28, d29, d30, d31}, [COEF_BLOCK, :128]! 2176 vst1.16 {d28, d29, d30, d31}, [COEF_BLOCK, :128]!
2174 vshrn.u32 d22, q8, #16 2177 vshrn.u32 d22, q8, #16
2175 vshrn.u32 d23, q9, #16 2178 vshrn.u32 d23, q9, #16
2176 vneg.s16 q12, q12 2179 vneg.s16 q12, q12
2177 vneg.s16 q13, q13 2180 vneg.s16 q13, q13
2178 vshr.s16 q2, q0, #15 /* extract sign */ 2181 vshr.s16 q2, q0, #15 /* extract sign */
2179 vshr.s16 q3, q1, #15 2182 vshr.s16 q3, q1, #15
2180 vshl.u16 q14, q10, q12 /* shift */ 2183 vshl.u16 q14, q10, q12 /* shift */
2181 vshl.u16 q15, q11, q13 2184 vshl.u16 q15, q11, q13
2182 subs LOOP_COUNT, LOOP_COUNT, #1 2185 subs LOOP_COUNT, LOOP_COUNT, #1
2183 bne 1b 2186 bne 1b
2184 pop {r4, r5} 2187 pop {r4, r5}
2185 2188
2186 veor.u16 q14, q14, q2 /* restore sign */ 2189 veor.u16 q14, q14, q2 /* restore sign */
2187 veor.u16 q15, q15, q3 2190 veor.u16 q15, q15, q3
2188 vsub.u16 q14, q14, q2 2191 vsub.u16 q14, q14, q2
2189 vsub.u16 q15, q15, q3 2192 vsub.u16 q15, q15, q3
2190 vst1.16 {d28, d29, d30, d31}, [COEF_BLOCK, :128]! 2193 vst1.16 {d28, d29, d30, d31}, [COEF_BLOCK, :128]!
2191 2194
2192 bx lr /* return */ 2195 bx lr /* return */
2193 2196
2194 .unreq COEF_BLOCK 2197 .unreq COEF_BLOCK
2195 .unreq DIVISORS 2198 .unreq DIVISORS
2196 .unreq WORKSPACE 2199 .unreq WORKSPACE
2197 .unreq RECIPROCAL 2200 .unreq RECIPROCAL
2198 .unreq CORRECTION 2201 .unreq CORRECTION
2199 .unreq SHIFT 2202 .unreq SHIFT
2200 .unreq LOOP_COUNT 2203 .unreq LOOP_COUNT
2201 2204
2202 2205
2203 /*****************************************************************************/ 2206 /*****************************************************************************/
2204 2207
2205 /* 2208 /*
2206 * GLOBAL(void) 2209 * GLOBAL(void)
2207 * jsimd_h2v1_fancy_upsample_neon (int max_v_samp_factor, 2210 * jsimd_h2v1_fancy_upsample_neon (int max_v_samp_factor,
2208 * JDIMENSION downsampled_width, 2211 * JDIMENSION downsampled_width,
2209 * JSAMPARRAY input_data, 2212 * JSAMPARRAY input_data,
2210 * JSAMPARRAY * output_data_ptr); 2213 * JSAMPARRAY *output_data_ptr);
2211 * 2214 *
2212 * Note: the use of unaligned writes is the main remaining bottleneck in 2215 * Note: the use of unaligned writes is the main remaining bottleneck in
2213 * this code, which can be potentially solved to get up to tens 2216 * this code, which can be potentially solved to get up to tens
2214 * of percents performance improvement on Cortex-A8/Cortex-A9. 2217 * of percents performance improvement on Cortex-A8/Cortex-A9.
2215 */ 2218 */
2216 2219
2217 /* 2220 /*
2218 * Upsample 16 source pixels to 32 destination pixels. The new 16 source 2221 * Upsample 16 source pixels to 32 destination pixels. The new 16 source
2219 * pixels are loaded to q0. The previous 16 source pixels are in q1. The 2222 * pixels are loaded to q0. The previous 16 source pixels are in q1. The
2220 * shifted-by-one source pixels are constructed in q2 by using q0 and q1. 2223 * shifted-by-one source pixels are constructed in q2 by using q0 and q1.
2221 * Register d28 is used for multiplication by 3. Register q15 is used 2224 * Register d28 is used for multiplication by 3. Register q15 is used
2222 * for adding +1 bias. 2225 * for adding +1 bias.
2223 */ 2226 */
2224 .macro upsample16 OUTPTR, INPTR 2227 .macro upsample16 OUTPTR, INPTR
2225 vld1.8 {q0}, [\INPTR]! 2228 vld1.8 {q0}, [\INPTR]!
2226 vmovl.u8 q8, d0 2229 vmovl.u8 q8, d0
2227 vext.8 q2, q1, q0, #15 2230 vext.8 q2, q1, q0, #15
2228 vmovl.u8 q9, d1 2231 vmovl.u8 q9, d1
2229 vaddw.u8 q10, q15, d4 2232 vaddw.u8 q10, q15, d4
2230 vaddw.u8 q11, q15, d5 2233 vaddw.u8 q11, q15, d5
2231 vmlal.u8 q8, d4, d28 2234 vmlal.u8 q8, d4, d28
2232 vmlal.u8 q9, d5, d28 2235 vmlal.u8 q9, d5, d28
2233 vmlal.u8 q10, d0, d28 2236 vmlal.u8 q10, d0, d28
2234 vmlal.u8 q11, d1, d28 2237 vmlal.u8 q11, d1, d28
2235 vmov q1, q0 /* backup source pixels to q1 */ 2238 vmov q1, q0 /* backup source pixels to q1 */
2236 vrshrn.u16 d6, q8, #2 2239 vrshrn.u16 d6, q8, #2
2237 vrshrn.u16 d7, q9, #2 2240 vrshrn.u16 d7, q9, #2
2238 vshrn.u16 d8, q10, #2 2241 vshrn.u16 d8, q10, #2
2239 vshrn.u16 d9, q11, #2 2242 vshrn.u16 d9, q11, #2
2240 vst2.8 {d6, d7, d8, d9}, [\OUTPTR]! 2243 vst2.8 {d6, d7, d8, d9}, [\OUTPTR]!
2241 .endm 2244 .endm
2242 2245
2243 /* 2246 /*
2244 * Upsample 32 source pixels to 64 destination pixels. Compared to 'usample16' 2247 * Upsample 32 source pixels to 64 destination pixels. Compared to 'usample16'
2245 * macro, the roles of q0 and q1 registers are reversed for even and odd 2248 * macro, the roles of q0 and q1 registers are reversed for even and odd
2246 * groups of 16 pixels, that's why "vmov q1, q0" instructions are not needed. 2249 * groups of 16 pixels, that's why "vmov q1, q0" instructions are not needed.
2247 * Also this unrolling allows to reorder loads and stores to compensate 2250 * Also this unrolling allows to reorder loads and stores to compensate
2248 * multiplication latency and reduce stalls. 2251 * multiplication latency and reduce stalls.
2249 */ 2252 */
2250 .macro upsample32 OUTPTR, INPTR 2253 .macro upsample32 OUTPTR, INPTR
2251 /* even 16 pixels group */ 2254 /* even 16 pixels group */
2252 vld1.8 {q0}, [\INPTR]! 2255 vld1.8 {q0}, [\INPTR]!
2253 vmovl.u8 q8, d0 2256 vmovl.u8 q8, d0
2254 vext.8 q2, q1, q0, #15 2257 vext.8 q2, q1, q0, #15
2255 vmovl.u8 q9, d1 2258 vmovl.u8 q9, d1
2256 vaddw.u8 q10, q15, d4 2259 vaddw.u8 q10, q15, d4
2257 vaddw.u8 q11, q15, d5 2260 vaddw.u8 q11, q15, d5
2258 vmlal.u8 q8, d4, d28 2261 vmlal.u8 q8, d4, d28
2259 vmlal.u8 q9, d5, d28 2262 vmlal.u8 q9, d5, d28
2260 vmlal.u8 q10, d0, d28 2263 vmlal.u8 q10, d0, d28
2261 vmlal.u8 q11, d1, d28 2264 vmlal.u8 q11, d1, d28
2262 /* odd 16 pixels group */ 2265 /* odd 16 pixels group */
2263 vld1.8 {q1}, [\INPTR]! 2266 vld1.8 {q1}, [\INPTR]!
2264 vrshrn.u16 d6, q8, #2 2267 vrshrn.u16 d6, q8, #2
2265 vrshrn.u16 d7, q9, #2 2268 vrshrn.u16 d7, q9, #2
2266 vshrn.u16 d8, q10, #2 2269 vshrn.u16 d8, q10, #2
2267 vshrn.u16 d9, q11, #2 2270 vshrn.u16 d9, q11, #2
2268 vmovl.u8 q8, d2 2271 vmovl.u8 q8, d2
2269 vext.8 q2, q0, q1, #15 2272 vext.8 q2, q0, q1, #15
2270 vmovl.u8 q9, d3 2273 vmovl.u8 q9, d3
2271 vaddw.u8 q10, q15, d4 2274 vaddw.u8 q10, q15, d4
2272 vaddw.u8 q11, q15, d5 2275 vaddw.u8 q11, q15, d5
2273 vmlal.u8 q8, d4, d28 2276 vmlal.u8 q8, d4, d28
2274 vmlal.u8 q9, d5, d28 2277 vmlal.u8 q9, d5, d28
2275 vmlal.u8 q10, d2, d28 2278 vmlal.u8 q10, d2, d28
2276 vmlal.u8 q11, d3, d28 2279 vmlal.u8 q11, d3, d28
2277 vst2.8 {d6, d7, d8, d9}, [\OUTPTR]! 2280 vst2.8 {d6, d7, d8, d9}, [\OUTPTR]!
2278 vrshrn.u16 d6, q8, #2 2281 vrshrn.u16 d6, q8, #2
2279 vrshrn.u16 d7, q9, #2 2282 vrshrn.u16 d7, q9, #2
2280 vshrn.u16 d8, q10, #2 2283 vshrn.u16 d8, q10, #2
2281 vshrn.u16 d9, q11, #2 2284 vshrn.u16 d9, q11, #2
2282 vst2.8 {d6, d7, d8, d9}, [\OUTPTR]! 2285 vst2.8 {d6, d7, d8, d9}, [\OUTPTR]!
2283 .endm 2286 .endm
2284 2287
2285 /* 2288 /*
2286 * Upsample a row of WIDTH pixels from INPTR to OUTPTR. 2289 * Upsample a row of WIDTH pixels from INPTR to OUTPTR.
2287 */ 2290 */
2288 .macro upsample_row OUTPTR, INPTR, WIDTH, TMP1 2291 .macro upsample_row OUTPTR, INPTR, WIDTH, TMP1
2289 /* special case for the first and last pixels */ 2292 /* special case for the first and last pixels */
2290 sub \WIDTH, \WIDTH, #1 2293 sub \WIDTH, \WIDTH, #1
2291 add \OUTPTR, \OUTPTR, #1 2294 add \OUTPTR, \OUTPTR, #1
2292 ldrb \TMP1, [\INPTR, \WIDTH] 2295 ldrb \TMP1, [\INPTR, \WIDTH]
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
2333 vld1.8 {d0[3]}, [\INPTR] 2336 vld1.8 {d0[3]}, [\INPTR]
2334 sub \INPTR, \INPTR, #1 2337 sub \INPTR, \INPTR, #1
2335 vld1.8 {d0[2]}, [\INPTR] 2338 vld1.8 {d0[2]}, [\INPTR]
2336 sub \INPTR, \INPTR, #1 2339 sub \INPTR, \INPTR, #1
2337 vld1.8 {d0[1]}, [\INPTR] 2340 vld1.8 {d0[1]}, [\INPTR]
2338 sub \INPTR, \INPTR, #1 2341 sub \INPTR, \INPTR, #1
2339 vld1.8 {d0[0]}, [\INPTR] 2342 vld1.8 {d0[0]}, [\INPTR]
2340 2: 2343 2:
2341 tst \WIDTH, #8 2344 tst \WIDTH, #8
2342 beq 2f 2345 beq 2f
2343 vmov d1, d0 2346 vmov d1, d0
2344 sub \INPTR, \INPTR, #8 2347 sub \INPTR, \INPTR, #8
2345 vld1.8 {d0}, [\INPTR] 2348 vld1.8 {d0}, [\INPTR]
2346 2: /* upsample the remaining pixels */ 2349 2: /* upsample the remaining pixels */
2347 vmovl.u8 q8, d0 2350 vmovl.u8 q8, d0
2348 vext.8 q2, q1, q0, #15 2351 vext.8 q2, q1, q0, #15
2349 vmovl.u8 q9, d1 2352 vmovl.u8 q9, d1
2350 vaddw.u8 q10, q15, d4 2353 vaddw.u8 q10, q15, d4
2351 vaddw.u8 q11, q15, d5 2354 vaddw.u8 q11, q15, d5
2352 vmlal.u8 q8, d4, d28 2355 vmlal.u8 q8, d4, d28
2353 vmlal.u8 q9, d5, d28 2356 vmlal.u8 q9, d5, d28
2354 vmlal.u8 q10, d0, d28 2357 vmlal.u8 q10, d0, d28
2355 vmlal.u8 q11, d1, d28 2358 vmlal.u8 q11, d1, d28
2356 vrshrn.u16 d10, q8, #2 2359 vrshrn.u16 d10, q8, #2
2357 vrshrn.u16 d12, q9, #2 2360 vrshrn.u16 d12, q9, #2
2358 vshrn.u16 d11, q10, #2 2361 vshrn.u16 d11, q10, #2
2359 vshrn.u16 d13, q11, #2 2362 vshrn.u16 d13, q11, #2
2360 vzip.8 d10, d11 2363 vzip.8 d10, d11
2361 vzip.8 d12, d13 2364 vzip.8 d12, d13
2362 /* store the remaining pixels */ 2365 /* store the remaining pixels */
2363 tst \WIDTH, #8 2366 tst \WIDTH, #8
2364 beq 2f 2367 beq 2f
2365 vst1.8 {d10, d11}, [\OUTPTR]! 2368 vst1.8 {d10, d11}, [\OUTPTR]!
2366 vmov q5, q6 2369 vmov q5, q6
2367 2: 2370 2:
2368 tst \WIDTH, #4 2371 tst \WIDTH, #4
2369 beq 2f 2372 beq 2f
2370 vst1.8 {d10}, [\OUTPTR]! 2373 vst1.8 {d10}, [\OUTPTR]!
2371 vmov d10, d11 2374 vmov d10, d11
2372 2: 2375 2:
2373 tst \WIDTH, #2 2376 tst \WIDTH, #2
2374 beq 2f 2377 beq 2f
2375 vst1.8 {d10[0]}, [\OUTPTR]! 2378 vst1.8 {d10[0]}, [\OUTPTR]!
2376 vst1.8 {d10[1]}, [\OUTPTR]! 2379 vst1.8 {d10[1]}, [\OUTPTR]!
2377 vst1.8 {d10[2]}, [\OUTPTR]! 2380 vst1.8 {d10[2]}, [\OUTPTR]!
2378 vst1.8 {d10[3]}, [\OUTPTR]! 2381 vst1.8 {d10[3]}, [\OUTPTR]!
2379 vext.8 d10, d10, d10, #4 2382 vext.8 d10, d10, d10, #4
2380 2: 2383 2:
2381 tst \WIDTH, #1 2384 tst \WIDTH, #1
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
2425 .unreq DOWNSAMPLED_WIDTH 2428 .unreq DOWNSAMPLED_WIDTH
2426 .unreq INPUT_DATA 2429 .unreq INPUT_DATA
2427 .unreq OUTPUT_DATA_PTR 2430 .unreq OUTPUT_DATA_PTR
2428 .unreq OUTPUT_DATA 2431 .unreq OUTPUT_DATA
2429 2432
2430 .unreq OUTPTR 2433 .unreq OUTPTR
2431 .unreq INPTR 2434 .unreq INPTR
2432 .unreq WIDTH 2435 .unreq WIDTH
2433 .unreq TMP 2436 .unreq TMP
2434 2437
2435
2436 .purgem upsample16 2438 .purgem upsample16
2437 .purgem upsample32 2439 .purgem upsample32
2438 .purgem upsample_row 2440 .purgem upsample_row
2441
2442
2443 /*****************************************************************************/
2444
2445 /*
2446 * GLOBAL(JOCTET*)
2447 * jsimd_huff_encode_one_block (working_state *state, JOCTET *buffer,
2448 * JCOEFPTR block, int last_dc_val,
2449 * c_derived_tbl *dctbl, c_derived_tbl *actbl)
2450 *
2451 */
2452
2453 .macro emit_byte BUFFER, PUT_BUFFER, PUT_BITS, ZERO, TMP
2454 sub \PUT_BITS, \PUT_BITS, #0x8
2455 lsr \TMP, \PUT_BUFFER, \PUT_BITS
2456 uxtb \TMP, \TMP
2457 strb \TMP, [\BUFFER, #1]!
2458 cmp \TMP, #0xff
2459 /*it eq*/
2460 streqb \ZERO, [\BUFFER, #1]!
2461 .endm
2462
2463 .macro put_bits PUT_BUFFER, PUT_BITS, CODE, SIZE
2464 /*lsl \PUT_BUFFER, \PUT_BUFFER, \SIZE*/
2465 add \PUT_BITS, \SIZE
2466 /*orr \PUT_BUFFER, \PUT_BUFFER, \CODE*/
2467 orr \PUT_BUFFER, \CODE, \PUT_BUFFER, lsl \SIZE
2468 .endm
2469
2470 .macro checkbuf15 BUFFER, PUT_BUFFER, PUT_BITS, ZERO, TMP
2471 cmp \PUT_BITS, #0x10
2472 blt 15f
2473 eor \ZERO, \ZERO, \ZERO
2474 emit_byte \BUFFER, \PUT_BUFFER, \PUT_BITS, \ZERO, \TMP
2475 emit_byte \BUFFER, \PUT_BUFFER, \PUT_BITS, \ZERO, \TMP
2476 15:
2477 .endm
2478
2479 .balign 16
2480 jsimd_huff_encode_one_block_neon_consts:
2481 .byte 0x01
2482 .byte 0x02
2483 .byte 0x04
2484 .byte 0x08
2485 .byte 0x10
2486 .byte 0x20
2487 .byte 0x40
2488 .byte 0x80
2489
2490 asm_function jsimd_huff_encode_one_block_neon
2491 push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
2492 add r7, sp, #0x1c
2493 sub r4, sp, #0x40
2494 bfc r4, #0, #5
2495 mov sp, r4 /* align sp on 32 bytes */
2496 vst1.64 {d8, d9, d10, d11}, [r4, :128]!
2497 vst1.64 {d12, d13, d14, d15}, [r4, :128]
2498 sub sp, #0x140 /* reserve 320 bytes */
2499 str r0, [sp, #0x18] /* working state > sp + Ox18 */
2500 add r4, sp, #0x20 /* r4 = t1 */
2501 ldr lr, [r7, #0x8] /* lr = dctbl */
2502 sub r10, r1, #0x1 /* r10=buffer-- */
2503 ldrsh r1, [r2]
2504 mov r9, #0x10
2505 mov r8, #0x1
2506 adr r5, jsimd_huff_encode_one_block_neon_consts
2507 /* prepare data */
2508 vld1.8 {d26}, [r5, :64]
2509 veor q8, q8, q8
2510 veor q9, q9, q9
2511 vdup.16 q14, r9
2512 vdup.16 q15, r8
2513 veor q10, q10, q10
2514 veor q11, q11, q11
2515 sub r1, r1, r3
2516 add r9, r2, #0x22
2517 add r8, r2, #0x18
2518 add r3, r2, #0x36
2519 vmov.16 d0[0], r1
2520 vld1.16 {d2[0]}, [r9, :16]
2521 vld1.16 {d4[0]}, [r8, :16]
2522 vld1.16 {d6[0]}, [r3, :16]
2523 add r1, r2, #0x2
2524 add r9, r2, #0x30
2525 add r8, r2, #0x26
2526 add r3, r2, #0x28
2527 vld1.16 {d0[1]}, [r1, :16]
2528 vld1.16 {d2[1]}, [r9, :16]
2529 vld1.16 {d4[1]}, [r8, :16]
2530 vld1.16 {d6[1]}, [r3, :16]
2531 add r1, r2, #0x10
2532 add r9, r2, #0x40
2533 add r8, r2, #0x34
2534 add r3, r2, #0x1a
2535 vld1.16 {d0[2]}, [r1, :16]
2536 vld1.16 {d2[2]}, [r9, :16]
2537 vld1.16 {d4[2]}, [r8, :16]
2538 vld1.16 {d6[2]}, [r3, :16]
2539 add r1, r2, #0x20
2540 add r9, r2, #0x32
2541 add r8, r2, #0x42
2542 add r3, r2, #0xc
2543 vld1.16 {d0[3]}, [r1, :16]
2544 vld1.16 {d2[3]}, [r9, :16]
2545 vld1.16 {d4[3]}, [r8, :16]
2546 vld1.16 {d6[3]}, [r3, :16]
2547 add r1, r2, #0x12
2548 add r9, r2, #0x24
2549 add r8, r2, #0x50
2550 add r3, r2, #0xe
2551 vld1.16 {d1[0]}, [r1, :16]
2552 vld1.16 {d3[0]}, [r9, :16]
2553 vld1.16 {d5[0]}, [r8, :16]
2554 vld1.16 {d7[0]}, [r3, :16]
2555 add r1, r2, #0x4
2556 add r9, r2, #0x16
2557 add r8, r2, #0x60
2558 add r3, r2, #0x1c
2559 vld1.16 {d1[1]}, [r1, :16]
2560 vld1.16 {d3[1]}, [r9, :16]
2561 vld1.16 {d5[1]}, [r8, :16]
2562 vld1.16 {d7[1]}, [r3, :16]
2563 add r1, r2, #0x6
2564 add r9, r2, #0x8
2565 add r8, r2, #0x52
2566 add r3, r2, #0x2a
2567 vld1.16 {d1[2]}, [r1, :16]
2568 vld1.16 {d3[2]}, [r9, :16]
2569 vld1.16 {d5[2]}, [r8, :16]
2570 vld1.16 {d7[2]}, [r3, :16]
2571 add r1, r2, #0x14
2572 add r9, r2, #0xa
2573 add r8, r2, #0x44
2574 add r3, r2, #0x38
2575 vld1.16 {d1[3]}, [r1, :16]
2576 vld1.16 {d3[3]}, [r9, :16]
2577 vld1.16 {d5[3]}, [r8, :16]
2578 vld1.16 {d7[3]}, [r3, :16]
2579 vcgt.s16 q8, q8, q0
2580 vcgt.s16 q9, q9, q1
2581 vcgt.s16 q10, q10, q2
2582 vcgt.s16 q11, q11, q3
2583 vabs.s16 q0, q0
2584 vabs.s16 q1, q1
2585 vabs.s16 q2, q2
2586 vabs.s16 q3, q3
2587 veor q8, q8, q0
2588 veor q9, q9, q1
2589 veor q10, q10, q2
2590 veor q11, q11, q3
2591 add r9, r4, #0x20
2592 add r8, r4, #0x80
2593 add r3, r4, #0xa0
2594 vclz.i16 q0, q0
2595 vclz.i16 q1, q1
2596 vclz.i16 q2, q2
2597 vclz.i16 q3, q3
2598 vsub.i16 q0, q14, q0
2599 vsub.i16 q1, q14, q1
2600 vsub.i16 q2, q14, q2
2601 vsub.i16 q3, q14, q3
2602 vst1.16 {d0, d1, d2, d3}, [r4, :256]
2603 vst1.16 {d4, d5, d6, d7}, [r9, :256]
2604 vshl.s16 q0, q15, q0
2605 vshl.s16 q1, q15, q1
2606 vshl.s16 q2, q15, q2
2607 vshl.s16 q3, q15, q3
2608 vsub.i16 q0, q0, q15
2609 vsub.i16 q1, q1, q15
2610 vsub.i16 q2, q2, q15
2611 vsub.i16 q3, q3, q15
2612 vand q8, q8, q0
2613 vand q9, q9, q1
2614 vand q10, q10, q2
2615 vand q11, q11, q3
2616 vst1.16 {d16, d17, d18, d19}, [r8, :256]
2617 vst1.16 {d20, d21, d22, d23}, [r3, :256]
2618 add r1, r2, #0x46
2619 add r9, r2, #0x3a
2620 add r8, r2, #0x74
2621 add r3, r2, #0x6a
2622 vld1.16 {d8[0]}, [r1, :16]
2623 vld1.16 {d10[0]}, [r9, :16]
2624 vld1.16 {d12[0]}, [r8, :16]
2625 vld1.16 {d14[0]}, [r3, :16]
2626 veor q8, q8, q8
2627 veor q9, q9, q9
2628 veor q10, q10, q10
2629 veor q11, q11, q11
2630 add r1, r2, #0x54
2631 add r9, r2, #0x2c
2632 add r8, r2, #0x76
2633 add r3, r2, #0x78
2634 vld1.16 {d8[1]}, [r1, :16]
2635 vld1.16 {d10[1]}, [r9, :16]
2636 vld1.16 {d12[1]}, [r8, :16]
2637 vld1.16 {d14[1]}, [r3, :16]
2638 add r1, r2, #0x62
2639 add r9, r2, #0x1e
2640 add r8, r2, #0x68
2641 add r3, r2, #0x7a
2642 vld1.16 {d8[2]}, [r1, :16]
2643 vld1.16 {d10[2]}, [r9, :16]
2644 vld1.16 {d12[2]}, [r8, :16]
2645 vld1.16 {d14[2]}, [r3, :16]
2646 add r1, r2, #0x70
2647 add r9, r2, #0x2e
2648 add r8, r2, #0x5a
2649 add r3, r2, #0x6c
2650 vld1.16 {d8[3]}, [r1, :16]
2651 vld1.16 {d10[3]}, [r9, :16]
2652 vld1.16 {d12[3]}, [r8, :16]
2653 vld1.16 {d14[3]}, [r3, :16]
2654 add r1, r2, #0x72
2655 add r9, r2, #0x3c
2656 add r8, r2, #0x4c
2657 add r3, r2, #0x5e
2658 vld1.16 {d9[0]}, [r1, :16]
2659 vld1.16 {d11[0]}, [r9, :16]
2660 vld1.16 {d13[0]}, [r8, :16]
2661 vld1.16 {d15[0]}, [r3, :16]
2662 add r1, r2, #0x64
2663 add r9, r2, #0x4a
2664 add r8, r2, #0x3e
2665 add r3, r2, #0x6e
2666 vld1.16 {d9[1]}, [r1, :16]
2667 vld1.16 {d11[1]}, [r9, :16]
2668 vld1.16 {d13[1]}, [r8, :16]
2669 vld1.16 {d15[1]}, [r3, :16]
2670 add r1, r2, #0x56
2671 add r9, r2, #0x58
2672 add r8, r2, #0x4e
2673 add r3, r2, #0x7c
2674 vld1.16 {d9[2]}, [r1, :16]
2675 vld1.16 {d11[2]}, [r9, :16]
2676 vld1.16 {d13[2]}, [r8, :16]
2677 vld1.16 {d15[2]}, [r3, :16]
2678 add r1, r2, #0x48
2679 add r9, r2, #0x66
2680 add r8, r2, #0x5c
2681 add r3, r2, #0x7e
2682 vld1.16 {d9[3]}, [r1, :16]
2683 vld1.16 {d11[3]}, [r9, :16]
2684 vld1.16 {d13[3]}, [r8, :16]
2685 vld1.16 {d15[3]}, [r3, :16]
2686 vcgt.s16 q8, q8, q4
2687 vcgt.s16 q9, q9, q5
2688 vcgt.s16 q10, q10, q6
2689 vcgt.s16 q11, q11, q7
2690 vabs.s16 q4, q4
2691 vabs.s16 q5, q5
2692 vabs.s16 q6, q6
2693 vabs.s16 q7, q7
2694 veor q8, q8, q4
2695 veor q9, q9, q5
2696 veor q10, q10, q6
2697 veor q11, q11, q7
2698 add r1, r4, #0x40
2699 add r9, r4, #0x60
2700 add r8, r4, #0xc0
2701 add r3, r4, #0xe0
2702 vclz.i16 q4, q4
2703 vclz.i16 q5, q5
2704 vclz.i16 q6, q6
2705 vclz.i16 q7, q7
2706 vsub.i16 q4, q14, q4
2707 vsub.i16 q5, q14, q5
2708 vsub.i16 q6, q14, q6
2709 vsub.i16 q7, q14, q7
2710 vst1.16 {d8, d9, d10, d11}, [r1, :256]
2711 vst1.16 {d12, d13, d14, d15}, [r9, :256]
2712 vshl.s16 q4, q15, q4
2713 vshl.s16 q5, q15, q5
2714 vshl.s16 q6, q15, q6
2715 vshl.s16 q7, q15, q7
2716 vsub.i16 q4, q4, q15
2717 vsub.i16 q5, q5, q15
2718 vsub.i16 q6, q6, q15
2719 vsub.i16 q7, q7, q15
2720 vand q8, q8, q4
2721 vand q9, q9, q5
2722 vand q10, q10, q6
2723 vand q11, q11, q7
2724 vst1.16 {d16, d17, d18, d19}, [r8, :256]
2725 vst1.16 {d20, d21, d22, d23}, [r3, :256]
2726 ldr r12, [r7, #0xc] /* r12 = actbl */
2727 add r1, lr, #0x400 /* r1 = dctbl->ehufsi */
2728 mov r9, r12 /* r9 = actbl */
2729 add r6, r4, #0x80 /* r6 = t2 */
2730 ldr r11, [r0, #0x8] /* r11 = put_buffer */
2731 ldr r4, [r0, #0xc] /* r4 = put_bits */
2732 ldrh r2, [r6, #-128] /* r2 = nbits */
2733 ldrh r3, [r6] /* r3 = temp2 & (((JLONG) 1)<<nbits) - 1; */
2734 ldr r0, [lr, r2, lsl #2]
2735 ldrb r5, [r1, r2]
2736 put_bits r11, r4, r0, r5
2737 checkbuf15 r10, r11, r4, r5, r0
2738 put_bits r11, r4, r3, r2
2739 checkbuf15 r10, r11, r4, r5, r0
2740 mov lr, r6 /* lr = t2 */
2741 add r5, r9, #0x400 /* r5 = actbl->ehufsi */
2742 ldrsb r6, [r5, #0xf0] /* r6 = actbl->ehufsi[0xf0] */
2743 veor q8, q8, q8
2744 vceq.i16 q0, q0, q8
2745 vceq.i16 q1, q1, q8
2746 vceq.i16 q2, q2, q8
2747 vceq.i16 q3, q3, q8
2748 vceq.i16 q4, q4, q8
2749 vceq.i16 q5, q5, q8
2750 vceq.i16 q6, q6, q8
2751 vceq.i16 q7, q7, q8
2752 vmovn.i16 d0, q0
2753 vmovn.i16 d2, q1
2754 vmovn.i16 d4, q2
2755 vmovn.i16 d6, q3
2756 vmovn.i16 d8, q4
2757 vmovn.i16 d10, q5
2758 vmovn.i16 d12, q6
2759 vmovn.i16 d14, q7
2760 vand d0, d0, d26
2761 vand d2, d2, d26
2762 vand d4, d4, d26
2763 vand d6, d6, d26
2764 vand d8, d8, d26
2765 vand d10, d10, d26
2766 vand d12, d12, d26
2767 vand d14, d14, d26
2768 vpadd.i8 d0, d0, d2
2769 vpadd.i8 d4, d4, d6
2770 vpadd.i8 d8, d8, d10
2771 vpadd.i8 d12, d12, d14
2772 vpadd.i8 d0, d0, d4
2773 vpadd.i8 d8, d8, d12
2774 vpadd.i8 d0, d0, d8
2775 vmov.32 r1, d0[1]
2776 vmov.32 r8, d0[0]
2777 mvn r1, r1
2778 mvn r8, r8
2779 lsrs r1, r1, #0x1
2780 rrx r8, r8 /* shift in last r1 bit while shifting out DC bit */
2781 rbit r1, r1 /* r1 = index1 */
2782 rbit r8, r8 /* r8 = index0 */
2783 ldr r0, [r9, #0x3c0] /* r0 = actbl->ehufco[0xf0] */
2784 str r1, [sp, #0x14] /* index1 > sp + 0x14 */
2785 cmp r8, #0x0
2786 beq 6f
2787 1:
2788 clz r2, r8
2789 add lr, lr, r2, lsl #1
2790 lsl r8, r8, r2
2791 ldrh r1, [lr, #-126]
2792 2:
2793 cmp r2, #0x10
2794 blt 3f
2795 sub r2, r2, #0x10
2796 put_bits r11, r4, r0, r6
2797 cmp r4, #0x10
2798 blt 2b
2799 eor r3, r3, r3
2800 emit_byte r10, r11, r4, r3, r12
2801 emit_byte r10, r11, r4, r3, r12
2802 b 2b
2803 3:
2804 add r2, r1, r2, lsl #4
2805 ldrh r3, [lr, #2]!
2806 ldr r12, [r9, r2, lsl #2]
2807 ldrb r2, [r5, r2]
2808 put_bits r11, r4, r12, r2
2809 checkbuf15 r10, r11, r4, r2, r12
2810 put_bits r11, r4, r3, r1
2811 checkbuf15 r10, r11, r4, r2, r12
2812 lsls r8, r8, #0x1
2813 bne 1b
2814 6:
2815 add r12, sp, #0x20 /* r12 = t1 */
2816 ldr r8, [sp, #0x14] /* r8 = index1 */
2817 adds r12, #0xc0 /* r12 = t2 + (DCTSIZE2/2) */
2818 cmp r8, #0x0
2819 beq 6f
2820 clz r2, r8
2821 sub r12, r12, lr
2822 lsl r8, r8, r2
2823 add r2, r2, r12, lsr #1
2824 add lr, lr, r2, lsl #1
2825 b 7f
2826 1:
2827 clz r2, r8
2828 add lr, lr, r2, lsl #1
2829 lsl r8, r8, r2
2830 7:
2831 ldrh r1, [lr, #-126]
2832 2:
2833 cmp r2, #0x10
2834 blt 3f
2835 sub r2, r2, #0x10
2836 put_bits r11, r4, r0, r6
2837 cmp r4, #0x10
2838 blt 2b
2839 eor r3, r3, r3
2840 emit_byte r10, r11, r4, r3, r12
2841 emit_byte r10, r11, r4, r3, r12
2842 b 2b
2843 3:
2844 add r2, r1, r2, lsl #4
2845 ldrh r3, [lr, #2]!
2846 ldr r12, [r9, r2, lsl #2]
2847 ldrb r2, [r5, r2]
2848 put_bits r11, r4, r12, r2
2849 checkbuf15 r10, r11, r4, r2, r12
2850 put_bits r11, r4, r3, r1
2851 checkbuf15 r10, r11, r4, r2, r12
2852 lsls r8, r8, #0x1
2853 bne 1b
2854 6:
2855 add r0, sp, #0x20
2856 add r0, #0xfe
2857 cmp lr, r0
2858 bhs 1f
2859 ldr r1, [r9]
2860 ldrb r0, [r5]
2861 put_bits r11, r4, r1, r0
2862 checkbuf15 r10, r11, r4, r0, r1
2863 1:
2864 ldr r12, [sp, #0x18]
2865 str r11, [r12, #0x8]
2866 str r4, [r12, #0xc]
2867 add r0, r10, #0x1
2868 add r4, sp, #0x140
2869 vld1.64 {d8, d9, d10, d11}, [r4, :128]!
2870 vld1.64 {d12, d13, d14, d15}, [r4, :128]
2871 sub r4, r7, #0x1c
2872 mov sp, r4
2873 pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
2874
2875 .purgem emit_byte
2876 .purgem put_bits
2877 .purgem checkbuf15
OLDNEW
« simd/jccolext-sse2-64.asm ('K') | « simd/jsimd_arm64_neon.S ('k') | simd/jsimd_i386.c » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698