blob: 3ae6130001ccc0f25baa9a0db28ae9de246d501e [file] [log] [blame]
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301@/******************************************************************************
2@ *
3@ * Copyright (C) 2015 The Android Open Source Project
4@ *
5@ * Licensed under the Apache License, Version 2.0 (the "License");
6@ * you may not use this file except in compliance with the License.
7@ * You may obtain a copy of the License at:
8@ *
9@ * http://www.apache.org/licenses/LICENSE-2.0
10@ *
11@ * Unless required by applicable law or agreed to in writing, software
12@ * distributed under the License is distributed on an "AS IS" BASIS,
13@ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14@ * See the License for the specific language governing permissions and
15@ * limitations under the License.
16@ *
17@ *****************************************************************************
18@ * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19@*/
20@/**
21@ *******************************************************************************
22@ * @file
23@ * ih264e_half_pel.s
24@ *
25@ * @brief
26@ *
27@ *
28@ * @author
29@ * Ittiam
30@ *
31@ * @par List of Functions:
32@ * ih264e_sixtapfilter_horz
33@ * ih264e_sixtap_filter_2dvh_vert
34@
35@ *
36@ * @remarks
37@ * None
38@ *
39@ *******************************************************************************
40@ */
41
42
43.text
44.p2align 2
45
Hamsalekha S8d3d3032015-03-13 21:24:58 +053046@/*******************************************************************************
47@*
48@* @brief
49@* Interprediction luma filter for horizontal input(Filter run for width = 17 and height =16)
50@*
51@* @par Description:
52@* Applies a 6 tap horizontal filter .The output is clipped to 8 bits
53@* sec 8.4.2.2.1 titled "Luma sample interpolation process"
54@*
55@* @param[in] pu1_src
56@* UWORD8 pointer to the source
57@*
58@* @param[out] pu1_dst
59@* UWORD8 pointer to the destination
60@*
61@* @param[in] src_strd
62@* integer source stride
63@*
64@* @param[in] dst_strd
65@* integer destination stride
66@*
67@*
68@* @returns
69@*
70@* @remarks
71@* None
72@*
73@*******************************************************************************
74@*/
75@void ih264e_sixtapfilter_horz(UWORD8 *pu1_src,
76@ UWORD8 *pu1_dst,
77@ WORD32 src_strd,
78@ WORD32 dst_strd);
79
80
81.equ HALFPEL_WIDTH , 17 + 1 @( make it even, two rows are processed at a time)
82
83
84 .global ih264e_sixtapfilter_horz_a9q
85ih264e_sixtapfilter_horz_a9q:
86 stmfd sp!, {lr}
87
88 vmov.i8 d0, #5
89 sub r0, r0, #2
90
91 vmov.i8 d1, #20
92 mov r14, #HALFPEL_WIDTH
93 vpush {d8-d15}
94
95filter_horz_loop:
96
97
98 vld1.8 {d2, d3, d4}, [r0], r2 @// Load row0
99 vld1.8 {d5, d6, d7}, [r0], r2 @// Load row1
100
101 @// Processing row0 and row1
102
103 vext.8 d31, d2, d3, #5 @//extract a[5] (column1,row0)
104 vext.8 d30, d3, d4, #5 @//extract a[5] (column2,row0)
105
106 vaddl.u8 q4, d31, d2 @// a0 + a5 (column1,row0)
107 vext.8 d29, d4, d4, #5 @//extract a[5] (column3,row0)
108 vaddl.u8 q5, d30, d3 @// a0 + a5 (column2,row0)
109 vext.8 d28, d5, d6, #5 @//extract a[5] (column1,row1)
110 vaddl.u8 q6, d29, d4 @// a0 + a5 (column3,row0)
111 vext.8 d27, d6, d7, #5 @//extract a[5] (column2,row1)
112 vaddl.u8 q7, d28, d5 @// a0 + a5 (column1,row1)
113 vext.8 d26, d7, d7, #5 @//extract a[5] (column3,row1)
114
115 vaddl.u8 q8, d27, d6 @// a0 + a5 (column2,row1)
116 vext.8 d31, d2, d3, #2 @//extract a[2] (column1,row0)
117 vaddl.u8 q9, d26, d7 @// a0 + a5 (column3,row1)
118 vext.8 d30, d3, d4, #2 @//extract a[2] (column2,row0)
119 vmlal.u8 q4, d31, d1 @// a0 + a5 + 20a2 (column1,row0)
120 vext.8 d29, d4, d4, #2 @//extract a[2] (column3,row0)
121 vmlal.u8 q5, d30, d1 @// a0 + a5 + 20a2 (column2,row0)
122 vext.8 d28, d5, d6, #2 @//extract a[2] (column1,row1)
123 vmlal.u8 q6, d29, d1 @// a0 + a5 + 20a2 (column3,row0)
124 vext.8 d27, d6, d7, #2 @//extract a[2] (column2,row1)
125 vmlal.u8 q7, d28, d1 @// a0 + a5 + 20a2 (column1,row1)
126 vext.8 d26, d7, d7, #2 @//extract a[2] (column3,row1)
127
128 vmlal.u8 q8, d27, d1 @// a0 + a5 + 20a2 (column2,row1)
129 vext.8 d31, d2, d3, #3 @//extract a[3] (column1,row0)
130 vmlal.u8 q9, d26, d1 @// a0 + a5 + 20a2 (column3,row1)
131 vext.8 d30, d3, d4, #3 @//extract a[3] (column2,row0)
132 vmlal.u8 q4, d31, d1 @// a0 + a5 + 20a2 + 20a3 (column1,row0)
133 vext.8 d29, d4, d4, #3 @//extract a[3] (column3,row0)
134 vmlal.u8 q5, d30, d1 @// a0 + a5 + 20a2 + 20a3 (column2,row0)
135 vext.8 d28, d5, d6, #3 @//extract a[3] (column1,row1)
136 vmlal.u8 q6, d29, d1 @// a0 + a5 + 20a2 + 20a3 (column3,row0)
137 vext.8 d27, d6, d7, #3 @//extract a[3] (column2,row1)
138 vmlal.u8 q7, d28, d1 @// a0 + a5 + 20a2 + 20a3 (column1,row1)
139 vext.8 d26, d7, d7, #3 @//extract a[3] (column3,row1)
140
141 vmlal.u8 q8, d27, d1 @// a0 + a5 + 20a2 + 20a3 (column2,row1)
142 vext.8 d31, d2, d3, #1 @//extract a[1] (column1,row0)
143 vmlal.u8 q9, d26, d1 @// a0 + a5 + 20a2 + 20a3 (column3,row1)
144 vext.8 d30, d3, d4, #1 @//extract a[1] (column2,row0)
145 vmlsl.u8 q4, d31, d0 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column1,row0)
146 vext.8 d29, d4, d4, #1 @//extract a[1] (column3,row0)
147 vmlsl.u8 q5, d30, d0 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column2,row0)
148 vext.8 d28, d5, d6, #1 @//extract a[1] (column1,row1)
149 vmlsl.u8 q6, d29, d0 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column3,row0)
150 vext.8 d27, d6, d7, #1 @//extract a[1] (column2,row1)
151 vmlsl.u8 q7, d28, d0 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column1,row1)
152 vext.8 d26, d7, d7, #1 @//extract a[1] (column3,row1)
153
154 vmlsl.u8 q8, d27, d0 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column2,row1)
155 vext.8 d31, d2, d3, #4 @//extract a[4] (column1,row0)
156 vmlsl.u8 q9, d26, d0 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column3,row1)
157 vext.8 d30, d3, d4, #4 @//extract a[4] (column2,row0)
158 vmlsl.u8 q4, d31, d0 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column1,row0)
159 vext.8 d29, d4, d4, #4 @//extract a[4] (column3,row0)
160 vmlsl.u8 q5, d30, d0 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column2,row0)
161 vext.8 d28, d5, d6, #4 @//extract a[4] (column1,row1)
162 vmlsl.u8 q6, d29, d0 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column3,row0)
163 vext.8 d27, d6, d7, #4 @//extract a[4] (column2,row1)
164 vmlsl.u8 q7, d28, d0 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column1,row1)
165 vext.8 d26, d7, d7, #4 @//extract a[4] (column3,row1)
166
167 vmlsl.u8 q8, d27, d0 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column2,row1)
168 vmlsl.u8 q9, d26, d0 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column3,row1)
169
170 vqrshrun.s16 d20, q4, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column1,row0)
171 vqrshrun.s16 d21, q5, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column2,row0)
172 vqrshrun.s16 d22, q6, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column3,row0)
173 vqrshrun.s16 d23, q7, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column1,row1)
174 vqrshrun.s16 d24, q8, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column2,row1)
175 vqrshrun.s16 d25, q9, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column3,row1)
176
177 vst1.8 {d20, d21, d22}, [r1], r3 @//Store dest row0
178 vst1.8 {d23, d24, d25}, [r1], r3 @//Store dest row1
179
180 subs r14, r14, #2 @ decrement counter
181
182 bne filter_horz_loop
183
184 vpop {d8-d15}
185 ldmfd sp!, {pc}
186
187
188
189
190
191
192
193
194
195@/**
196@*******************************************************************************
197@*
198@* @brief
199@* This function implements a two stage cascaded six tap filter. It
200@* applies the six tap filter in the vertical direction on the
201@* predictor values, followed by applying the same filter in the
202@* horizontal direction on the output of the first stage. The six tap
203@* filtering operation is described in sec 8.4.2.2.1 titled "Luma sample
204@* interpolation process"
205@* (Filter run for width = 17 and height =17)
206@* @par Description:
207@* The function interpolates
208@* the predictors first in the vertical direction and then in the
209@* horizontal direction to output the (1/2,1/2). The output of the first
210@* stage of the filter is stored in the buffer pointed to by pi16_pred1(only in C)
211@* in 16 bit precision.
212@*
213@*
214@* @param[in] pu1_src
215@* UWORD8 pointer to the source
216@*
217@* @param[out] pu1_dst1
218@* UWORD8 pointer to the destination(vertical filtered output)
219@*
220@* @param[out] pu1_dst2
221@* UWORD8 pointer to the destination(out put after applying horizontal filter to the intermediate vertical output)
222@*
223@* @param[in] src_strd
224@* integer source stride
225@*
226@* @param[in] dst_strd
227@* integer destination stride of pu1_dst
228@*
229@* @param[in]pi16_pred1
230@* Pointer to 16bit intermediate buffer(used only in c)
231@*
232@* @param[in] pi16_pred1_strd
233@* integer destination stride of pi16_pred1
234@*
235@*
236@* @returns
237@*
238@* @remarks
239@* None
240@*
241@*******************************************************************************
242@*/
243@void ih264e_sixtap_filter_2dvh_vert(UWORD8 *pu1_src,
244@ UWORD8 *pu1_dst1,
245@ UWORD8 *pu1_dst2,
246@ WORD32 src_strd,
247@ WORD32 dst_strd,
248@ WORD32 *pi16_pred1,/* Pointer to 16bit intermmediate buffer (used only in c)*/
249@ WORD32 pi16_pred1_strd)
250
251
252
253
254 .global ih264e_sixtap_filter_2dvh_vert_a9q
255
256ih264e_sixtap_filter_2dvh_vert_a9q:
257 stmfd sp!, {r10, r11, r12, lr}
258
259@//r0 - pu1_ref
260@//r3 - u4_ref_width
261 vpush {d8-d15}
262 @// Load six rows for vertical interpolation
263 lsl r12, r3, #1
264 sub r0, r0, r12
265 sub r0, r0, #2
266 vld1.8 {d2, d3, d4}, [r0], r3
267 vld1.8 {d5, d6, d7}, [r0], r3
268 vld1.8 {d8, d9, d10}, [r0], r3
269 mov r12, #5
270 vld1.8 {d11, d12, d13}, [r0], r3
271 mov r14, #20
272 vld1.8 {d14, d15, d16}, [r0], r3
273 vmov.16 d0[0], r12
274 vmov.16 d0[1], r14
275 vld1.8 {d17, d18, d19}, [r0], r3
276 vmov.i8 d1, #20
277
278@// r12 - u2_buff1_width
279@// r14 - u2_buff2_width
280 ldr r12, [sp, #80]
281 add r11, r1, #6
282
283 mov r14, r12
284
285 mov r10, #3 @loop counter
286
287
288filter_2dvh_loop:
289
290 @// ////////////// ROW 1 ///////////////////////
291
292@// Process first vertical interpolated row
293@// each column is
294 vaddl.u8 q10, d2, d17 @// a0 + a5 (column1,row0)
295 vmov.i8 d31, #5
296 vmlal.u8 q10, d8, d1 @// a0 + a5 + 20a2 (column1,row0)
297 vmlal.u8 q10, d11, d1 @// a0 + a5 + 20a2 + 20a3 (column1,row0)
298 vmlsl.u8 q10, d5, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column1,row0)
299 vmlsl.u8 q10, d14, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column1,row0)
300
301
302 vaddl.u8 q11, d3, d18 @// a0 + a5 (column2,row0)
303 vmlal.u8 q11, d9, d1 @// a0 + a5 + 20a2 (column2,row0)
304 vmlal.u8 q11, d12, d1 @// a0 + a5 + 20a2 + 20a3 (column2,row0)
305 vmlsl.u8 q11, d6, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column2,row0)
306 vmlsl.u8 q11, d15, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column2,row0)
307 vext.16 d30, d20, d21, #2 @//extract a[2] (set1)
308
309 vaddl.u8 q12, d4, d19 @// a0 + a5 (column3,row0)
310 vext.16 d29, d20, d21, #3 @//extract a[3] (set1)
311 vmlal.u8 q12, d10, d1 @// a0 + a5 + 20a2 (column3,row0)
312 vmlal.u8 q12, d13, d1 @// a0 + a5 + 20a2 + 20a3 (column3,row0)
313 vmlsl.u8 q12, d7, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column3,row0)
314 vmlsl.u8 q12, d16, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column3,row0)
315
316 vqrshrun.s16 d2, q10, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column1,row0)
317 vext.16 d31, d21, d22, #1 @//extract a[5] (set1)
318 vqrshrun.s16 d3, q11, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column2,row0)
319 vext.16 d28, d20, d21, #1 @//extract a[1] (set1)
320
321 vaddl.s16 q13, d31, d20 @// a0 + a5 (set1)
322 vext.16 d31, d22, d23, #1 @//extract a[5] (set2)
323 vmlal.s16 q13, d30, d0[1] @// a0 + a5 + 20a2 (set1)
324 vmlal.s16 q13, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set1)
325 vmlsl.s16 q13, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set1)
326 vmlsl.s16 q13, d21, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set1)
327 vext.16 d30, d21, d22, #2 @//extract a[2] (set2)
328
329 vqrshrun.s16 d4, q12, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column3,row0)
330 vext.16 d29, d21, d22, #3 @//extract a[3] (set2)
331
332 vext.16 d28, d21, d22, #1 @//extract a[1] (set2)
333 vaddl.s16 q10, d31, d21 @// a0 + a5 (set2)
334 vmlal.s16 q10, d30, d0[1] @// a0 + a5 + 20a2 (set2)
335 vmlal.s16 q10, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set2)
336 vmlsl.s16 q10, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set2)
337 vmlsl.s16 q10, d22, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set2)
338 vext.16 d31, d23, d24, #1 @//extract a[5] (set3)
339
340 vext.8 d2, d2, d3, #2
341 vst1.8 {d3, d4}, [r11], r12 @// store row1 - 1,1/2 grid
342 vst1.8 {d2}, [r1], r12 @// store row1 - 1,1/2 grid
343
344 vext.16 d30, d22, d23, #2 @//extract a[2] (set3)
345 vext.16 d29, d22, d23, #3 @//extract a[3] (set3)
346
347 vaddl.s16 q1, d31, d22 @// a0 + a5 (set3)
348 vext.16 d28, d22, d23, #1 @//extract a[1] (set3)
349 vmlal.s16 q1, d30, d0[1] @// a0 + a5 + 20a2 (set3)
350 vmlal.s16 q1, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set3)
351 vmlsl.s16 q1, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set3)
352 vmlsl.s16 q1, d23, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set3)
353 vext.16 d31, d24, d25, #1 @//extract a[5] (set4)
354
355 vshrn.s32 d21, q10, #8 @// shift by 8 and later we will shift by 2 more with rounding (set2)
356 vext.16 d30, d23, d24, #2 @//extract a[2] (set4)
357 vshrn.s32 d20, q13, #8 @// shift by 8 and later we will shift by 2 more with rounding (set1)
358 vext.16 d29, d23, d24, #3 @//extract a[3] (set4)
359
360 vaddl.s16 q13, d31, d23 @// a0 + a5 (set4)
361 vext.16 d28, d23, d24, #1 @//extract a[1] (set4)
362 vext.16 d31, d25, d25, #1 @//extract a[5] (set5) ;//here only first element in the row is valid
363 vmlal.s16 q13, d30, d0[1] @// a0 + a5 + 20a2 (set4)
364 vmlal.s16 q13, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set4)
365 vmlsl.s16 q13, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set4)
366 vmlsl.s16 q13, d24, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set4)
367 vext.16 d30, d24, d25, #2 @//extract a[2] (set5)
368
369 vaddl.s16 q11, d31, d24 @// a0 + a5 (set5)
370 vext.16 d29, d24, d25, #3 @//extract a[3] (set5)
371
372 vext.16 d31, d24, d25, #1 @//extract a[1] (set5)
373 vshrn.s32 d28, q1, #8 @// shift by 8 and later we will shift by 2 more with rounding (set3)
374
375 vld1.8 {d2, d3, d4}, [r0], r3 @// Load next Row data
376 vmlal.s16 q11, d30, d0[1] @// a0 + a5 + 20a2 (set5)
377 vmlal.s16 q11, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set5)
378 vmlsl.s16 q11, d31, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set5)
379 vmlsl.s16 q11, d25, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set5)
380 vshrn.s32 d29, q13, #8 @// shift by 8 and later we will shift by 2 more with rounding (set4)
381 vqrshrun.s16 d26, q10, #2 @// half,half gird set1,2
382
383
384 @//VQRSHRUN.s16 D27,Q14,#2 ;// half,half gird set3,4
385 @//VSHRN.s32 D28,Q11,#8 ;// shift by 8 and later we will shift by 2 more with rounding (set5)
386
387 @//VQRSHRUN.s16 D28,Q14,#2 ;// half,half gird set5
388
389 @//VST1.8 {D26,D27,D28},[r2],r14 ;// store 1/2,1,2 grif values
390 @// ////////////// ROW 2 ///////////////////////
391
392@// Process first vertical interpolated row
393@// each column is
394 vaddl.u8 q10, d5, d2 @// a0 + a5 (column1,row0)
395 vmov.i8 d31, #5
396 vmlal.u8 q10, d11, d1 @// a0 + a5 + 20a2 (column1,row0)
397 vmlal.u8 q10, d14, d1 @// a0 + a5 + 20a2 + 20a3 (column1,row0)
398 vmlsl.u8 q10, d8, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column1,row0)
399 vmlsl.u8 q10, d17, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column1,row0)
400
401 vqrshrun.s16 d27, q14, #2 @// half,half gird set3,4
402 vshrn.s32 d28, q11, #8 @// shift by 8 and later we will shift by 2 more with rounding (set5)
403
404 vaddl.u8 q11, d6, d3 @// a0 + a5 (column2,row0)
405 vmlal.u8 q11, d12, d1 @// a0 + a5 + 20a2 (column2,row0)
406 vmlal.u8 q11, d15, d1 @// a0 + a5 + 20a2 + 20a3 (column2,row0)
407 vmlsl.u8 q11, d9, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column2,row0)
408 vmlsl.u8 q11, d18, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column2,row0)
409
410 vqrshrun.s16 d28, q14, #2 @// half,half gird set5
411 vext.16 d30, d20, d21, #2 @//extract a[2] (set1)
412
413 vaddl.u8 q12, d7, d4 @// a0 + a5 (column3,row0)
414 vext.16 d29, d20, d21, #3 @//extract a[3] (set1)
415 vmlal.u8 q12, d13, d1 @// a0 + a5 + 20a2 (column3,row0)
416 vmlal.u8 q12, d16, d1 @// a0 + a5 + 20a2 + 20a3 (column3,row0)
417 vmlsl.u8 q12, d10, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column3,row0)
418 vmlsl.u8 q12, d19, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column3,row0)
419 vst1.8 {d26, d27, d28}, [r2], r14 @// store 1/2,1,2 grif values
420
421 vqrshrun.s16 d5, q10, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column1,row0)
422 vext.16 d31, d21, d22, #1 @//extract a[5] (set1)
423 vqrshrun.s16 d6, q11, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column2,row0)
424 vext.16 d28, d20, d21, #1 @//extract a[1] (set1)
425
426 vaddl.s16 q13, d31, d20 @// a0 + a5 (set1)
427 vext.16 d31, d22, d23, #1 @//extract a[5] (set2)
428 vmlal.s16 q13, d30, d0[1] @// a0 + a5 + 20a2 (set1)
429 vmlal.s16 q13, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set1)
430 vmlsl.s16 q13, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set1)
431 vmlsl.s16 q13, d21, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set1)
432 vext.16 d30, d21, d22, #2 @//extract a[2] (set2)
433
434 vqrshrun.s16 d7, q12, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column3,row0)
435 vext.16 d29, d21, d22, #3 @//extract a[3] (set2)
436
437 vext.16 d28, d21, d22, #1 @//extract a[1] (set2)
438 vaddl.s16 q10, d31, d21 @// a0 + a5 (set2)
439 vmlal.s16 q10, d30, d0[1] @// a0 + a5 + 20a2 (set2)
440 vmlal.s16 q10, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set2)
441 vmlsl.s16 q10, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set2)
442 vmlsl.s16 q10, d22, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set2)
443 vext.16 d31, d23, d24, #1 @//extract a[5] (set3)
444
445 vext.8 d5, d5, d6, #2
446 vst1.8 {d6, d7}, [r11], r12 @// store row1 - 1,1/2 grid
447 vst1.8 {d5}, [r1], r12 @// store row1 - 1,1/2 grid
448
449 vext.16 d30, d22, d23, #2 @//extract a[2] (set3)
450 vext.16 d29, d22, d23, #3 @//extract a[3] (set3)
451
452 vaddl.s16 q3, d31, d22 @// a0 + a5 (set3)
453 vext.16 d28, d22, d23, #1 @//extract a[1] (set3)
454 vmlal.s16 q3, d30, d0[1] @// a0 + a5 + 20a2 (set3)
455 vmlal.s16 q3, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set3)
456 vmlsl.s16 q3, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set3)
457 vmlsl.s16 q3, d23, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set3)
458 vext.16 d31, d24, d25, #1 @//extract a[5] (set4)
459
460 vshrn.s32 d21, q10, #8 @// shift by 8 and later we will shift by 2 more with rounding (set2)
461 vext.16 d30, d23, d24, #2 @//extract a[2] (set4)
462 vshrn.s32 d20, q13, #8 @// shift by 8 and later we will shift by 2 more with rounding (set1)
463 vext.16 d29, d23, d24, #3 @//extract a[3] (set4)
464
465 vaddl.s16 q13, d31, d23 @// a0 + a5 (set4)
466 vext.16 d28, d23, d24, #1 @//extract a[1] (set4)
467 vext.16 d31, d25, d25, #1 @//extract a[5] (set5) ;//here only first element in the row is valid
468 vmlal.s16 q13, d30, d0[1] @// a0 + a5 + 20a2 (set4)
469 vmlal.s16 q13, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set4)
470 vmlsl.s16 q13, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set4)
471 vmlsl.s16 q13, d24, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set4)
472 vext.16 d30, d24, d25, #2 @//extract a[2] (set5)
473
474 vaddl.s16 q11, d31, d24 @// a0 + a5 (set5)
475 vext.16 d29, d24, d25, #3 @//extract a[3] (set5)
476
477 vext.16 d31, d24, d25, #1 @//extract a[1] (set5)
478 vshrn.s32 d28, q3, #8 @// shift by 8 and later we will shift by 2 more with rounding (set3)
479
480 vld1.8 {d5, d6, d7}, [r0], r3 @// Load next Row data
481 vmlal.s16 q11, d30, d0[1] @// a0 + a5 + 20a2 (set5)
482 vmlal.s16 q11, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set5)
483 vmlsl.s16 q11, d31, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set5)
484 vmlsl.s16 q11, d25, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set5)
485 vshrn.s32 d29, q13, #8 @// shift by 8 and later we will shift by 2 more with rounding (set4)
486 vqrshrun.s16 d26, q10, #2 @// half,half gird set1,2
487
488
489 @//VQRSHRUN.s16 D27,Q14,#2 ;// half,half gird set3,4
490 @//VSHRN.s32 D28,Q11,#8 ;// shift by 8 and later we will shift by 2 more with rounding (set5)
491
492 @//VQRSHRUN.s16 D28,Q14,#2 ;// half,half gird set5
493
494 @//VST1.8 {D26,D27,D28},[r2],r14 ;// store 1/2,1,2 grif values
495 @// ////////////// ROW 3 ///////////////////////
496
497@// Process first vertical interpolated row
498@// each column is
499 vaddl.u8 q10, d8, d5 @// a0 + a5 (column1,row0)
500 vmov.i8 d31, #5
501 vmlal.u8 q10, d14, d1 @// a0 + a5 + 20a2 (column1,row0)
502 vmlal.u8 q10, d17, d1 @// a0 + a5 + 20a2 + 20a3 (column1,row0)
503 vmlsl.u8 q10, d11, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column1,row0)
504 vmlsl.u8 q10, d2, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column1,row0)
505
506 vqrshrun.s16 d27, q14, #2 @// half,half gird set3,4
507 vshrn.s32 d28, q11, #8 @// shift by 8 and later we will shift by 2 more with rounding (set5)
508
509 vaddl.u8 q11, d9, d6 @// a0 + a5 (column2,row0)
510 vmlal.u8 q11, d15, d1 @// a0 + a5 + 20a2 (column2,row0)
511 vmlal.u8 q11, d18, d1 @// a0 + a5 + 20a2 + 20a3 (column2,row0)
512 vmlsl.u8 q11, d12, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column2,row0)
513 vmlsl.u8 q11, d3, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column2,row0)
514
515 vqrshrun.s16 d28, q14, #2 @// half,half gird set5
516 vext.16 d30, d20, d21, #2 @//extract a[2] (set1)
517
518 vaddl.u8 q12, d10, d7 @// a0 + a5 (column3,row0)
519 vext.16 d29, d20, d21, #3 @//extract a[3] (set1)
520 vmlal.u8 q12, d16, d1 @// a0 + a5 + 20a2 (column3,row0)
521 vmlal.u8 q12, d19, d1 @// a0 + a5 + 20a2 + 20a3 (column3,row0)
522 vmlsl.u8 q12, d13, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column3,row0)
523 vmlsl.u8 q12, d4, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column3,row0)
524
525 vst1.8 {d26, d27, d28}, [r2], r14 @// store 1/2,1,2 grif values
526
527 vqrshrun.s16 d8, q10, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column1,row0)
528 vext.16 d31, d21, d22, #1 @//extract a[5] (set1)
529 vqrshrun.s16 d9, q11, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column2,row0)
530 vext.16 d28, d20, d21, #1 @//extract a[1] (set1)
531
532 vaddl.s16 q13, d31, d20 @// a0 + a5 (set1)
533 vext.16 d31, d22, d23, #1 @//extract a[5] (set2)
534 vmlal.s16 q13, d30, d0[1] @// a0 + a5 + 20a2 (set1)
535 vmlal.s16 q13, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set1)
536 vmlsl.s16 q13, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set1)
537 vmlsl.s16 q13, d21, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set1)
538 vext.16 d30, d21, d22, #2 @//extract a[2] (set2)
539
540 vqrshrun.s16 d10, q12, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column3,row0)
541 vext.16 d29, d21, d22, #3 @//extract a[3] (set2)
542
543 vext.16 d28, d21, d22, #1 @//extract a[1] (set2)
544 vaddl.s16 q10, d31, d21 @// a0 + a5 (set2)
545 vmlal.s16 q10, d30, d0[1] @// a0 + a5 + 20a2 (set2)
546 vmlal.s16 q10, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set2)
547 vmlsl.s16 q10, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set2)
548 vmlsl.s16 q10, d22, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set2)
549 vext.16 d31, d23, d24, #1 @//extract a[5] (set3)
550
551 vext.8 d8, d8, d9, #2
552 vst1.8 {d9, d10}, [r11], r12 @// store row1 - 1,1/2 grid
553 vst1.8 {d8}, [r1], r12 @// store row1 - 1,1/2 grid
554
555 vext.16 d30, d22, d23, #2 @//extract a[2] (set3)
556 vext.16 d29, d22, d23, #3 @//extract a[3] (set3)
557
558 vaddl.s16 q4, d31, d22 @// a0 + a5 (set3)
559 vext.16 d28, d22, d23, #1 @//extract a[1] (set3)
560 vmlal.s16 q4, d30, d0[1] @// a0 + a5 + 20a2 (set3)
561 vmlal.s16 q4, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set3)
562 vmlsl.s16 q4, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set3)
563 vmlsl.s16 q4, d23, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set3)
564 vext.16 d31, d24, d25, #1 @//extract a[5] (set4)
565
566 vshrn.s32 d21, q10, #8 @// shift by 8 and later we will shift by 2 more with rounding (set2)
567 vext.16 d30, d23, d24, #2 @//extract a[2] (set4)
568 vshrn.s32 d20, q13, #8 @// shift by 8 and later we will shift by 2 more with rounding (set1)
569 vext.16 d29, d23, d24, #3 @//extract a[3] (set4)
570
571 vaddl.s16 q13, d31, d23 @// a0 + a5 (set4)
572 vext.16 d28, d23, d24, #1 @//extract a[1] (set4)
573 vext.16 d31, d25, d25, #1 @//extract a[5] (set5) ;//here only first element in the row is valid
574 vmlal.s16 q13, d30, d0[1] @// a0 + a5 + 20a2 (set4)
575 vmlal.s16 q13, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set4)
576 vmlsl.s16 q13, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set4)
577 vmlsl.s16 q13, d24, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set4)
578 vext.16 d30, d24, d25, #2 @//extract a[2] (set5)
579
580 vaddl.s16 q11, d31, d24 @// a0 + a5 (set5)
581 vext.16 d29, d24, d25, #3 @//extract a[3] (set5)
582
583 vext.16 d31, d24, d25, #1 @//extract a[1] (set5)
584 vshrn.s32 d28, q4, #8 @// shift by 8 and later we will shift by 2 more with rounding (set3)
585
586 vld1.8 {d8, d9, d10}, [r0], r3 @// Load next Row data
587 vmlal.s16 q11, d30, d0[1] @// a0 + a5 + 20a2 (set5)
588 vmlal.s16 q11, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set5)
589 vmlsl.s16 q11, d31, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set5)
590 vmlsl.s16 q11, d25, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set5)
591 vshrn.s32 d29, q13, #8 @// shift by 8 and later we will shift by 2 more with rounding (set4)
592 vqrshrun.s16 d26, q10, #2 @// half,half gird set1,2
593
594
595 @//VQRSHRUN.s16 D27,Q14,#2 ;// half,half gird set3,4
596 @//VSHRN.s32 D28,Q11,#8 ;// shift by 8 and later we will shift by 2 more with rounding (set5)
597
598 @//VQRSHRUN.s16 D28,Q14,#2 ;// half,half gird set5
599
600 @//VST1.8 {D26,D27,D28},[r2],r14 ;// store 1/2,1,2 grif values
601 @// ////////////// ROW 4 ///////////////////////
602
603@// Process first vertical interpolated row
604@// each column is
605 vaddl.u8 q10, d11, d8 @// a0 + a5 (column1,row0)
606 vmov.i8 d31, #5
607 vmlal.u8 q10, d17, d1 @// a0 + a5 + 20a2 (column1,row0)
608 vmlal.u8 q10, d2, d1 @// a0 + a5 + 20a2 + 20a3 (column1,row0)
609 vmlsl.u8 q10, d14, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column1,row0)
610 vmlsl.u8 q10, d5, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column1,row0)
611
612 vqrshrun.s16 d27, q14, #2 @// half,half gird set3,4
613 vshrn.s32 d28, q11, #8 @// shift by 8 and later we will shift by 2 more with rounding (set5)
614
615 vaddl.u8 q11, d12, d9 @// a0 + a5 (column2,row0)
616 vmlal.u8 q11, d18, d1 @// a0 + a5 + 20a2 (column2,row0)
617 vmlal.u8 q11, d3, d1 @// a0 + a5 + 20a2 + 20a3 (column2,row0)
618 vmlsl.u8 q11, d15, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column2,row0)
619 vmlsl.u8 q11, d6, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column2,row0)
620
621 vqrshrun.s16 d28, q14, #2 @// half,half gird set5
622 vext.16 d30, d20, d21, #2 @//extract a[2] (set1)
623
624 vaddl.u8 q12, d13, d10 @// a0 + a5 (column3,row0)
625 vext.16 d29, d20, d21, #3 @//extract a[3] (set1)
626 vmlal.u8 q12, d19, d1 @// a0 + a5 + 20a2 (column3,row0)
627 vmlal.u8 q12, d4, d1 @// a0 + a5 + 20a2 + 20a3 (column3,row0)
628 vmlsl.u8 q12, d16, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column3,row0)
629 vmlsl.u8 q12, d7, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column3,row0)
630
631 vst1.8 {d26, d27, d28}, [r2], r14 @// store 1/2,1,2 grif values
632
633 vqrshrun.s16 d11, q10, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column1,row0)
634 vext.16 d31, d21, d22, #1 @//extract a[5] (set1)
635 vqrshrun.s16 d12, q11, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column2,row0)
636 vext.16 d28, d20, d21, #1 @//extract a[1] (set1)
637
638 vaddl.s16 q13, d31, d20 @// a0 + a5 (set1)
639 vext.16 d31, d22, d23, #1 @//extract a[5] (set2)
640 vmlal.s16 q13, d30, d0[1] @// a0 + a5 + 20a2 (set1)
641 vmlal.s16 q13, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set1)
642 vmlsl.s16 q13, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set1)
643 vmlsl.s16 q13, d21, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set1)
644 vext.16 d30, d21, d22, #2 @//extract a[2] (set2)
645
646 vqrshrun.s16 d13, q12, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column3,row0)
647 vext.16 d29, d21, d22, #3 @//extract a[3] (set2)
648
649 vext.16 d28, d21, d22, #1 @//extract a[1] (set2)
650 vaddl.s16 q10, d31, d21 @// a0 + a5 (set2)
651 vmlal.s16 q10, d30, d0[1] @// a0 + a5 + 20a2 (set2)
652 vmlal.s16 q10, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set2)
653 vmlsl.s16 q10, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set2)
654 vmlsl.s16 q10, d22, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set2)
655 vext.16 d31, d23, d24, #1 @//extract a[5] (set3)
656
657 vext.8 d11, d11, d12, #2
658 vst1.8 {d12, d13}, [r11], r12 @// store row1 - 1,1/2 grid
659 vst1.8 {d11}, [r1], r12 @// store row1 - 1,1/2 grid
660
661 vext.16 d30, d22, d23, #2 @//extract a[2] (set3)
662 vext.16 d29, d22, d23, #3 @//extract a[3] (set3)
663
664 vaddl.s16 q6, d31, d22 @// a0 + a5 (set3)
665 vext.16 d28, d22, d23, #1 @//extract a[1] (set3)
666 vmlal.s16 q6, d30, d0[1] @// a0 + a5 + 20a2 (set3)
667 vmlal.s16 q6, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set3)
668 vmlsl.s16 q6, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set3)
669 vmlsl.s16 q6, d23, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set3)
670 vext.16 d31, d24, d25, #1 @//extract a[5] (set4)
671
672 vshrn.s32 d21, q10, #8 @// shift by 8 and later we will shift by 2 more with rounding (set2)
673 vext.16 d30, d23, d24, #2 @//extract a[2] (set4)
674 vshrn.s32 d20, q13, #8 @// shift by 8 and later we will shift by 2 more with rounding (set1)
675 vext.16 d29, d23, d24, #3 @//extract a[3] (set4)
676
677 vaddl.s16 q13, d31, d23 @// a0 + a5 (set4)
678 vext.16 d28, d23, d24, #1 @//extract a[1] (set4)
679 vext.16 d31, d25, d25, #1 @//extract a[5] (set5) ;//here only first element in the row is valid
680 vmlal.s16 q13, d30, d0[1] @// a0 + a5 + 20a2 (set4)
681 vmlal.s16 q13, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set4)
682 vmlsl.s16 q13, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set4)
683 vmlsl.s16 q13, d24, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set4)
684 vext.16 d30, d24, d25, #2 @//extract a[2] (set5)
685
686 vaddl.s16 q11, d31, d24 @// a0 + a5 (set5)
687 vext.16 d29, d24, d25, #3 @//extract a[3] (set5)
688
689 vext.16 d31, d24, d25, #1 @//extract a[1] (set5)
690 vshrn.s32 d28, q6, #8 @// shift by 8 and later we will shift by 2 more with rounding (set3)
691
692 vld1.8 {d11, d12, d13}, [r0], r3 @// Load next Row data
693 vmlal.s16 q11, d30, d0[1] @// a0 + a5 + 20a2 (set5)
694 vmlal.s16 q11, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set5)
695 vmlsl.s16 q11, d31, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set5)
696 vmlsl.s16 q11, d25, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set5)
697 vshrn.s32 d29, q13, #8 @// shift by 8 and later we will shift by 2 more with rounding (set4)
698 vqrshrun.s16 d26, q10, #2 @// half,half gird set1,2
699
700
701 @//VQRSHRUN.s16 D27,Q14,#2 ;// half,half gird set3,4
702 @//VSHRN.s32 D28,Q11,#8 ;// shift by 8 and later we will shift by 2 more with rounding (set5)
703
704 @//VQRSHRUN.s16 D28,Q14,#2 ;// half,half gird set5
705
706 @//VST1.8 {D26,D27,D28},[r2],r14 ;// store 1/2,1,2 grif values
707 @// ////////////// ROW 5 ///////////////////////
708
709@// Process first vertical interpolated row
710@// each column is
711 vaddl.u8 q10, d14, d11 @// a0 + a5 (column1,row0)
712 vmov.i8 d31, #5
713 vmlal.u8 q10, d2, d1 @// a0 + a5 + 20a2 (column1,row0)
714 vmlal.u8 q10, d5, d1 @// a0 + a5 + 20a2 + 20a3 (column1,row0)
715 vmlsl.u8 q10, d17, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column1,row0)
716 vmlsl.u8 q10, d8, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column1,row0)
717
718 vqrshrun.s16 d27, q14, #2 @// half,half gird set3,4
719 vshrn.s32 d28, q11, #8 @// shift by 8 and later we will shift by 2 more with rounding (set5)
720
721 vaddl.u8 q11, d15, d12 @// a0 + a5 (column2,row0)
722 vmlal.u8 q11, d3, d1 @// a0 + a5 + 20a2 (column2,row0)
723 vmlal.u8 q11, d6, d1 @// a0 + a5 + 20a2 + 20a3 (column2,row0)
724 vmlsl.u8 q11, d18, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column2,row0)
725 vmlsl.u8 q11, d9, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column2,row0)
726
727 vqrshrun.s16 d28, q14, #2 @// half,half gird set5
728 vext.16 d30, d20, d21, #2 @//extract a[2] (set1)
729
730 vaddl.u8 q12, d16, d13 @// a0 + a5 (column3,row0)
731 vext.16 d29, d20, d21, #3 @//extract a[3] (set1)
732 vmlal.u8 q12, d4, d1 @// a0 + a5 + 20a2 (column3,row0)
733 vmlal.u8 q12, d7, d1 @// a0 + a5 + 20a2 + 20a3 (column3,row0)
734 vmlsl.u8 q12, d19, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column3,row0)
735 vmlsl.u8 q12, d10, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column3,row0)
736
737 vst1.8 {d26, d27, d28}, [r2], r14 @// store 1/2,1,2 grif values
738
739 vqrshrun.s16 d14, q10, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column1,row0)
740 vext.16 d31, d21, d22, #1 @//extract a[5] (set1)
741 vqrshrun.s16 d15, q11, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column2,row0)
742 vext.16 d28, d20, d21, #1 @//extract a[1] (set1)
743
744 vaddl.s16 q13, d31, d20 @// a0 + a5 (set1)
745 vext.16 d31, d22, d23, #1 @//extract a[5] (set2)
746 vmlal.s16 q13, d30, d0[1] @// a0 + a5 + 20a2 (set1)
747 vmlal.s16 q13, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set1)
748 vmlsl.s16 q13, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set1)
749 vmlsl.s16 q13, d21, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set1)
750 vext.16 d30, d21, d22, #2 @//extract a[2] (set2)
751
752 vqrshrun.s16 d16, q12, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column3,row0)
753 vext.16 d29, d21, d22, #3 @//extract a[3] (set2)
754
755 vext.16 d28, d21, d22, #1 @//extract a[1] (set2)
756 vaddl.s16 q10, d31, d21 @// a0 + a5 (set2)
757 vmlal.s16 q10, d30, d0[1] @// a0 + a5 + 20a2 (set2)
758 vmlal.s16 q10, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set2)
759 vmlsl.s16 q10, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set2)
760 vmlsl.s16 q10, d22, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set2)
761 vext.16 d31, d23, d24, #1 @//extract a[5] (set3)
762
763 vext.8 d14, d14, d15, #2
764 vst1.8 {d15, d16}, [r11], r12 @// store row1 - 1,1/2 grid
765 vst1.8 {d14}, [r1], r12 @// store row1 - 1,1/2 grid
766
767 vext.16 d30, d22, d23, #2 @//extract a[2] (set3)
768 vext.16 d29, d22, d23, #3 @//extract a[3] (set3)
769
770 vaddl.s16 q7, d31, d22 @// a0 + a5 (set3)
771 vext.16 d28, d22, d23, #1 @//extract a[1] (set3)
772 vmlal.s16 q7, d30, d0[1] @// a0 + a5 + 20a2 (set3)
773 vmlal.s16 q7, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set3)
774 vmlsl.s16 q7, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set3)
775 vmlsl.s16 q7, d23, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set3)
776 vext.16 d31, d24, d25, #1 @//extract a[5] (set4)
777
778 vshrn.s32 d21, q10, #8 @// shift by 8 and later we will shift by 2 more with rounding (set2)
779 vext.16 d30, d23, d24, #2 @//extract a[2] (set4)
780 vshrn.s32 d20, q13, #8 @// shift by 8 and later we will shift by 2 more with rounding (set1)
781 vext.16 d29, d23, d24, #3 @//extract a[3] (set4)
782
783 vaddl.s16 q13, d31, d23 @// a0 + a5 (set4)
784 vext.16 d28, d23, d24, #1 @//extract a[1] (set4)
785 vext.16 d31, d25, d25, #1 @//extract a[5] (set5) ;//here only first element in the row is valid
786 vmlal.s16 q13, d30, d0[1] @// a0 + a5 + 20a2 (set4)
787 vmlal.s16 q13, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set4)
788 vmlsl.s16 q13, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set4)
789 vmlsl.s16 q13, d24, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set4)
790 vext.16 d30, d24, d25, #2 @//extract a[2] (set5)
791
792 vaddl.s16 q11, d31, d24 @// a0 + a5 (set5)
793 vext.16 d29, d24, d25, #3 @//extract a[3] (set5)
794
795 vext.16 d31, d24, d25, #1 @//extract a[1] (set5)
796 vshrn.s32 d28, q7, #8 @// shift by 8 and later we will shift by 2 more with rounding (set3)
797
798 vld1.8 {d14, d15, d16}, [r0], r3 @// Load next Row data
799 vmlal.s16 q11, d30, d0[1] @// a0 + a5 + 20a2 (set5)
800 vmlal.s16 q11, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set5)
801 vmlsl.s16 q11, d31, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set5)
802 vmlsl.s16 q11, d25, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set5)
803 vshrn.s32 d29, q13, #8 @// shift by 8 and later we will shift by 2 more with rounding (set4)
804 vqrshrun.s16 d26, q10, #2 @// half,half gird set1,2
805
806
807 @//VQRSHRUN.s16 D27,Q14,#2 ;// half,half gird set3,4
808 @//VSHRN.s32 D28,Q11,#8 ;// shift by 8 and later we will shift by 2 more with rounding (set5)
809
810 @//VQRSHRUN.s16 D28,Q14,#2 ;// half,half gird set5
811
812 @//VST1.8 {D26,D27,D28},[r2],r14 ;// store 1/2,1,2 grif values
813 @// ////////////// ROW 6 ///////////////////////
814
815@// Process first vertical interpolated row
816@// each column is
817
818 cmp r10, #1 @// if it 17 rows are complete skip
819 beq filter_2dvh_skip_row
820 vaddl.u8 q10, d17, d14 @// a0 + a5 (column1,row0)
821 vmov.i8 d31, #5
822 vmlal.u8 q10, d5, d1 @// a0 + a5 + 20a2 (column1,row0)
823 vmlal.u8 q10, d8, d1 @// a0 + a5 + 20a2 + 20a3 (column1,row0)
824 vmlsl.u8 q10, d2, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column1,row0)
825 vmlsl.u8 q10, d11, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column1,row0)
826
827 vqrshrun.s16 d27, q14, #2 @// half,half gird set3,4
828 vshrn.s32 d28, q11, #8 @// shift by 8 and later we will shift by 2 more with rounding (set5)
829
830 vaddl.u8 q11, d18, d15 @// a0 + a5 (column2,row0)
831 vmlal.u8 q11, d6, d1 @// a0 + a5 + 20a2 (column2,row0)
832 vmlal.u8 q11, d9, d1 @// a0 + a5 + 20a2 + 20a3 (column2,row0)
833 vmlsl.u8 q11, d3, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column2,row0)
834 vmlsl.u8 q11, d12, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column2,row0)
835
836 vqrshrun.s16 d28, q14, #2 @// half,half gird set5
837 vext.16 d30, d20, d21, #2 @//extract a[2] (set1)
838
839 vaddl.u8 q12, d19, d16 @// a0 + a5 (column3,row0)
840 vext.16 d29, d20, d21, #3 @//extract a[3] (set1)
841 vmlal.u8 q12, d7, d1 @// a0 + a5 + 20a2 (column3,row0)
842 vmlal.u8 q12, d10, d1 @// a0 + a5 + 20a2 + 20a3 (column3,row0)
843 vmlsl.u8 q12, d4, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 (column3,row0)
844 vmlsl.u8 q12, d13, d31 @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (column3,row0)
845
846 vst1.8 {d26, d27, d28}, [r2], r14 @// store 1/2,1,2 grif values
847
848 vqrshrun.s16 d17, q10, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column1,row0)
849 vext.16 d31, d21, d22, #1 @//extract a[5] (set1)
850 vqrshrun.s16 d18, q11, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column2,row0)
851 vext.16 d28, d20, d21, #1 @//extract a[1] (set1)
852
853 vaddl.s16 q13, d31, d20 @// a0 + a5 (set1)
854 vext.16 d31, d22, d23, #1 @//extract a[5] (set2)
855 vmlal.s16 q13, d30, d0[1] @// a0 + a5 + 20a2 (set1)
856 vmlal.s16 q13, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set1)
857 vmlsl.s16 q13, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set1)
858 vmlsl.s16 q13, d21, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set1)
859 vext.16 d30, d21, d22, #2 @//extract a[2] (set2)
860
861 vqrshrun.s16 d19, q12, #5 @// (a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 + 16) >> 5 (column3,row0)
862 vext.16 d29, d21, d22, #3 @//extract a[3] (set2)
863
864 vext.16 d28, d21, d22, #1 @//extract a[1] (set2)
865 vaddl.s16 q10, d31, d21 @// a0 + a5 (set2)
866 vmlal.s16 q10, d30, d0[1] @// a0 + a5 + 20a2 (set2)
867 vmlal.s16 q10, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set2)
868 vmlsl.s16 q10, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set2)
869 vmlsl.s16 q10, d22, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set2)
870 vext.16 d31, d23, d24, #1 @//extract a[5] (set3)
871
872 vext.8 d17, d17, d18, #2
873 vst1.8 {d18, d19}, [r11], r12 @// store row1 - 1,1/2 grid
874 vst1.8 {d17}, [r1], r12 @// store row1 - 1,1/2 grid
875
876 vext.16 d30, d22, d23, #2 @//extract a[2] (set3)
877 vext.16 d29, d22, d23, #3 @//extract a[3] (set3)
878
879 vaddl.s16 q9, d31, d22 @// a0 + a5 (set3)
880 vext.16 d28, d22, d23, #1 @//extract a[1] (set3)
881 vmlal.s16 q9, d30, d0[1] @// a0 + a5 + 20a2 (set3)
882 vmlal.s16 q9, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set3)
883 vmlsl.s16 q9, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set3)
884 vmlsl.s16 q9, d23, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set3)
885 vext.16 d31, d24, d25, #1 @//extract a[5] (set4)
886
887 vshrn.s32 d21, q10, #8 @// shift by 8 and later we will shift by 2 more with rounding (set2)
888 vext.16 d30, d23, d24, #2 @//extract a[2] (set4)
889 vshrn.s32 d20, q13, #8 @// shift by 8 and later we will shift by 2 more with rounding (set1)
890 vext.16 d29, d23, d24, #3 @//extract a[3] (set4)
891
892 vaddl.s16 q13, d31, d23 @// a0 + a5 (set4)
893 vext.16 d28, d23, d24, #1 @//extract a[1] (set4)
894 vext.16 d31, d25, d25, #1 @//extract a[5] (set5) ;//here only first element in the row is valid
895 vmlal.s16 q13, d30, d0[1] @// a0 + a5 + 20a2 (set4)
896 vmlal.s16 q13, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set4)
897 vmlsl.s16 q13, d28, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set4)
898 vmlsl.s16 q13, d24, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set4)
899 vext.16 d30, d24, d25, #2 @//extract a[2] (set5)
900
901 vaddl.s16 q11, d31, d24 @// a0 + a5 (set5)
902 vext.16 d29, d24, d25, #3 @//extract a[3] (set5)
903
904 vext.16 d31, d24, d25, #1 @//extract a[1] (set5)
905 vshrn.s32 d28, q9, #8 @// shift by 8 and later we will shift by 2 more with rounding (set3)
906
907 vld1.8 {d17, d18, d19}, [r0], r3 @// Load next Row data
908 vmlal.s16 q11, d30, d0[1] @// a0 + a5 + 20a2 (set5)
909 vmlal.s16 q11, d29, d0[1] @// a0 + a5 + 20a2 + 20a3 (set5)
910 vmlsl.s16 q11, d31, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 (set5)
911 vmlsl.s16 q11, d25, d0[0] @// a0 + a5 + 20a2 + 20a3 - 5a1 - 5a4 (set5)
912 vshrn.s32 d29, q13, #8 @// shift by 8 and later we will shift by 2 more with rounding (set4)
913 vqrshrun.s16 d26, q10, #2 @// half,half gird set1,2
914
915
916 vqrshrun.s16 d27, q14, #2 @// half,half gird set3,4
917 vshrn.s32 d28, q11, #8 @// shift by 8 and later we will shift by 2 more with rounding (set5)
918
919 vqrshrun.s16 d28, q14, #2 @// half,half gird set5
920
921 vst1.8 {d26, d27, d28}, [r2], r14 @// store 1/2,1,2 grif values
922
923 subs r10, r10, #1 @//decrement loop counter
924
925 bne filter_2dvh_loop
926
927
928@// Process first vertical interpolated row
929@// each column is
930 @// ////////////// ROW 13 ///////////////////////
931
932@// Process first vertical interpolated row
933@// each column is
934 vpop {d8-d15}
935 ldmfd sp!, {r10, r11, r12, pc}
936
937filter_2dvh_skip_row:
938
939 vqrshrun.s16 d27, q14, #2 @// half,half gird set3,4
940 vshrn.s32 d28, q11, #8 @// shift by 8 and later we will shift by 2 more with rounding (set5)
941
942 vqrshrun.s16 d28, q14, #2 @// half,half gird set5
943
944 vst1.8 {d26, d27, d28}, [r2], r14 @// store 1/2,1,2 grif values
945 vpop {d8-d15}
946 ldmfd sp!, {r10, r11, r12, pc}
947
948
949
950