1 @/***************************************************************************** 2 @* 3 @* Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore 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 @/** 19 @******************************************************************************* 20 @* @file 21 @* ihevc_intra_pred_filters_vert.s 22 @* 23 @* @brief 24 @* contains function definitions for intra prediction dc filtering. 25 @* functions are coded using neon intrinsics and can be compiled using 26 27 @* rvct 28 @* 29 @* @author 30 @* akshaya mukund 31 @* 32 @* @par list of functions: 33 @* 34 @* 35 @* @remarks 36 @* none 37 @* 38 @******************************************************************************* 39 @*/ 40 @/** 41 @******************************************************************************* 42 @* 43 @* @brief 44 @* luma intraprediction filter for dc input 45 @* 46 @* @par description: 47 @* 48 @* @param[in] pu1_ref 49 @* uword8 pointer to the source 50 @* 51 @* @param[out] pu1_dst 52 @* uword8 pointer to the destination 53 @* 54 @* @param[in] src_strd 55 @* integer source stride 56 @* 57 @* @param[in] dst_strd 58 @* integer destination stride 59 @* 60 @* @param[in] nt 61 @* size of tranform block 62 @* 63 @* @param[in] mode 64 @* type of filtering 65 @* 66 @* @returns 67 @* 68 @* @remarks 69 @* none 70 @* 71 @******************************************************************************* 72 @*/ 73 74 @void ihevc_intra_pred_luma_ver(uword8* pu1_ref, 75 @ word32 src_strd, 76 @ uword8* pu1_dst, 77 @ word32 dst_strd, 78 @ word32 nt, 79 @ word32 mode) 80 @ 81 @**************variables vs registers***************************************** 82 @r0 => *pu1_ref 83 @r1 => src_strd 84 @r2 => *pu1_dst 85 @r3 => dst_strd 86 87 @stack contents from #40 88 @ nt 89 @ mode 90 91 .text 92 .align 4 93 94 95 96 97 .globl ihevc_intra_pred_luma_ver_a9q 98 99 .type ihevc_intra_pred_luma_ver_a9q, %function 100 101 ihevc_intra_pred_luma_ver_a9q: 102 103 stmfd sp!, {r4-r12, r14} @stack stores the values of the arguments 104 105 ldr r4,[sp,#40] @loads nt 106 107 lsl r5, r4, #1 @2nt 108 109 cmp r4, #16 110 beq blk_16 111 blt blk_4_8 112 113 add r5, r5, #1 @2nt+1 114 add r6, r0, r5 @&src[2nt+1] 115 116 copy_32: 117 add r5, r2, r3 118 vld1.8 {d20,d21}, [r6]! @16 loads (col 0:15) 119 add r8, r5, r3 120 121 add r10, r8, r3 122 vld1.8 {d22,d23}, [r6] @16 loads (col 16:31) 123 lsl r11, r3, #2 124 125 add r11, r11, #0xfffffff0 126 vst1.8 {d20,d21}, [r2]! 127 vst1.8 {d20,d21}, [r5]! 128 vst1.8 {d20,d21}, [r8]! 129 vst1.8 {d20,d21}, [r10]! 130 131 vst1.8 {d22,d23}, [r2], r11 132 vst1.8 {d22,d23}, [r5], r11 133 vst1.8 {d22,d23}, [r8], r11 134 vst1.8 {d22,d23}, [r10], r11 135 136 subs r4, r4, #8 137 138 kernel_copy_32: 139 vst1.8 {d20,d21}, [r2]! 140 vst1.8 {d20,d21}, [r5]! 141 vst1.8 {d20,d21}, [r8]! 142 vst1.8 {d20,d21}, [r10]! 143 144 vst1.8 {d22,d23}, [r2], r11 145 vst1.8 {d22,d23}, [r5], r11 146 vst1.8 {d22,d23}, [r8], r11 147 vst1.8 {d22,d23}, [r10], r11 148 149 subs r4, r4, #8 150 151 vst1.8 {d20,d21}, [r2]! 152 vst1.8 {d20,d21}, [r5]! 153 vst1.8 {d20,d21}, [r8]! 154 vst1.8 {d20,d21}, [r10]! 155 156 vst1.8 {d22,d23}, [r2], r11 157 vst1.8 {d22,d23}, [r5], r11 158 vst1.8 {d22,d23}, [r8], r11 159 vst1.8 {d22,d23}, [r10], r11 160 161 bne kernel_copy_32 162 163 vst1.8 {d20,d21}, [r2]! 164 vst1.8 {d20,d21}, [r5]! 165 vst1.8 {d20,d21}, [r8]! 166 vst1.8 {d20,d21}, [r10]! 167 168 vst1.8 {d22,d23}, [r2], r11 169 vst1.8 {d22,d23}, [r5], r11 170 vst1.8 {d22,d23}, [r8], r11 171 vst1.8 {d22,d23}, [r10], r11 172 173 b end_func 174 175 blk_16: 176 add r6, r0, r5 @&src[2nt] 177 178 ldrb r11, [r6], #1 @src[2nt] 179 180 vdup.8 q11, r11 @src[2nt] 181 ldrb r12, [r6] @src[2nt+1] 182 183 vld1.8 {d16,d17}, [r6] @ld for repl to cols src[2nt+1+col(0:15)] (0 ignored for stores) 184 add r6, r6, #0xffffffef @subtract -9 to take it to src[2nt-1-row(15)] 185 186 vdup.8 q12, r12 @src[2nt+1] 187 vdup.16 q15, r12 188 lsl r5, r3, #3 @8*stride 189 190 vld1.8 {d26,d27}, [r6]! @load src[2nt-1-row](rows 0:15) 191 add r5, r2, r5 @r5 -> 192 193 vmov.i64 d18, #0x00000000000000ff 194 vhsub.u8 q13, q13, q11 @(src[2nt-1-row] - src[2nt])>>1 195 @vsubl.u8 q0, d26, d22 196 @vsubl.u8 q14, d27, d22 197 198 @vshr.s16 q0, q0, #1 199 @vshr.s16 q14, q14, #1 200 201 vmov.i64 d19, d17 202 @vaddl.s8 q0, d24, d26 203 vmovl.s8 q0, d26 204 vmovl.s8 q14, d27 205 vqadd.s16 q0, q0, q15 206 vqadd.s16 q14, q14, q15 207 208 vmov.i64 d10, #0x00000000000000ff 209 @vaddl.s8 q1, d25, d27 210 211 vqmovun.s16 d25, q0 212 vqmovun.s16 d24, q14 213 @vmovn.u16 d25, q0 214 @vmovn.u16 d24, q1 215 216 217 vrev64.8 q12, q12 218 219 vmov.i64 d11, d17 220 221 vbsl d18, d24, d16 @only select row values from q12(predpixel) 222 vbsl d10, d25, d16 223 224 vmov.i64 d8, #0x00000000000000ff 225 vmov.i64 d9, d17 226 227 vmov.i64 d6, #0x00000000000000ff 228 vmov.i64 d7, d17 229 230 vst1.8 {d18,d19}, [r2], r3 231 vshr.s64 d24, d24, #8 232 233 vst1.8 {d10,d11}, [r5], r3 234 vshr.s64 d25, d25, #8 235 236 237 vbsl d8, d24, d16 238 vbsl d6, d25, d16 239 240 vst1.8 {d8,d9}, [r2], r3 241 vshr.s64 d24, d24, #8 242 243 vst1.8 {d6,d7}, [r5], r3 244 vshr.s64 d25, d25, #8 245 246 subs r4, #8 247 248 vmov.i64 d18, #0x00000000000000ff 249 @vmov.i64 d19, d17 250 251 vmov.i64 d10, #0x00000000000000ff 252 @vmov.i64 d11, d17 253 254 255 loop_16: 256 257 258 vmov.i64 d8, #0x00000000000000ff 259 260 vmov.i64 d6, #0x00000000000000ff 261 262 vbsl d18, d24, d16 @only select row values from q12(predpixel) 263 vbsl d10, d25, d16 264 265 vst1.8 {d18,d19}, [r2], r3 266 vshr.s64 d24, d24, #8 267 268 vst1.8 {d10,d11}, [r5], r3 269 vshr.s64 d25, d25, #8 270 271 vmov.i64 d18, #0x00000000000000ff 272 273 vmov.i64 d10, #0x00000000000000ff 274 275 vbsl d8, d24, d16 276 vbsl d6, d25, d16 277 278 vst1.8 {d8,d9}, [r2], r3 279 vshr.s64 d24, d24, #8 280 281 vst1.8 {d6,d7}, [r5], r3 282 vshr.s64 d25, d25, #8 283 284 subs r4, r4, #4 285 286 bne loop_16 287 288 vmov.i64 d8, #0x00000000000000ff 289 290 vmov.i64 d6, #0x00000000000000ff 291 292 vbsl d18, d24, d16 @only select row values from q12(predpixel) 293 vbsl d10, d25, d16 294 295 vst1.8 {d18,d19}, [r2], r3 296 vshr.s64 d24, d24, #8 297 298 vst1.8 {d10,d11}, [r5], r3 299 vshr.s64 d25, d25, #8 300 301 vbsl d8, d24, d16 302 vbsl d6, d25, d16 303 304 vst1.8 {d8,d9}, [r2], r3 305 306 vst1.8 {d6,d7}, [r5], r3 307 308 b end_func 309 310 311 blk_4_8: 312 vmov.i64 d11, #0x00000000000000ff 313 add r6, r0, r5 @&src[2nt] 314 315 vmov.i64 d10, #0x00000000000000ff 316 ldrb r11, [r6], #1 @src[2nt] 317 318 vdup.8 d22, r11 @src[2nt] 319 ldrb r12, [r6] @src[2nt+1] 320 321 vld1.8 d16, [r6] @ld for repl to cols src[2nt+1+col(0:3 or 0:7)](0 ignored for st) 322 add r6, r6, #0xfffffff7 @subtract -9 to take it to src[2nt-1-row(15)] 323 324 vdup.8 d24, r12 @src[2nt+1] 325 vdup.16 q15, r12 326 327 vld1.8 d26, [r6]! @load src[2nt-1-row](rows 0:15) 328 329 vmov.i64 d18, #0x00000000000000ff 330 vhsub.u8 d26, d26, d22 @(src[2nt-1-row] - src[2nt])>>1 331 @vsubl.u8 q13, d26, d22 332 333 @vshr.s16 q13, q13, #1 334 335 vmov.i64 d19, #0x00000000000000ff 336 vmovl.s8 q13, d26 337 @vaddl.s8 q0, d24, d26 338 vqadd.s16 q0, q13, q15 339 340 vqmovun.s16 d24, q0 341 @vmovn.s16 d24, q0 342 343 vrev64.8 d24, d24 344 345 cmp r4, #4 346 beq blk_4 347 348 vbsl d18, d24, d16 @only select row values from q12(predpixel) 349 350 vst1.8 d18, [r2], r3 351 vshr.s64 d24, d24, #8 352 353 vmov.i64 d18, #0x00000000000000ff 354 355 vbsl d19, d24, d16 356 357 vst1.8 d19, [r2], r3 358 vshr.s64 d24, d24, #8 359 360 vmov.i64 d19, #0x00000000000000ff 361 362 vbsl d10, d24, d16 363 364 vst1.8 d10, [r2], r3 365 vshr.s64 d24, d24, #8 366 367 vmov.i64 d10, #0x00000000000000ff 368 369 vbsl d11, d24, d16 370 371 vst1.8 d11, [r2], r3 372 vshr.s64 d24, d24, #8 373 374 vmov.i64 d11, #0x00000000000000ff 375 376 vbsl d18, d24, d16 @only select row values from q12(predpixel) 377 378 vst1.8 d18, [r2], r3 379 vshr.s64 d24, d24, #8 380 381 vbsl d19, d24, d16 382 383 vst1.8 d19, [r2], r3 384 vshr.s64 d24, d24, #8 385 386 vbsl d10, d24, d16 387 388 vst1.8 d10, [r2], r3 389 vshr.s64 d24, d24, #8 390 391 vbsl d11, d24, d16 392 393 vst1.8 d11, [r2], r3 394 vshr.s64 d24, d24, #8 395 396 b end_func 397 398 399 blk_4: 400 vbsl d18, d24, d16 @only select row values from q12(predpixel) 401 402 vst1.32 d18[0], [r2], r3 403 vshr.s64 d24, d24, #8 404 405 vbsl d19, d24, d16 406 407 vst1.32 d19[0], [r2], r3 408 vshr.s64 d24, d24, #8 409 410 vbsl d10, d24, d16 411 412 vst1.32 d10[0], [r2], r3 413 vshr.s64 d24, d24, #8 414 415 vbsl d11, d24, d16 416 vst1.32 d11[0], [r2], r3 417 418 419 end_func: 420 ldmfd sp!,{r4-r12,r15} @reload the registers from sp 421 422