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