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