1@/******************************************************************************
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@* @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
951