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