OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |