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 | |
Hamsalekha S | 8d3d303 | 2015-03-13 21:24:58 +0530 | [diff] [blame] | 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 |
| 85 | ih264e_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 | |
| 95 | filter_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 | |
| 256 | ih264e_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 | |
| 288 | filter_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 | |
| 937 | filter_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 | |