Home | History | Annotate | Download | only in arm
      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