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 #104
     88 @   nt
     89 @   mode
     90 
     91 .equ    nt_offset,      104
     92 
     93 .text
     94 .align 4
     95 
     96 
     97 
     98 
     99 .globl ihevc_intra_pred_luma_ver_a9q
    100 
    101 .type ihevc_intra_pred_luma_ver_a9q, %function
    102 
    103 ihevc_intra_pred_luma_ver_a9q:
    104 
    105     stmfd       sp!, {r4-r12, r14}          @stack stores the values of the arguments
    106     vpush       {d8 - d15}
    107     ldr         r4,[sp,#nt_offset]          @loads nt
    108 
    109     lsl         r5, r4, #1                  @2nt
    110 
    111     cmp         r4, #16
    112     beq         blk_16
    113     blt         blk_4_8
    114 
    115     add         r5, r5, #1                  @2nt+1
    116     add         r6, r0, r5                  @&src[2nt+1]
    117 
    118 copy_32:
    119     add         r5, r2, r3
    120     vld1.8      {d20,d21}, [r6]!            @16 loads (col 0:15)
    121     add         r8, r5, r3
    122 
    123     add         r10, r8, r3
    124     vld1.8      {d22,d23}, [r6]             @16 loads (col 16:31)
    125     lsl         r11, r3, #2
    126 
    127     add         r11, r11, #0xfffffff0
    128     vst1.8      {d20,d21}, [r2]!
    129     vst1.8      {d20,d21}, [r5]!
    130     vst1.8      {d20,d21}, [r8]!
    131     vst1.8      {d20,d21}, [r10]!
    132 
    133     vst1.8      {d22,d23}, [r2], r11
    134     vst1.8      {d22,d23}, [r5], r11
    135     vst1.8      {d22,d23}, [r8], r11
    136     vst1.8      {d22,d23}, [r10], r11
    137 
    138     subs        r4, r4, #8
    139 
    140 kernel_copy_32:
    141     vst1.8      {d20,d21}, [r2]!
    142     vst1.8      {d20,d21}, [r5]!
    143     vst1.8      {d20,d21}, [r8]!
    144     vst1.8      {d20,d21}, [r10]!
    145 
    146     vst1.8      {d22,d23}, [r2], r11
    147     vst1.8      {d22,d23}, [r5], r11
    148     vst1.8      {d22,d23}, [r8], r11
    149     vst1.8      {d22,d23}, [r10], r11
    150 
    151     subs        r4, r4, #8
    152 
    153     vst1.8      {d20,d21}, [r2]!
    154     vst1.8      {d20,d21}, [r5]!
    155     vst1.8      {d20,d21}, [r8]!
    156     vst1.8      {d20,d21}, [r10]!
    157 
    158     vst1.8      {d22,d23}, [r2], r11
    159     vst1.8      {d22,d23}, [r5], r11
    160     vst1.8      {d22,d23}, [r8], r11
    161     vst1.8      {d22,d23}, [r10], r11
    162 
    163     bne         kernel_copy_32
    164 
    165     vst1.8      {d20,d21}, [r2]!
    166     vst1.8      {d20,d21}, [r5]!
    167     vst1.8      {d20,d21}, [r8]!
    168     vst1.8      {d20,d21}, [r10]!
    169 
    170     vst1.8      {d22,d23}, [r2], r11
    171     vst1.8      {d22,d23}, [r5], r11
    172     vst1.8      {d22,d23}, [r8], r11
    173     vst1.8      {d22,d23}, [r10], r11
    174 
    175     b           end_func
    176 
    177 blk_16:
    178     add         r6, r0, r5                  @&src[2nt]
    179 
    180     ldrb        r11, [r6], #1               @src[2nt]
    181 
    182     vdup.8      q11, r11                    @src[2nt]
    183     ldrb        r12, [r6]                   @src[2nt+1]
    184 
    185     vld1.8      {d16,d17}, [r6]             @ld for repl to cols src[2nt+1+col(0:15)] (0 ignored for stores)
    186     add         r6, r6, #0xffffffef         @subtract -9 to take it to src[2nt-1-row(15)]
    187 
    188     vdup.8      q12, r12                    @src[2nt+1]
    189     vdup.16     q15, r12
    190     lsl         r5, r3, #3                  @8*stride
    191 
    192     vld1.8      {d26,d27}, [r6]!            @load src[2nt-1-row](rows 0:15)
    193     add         r5, r2, r5                  @r5 ->
    194 
    195     vmov.i64    d18, #0x00000000000000ff
    196     vhsub.u8    q13, q13, q11               @(src[2nt-1-row] - src[2nt])>>1
    197     @vsubl.u8   q0, d26, d22
    198     @vsubl.u8   q14, d27, d22
    199 
    200     @vshr.s16   q0, q0, #1
    201     @vshr.s16   q14, q14, #1
    202 
    203     vmov.i64    d19, d17
    204     @vaddl.s8   q0, d24, d26
    205     vmovl.s8    q0, d26
    206     vmovl.s8    q14, d27
    207     vqadd.s16   q0, q0, q15
    208     vqadd.s16   q14, q14, q15
    209 
    210     vmov.i64    d10, #0x00000000000000ff
    211     @vaddl.s8   q1, d25, d27
    212 
    213     vqmovun.s16 d25, q0
    214     vqmovun.s16 d24, q14
    215     @vmovn.u16  d25, q0
    216     @vmovn.u16  d24, q1
    217 
    218 
    219     vrev64.8    q12, q12
    220 
    221     vmov.i64    d11, d17
    222 
    223     vbsl        d18, d24, d16               @only select row values from q12(predpixel)
    224     vbsl        d10, d25, d16
    225 
    226     vmov.i64    d8, #0x00000000000000ff
    227     vmov.i64    d9, d17
    228 
    229     vmov.i64    d6, #0x00000000000000ff
    230     vmov.i64    d7, d17
    231 
    232     vst1.8      {d18,d19}, [r2], r3
    233     vshr.s64    d24, d24, #8
    234 
    235     vst1.8      {d10,d11}, [r5], r3
    236     vshr.s64    d25, d25, #8
    237 
    238 
    239     vbsl        d8, d24, d16
    240     vbsl        d6, d25, d16
    241 
    242     vst1.8      {d8,d9}, [r2], r3
    243     vshr.s64    d24, d24, #8
    244 
    245     vst1.8      {d6,d7}, [r5], r3
    246     vshr.s64    d25, d25, #8
    247 
    248     subs        r4, #8
    249 
    250     vmov.i64    d18, #0x00000000000000ff
    251     @vmov.i64   d19, d17
    252 
    253     vmov.i64    d10, #0x00000000000000ff
    254     @vmov.i64   d11, d17
    255 
    256 
    257 loop_16:
    258 
    259 
    260     vmov.i64    d8, #0x00000000000000ff
    261 
    262     vmov.i64    d6, #0x00000000000000ff
    263 
    264     vbsl        d18, d24, d16               @only select row values from q12(predpixel)
    265     vbsl        d10, d25, d16
    266 
    267     vst1.8      {d18,d19}, [r2], r3
    268     vshr.s64    d24, d24, #8
    269 
    270     vst1.8      {d10,d11}, [r5], r3
    271     vshr.s64    d25, d25, #8
    272 
    273     vmov.i64    d18, #0x00000000000000ff
    274 
    275     vmov.i64    d10, #0x00000000000000ff
    276 
    277     vbsl        d8, d24, d16
    278     vbsl        d6, d25, d16
    279 
    280     vst1.8      {d8,d9}, [r2], r3
    281     vshr.s64    d24, d24, #8
    282 
    283     vst1.8      {d6,d7}, [r5], r3
    284     vshr.s64    d25, d25, #8
    285 
    286     subs        r4, r4, #4
    287 
    288     bne         loop_16
    289 
    290     vmov.i64    d8, #0x00000000000000ff
    291 
    292     vmov.i64    d6, #0x00000000000000ff
    293 
    294     vbsl        d18, d24, d16               @only select row values from q12(predpixel)
    295     vbsl        d10, d25, d16
    296 
    297     vst1.8      {d18,d19}, [r2], r3
    298     vshr.s64    d24, d24, #8
    299 
    300     vst1.8      {d10,d11}, [r5], r3
    301     vshr.s64    d25, d25, #8
    302 
    303     vbsl        d8, d24, d16
    304     vbsl        d6, d25, d16
    305 
    306     vst1.8      {d8,d9}, [r2], r3
    307 
    308     vst1.8      {d6,d7}, [r5], r3
    309 
    310     b           end_func
    311 
    312 
    313 blk_4_8:
    314     vmov.i64    d11, #0x00000000000000ff
    315     add         r6, r0, r5                  @&src[2nt]
    316 
    317     vmov.i64    d10, #0x00000000000000ff
    318     ldrb        r11, [r6], #1               @src[2nt]
    319 
    320     vdup.8      d22, r11                    @src[2nt]
    321     ldrb        r12, [r6]                   @src[2nt+1]
    322 
    323     vld1.8      d16, [r6]                   @ld for repl to cols src[2nt+1+col(0:3 or 0:7)](0 ignored for st)
    324     add         r6, r6, #0xfffffff7         @subtract -9 to take it to src[2nt-1-row(15)]
    325 
    326     vdup.8      d24, r12                    @src[2nt+1]
    327     vdup.16     q15, r12
    328 
    329     vld1.8      d26, [r6]!                  @load src[2nt-1-row](rows 0:15)
    330 
    331     vmov.i64    d18, #0x00000000000000ff
    332     vhsub.u8    d26, d26, d22               @(src[2nt-1-row] - src[2nt])>>1
    333     @vsubl.u8   q13, d26, d22
    334 
    335     @vshr.s16   q13, q13, #1
    336 
    337     vmov.i64    d19, #0x00000000000000ff
    338     vmovl.s8    q13, d26
    339     @vaddl.s8   q0, d24, d26
    340     vqadd.s16   q0, q13, q15
    341 
    342     vqmovun.s16 d24, q0
    343     @vmovn.s16  d24, q0
    344 
    345     vrev64.8    d24, d24
    346 
    347     cmp         r4, #4
    348     beq         blk_4
    349 
    350     vbsl        d18, d24, d16               @only select row values from q12(predpixel)
    351 
    352     vst1.8      d18, [r2], r3
    353     vshr.s64    d24, d24, #8
    354 
    355     vmov.i64    d18, #0x00000000000000ff
    356 
    357     vbsl        d19, d24, d16
    358 
    359     vst1.8      d19, [r2], r3
    360     vshr.s64    d24, d24, #8
    361 
    362     vmov.i64    d19, #0x00000000000000ff
    363 
    364     vbsl        d10, d24, d16
    365 
    366     vst1.8      d10, [r2], r3
    367     vshr.s64    d24, d24, #8
    368 
    369     vmov.i64    d10, #0x00000000000000ff
    370 
    371     vbsl        d11, d24, d16
    372 
    373     vst1.8      d11, [r2], r3
    374     vshr.s64    d24, d24, #8
    375 
    376     vmov.i64    d11, #0x00000000000000ff
    377 
    378     vbsl        d18, d24, d16               @only select row values from q12(predpixel)
    379 
    380     vst1.8      d18, [r2], r3
    381     vshr.s64    d24, d24, #8
    382 
    383     vbsl        d19, d24, d16
    384 
    385     vst1.8      d19, [r2], r3
    386     vshr.s64    d24, d24, #8
    387 
    388     vbsl        d10, d24, d16
    389 
    390     vst1.8      d10, [r2], r3
    391     vshr.s64    d24, d24, #8
    392 
    393     vbsl        d11, d24, d16
    394 
    395     vst1.8      d11, [r2], r3
    396     vshr.s64    d24, d24, #8
    397 
    398     b           end_func
    399 
    400 
    401 blk_4:
    402     vbsl        d18, d24, d16               @only select row values from q12(predpixel)
    403 
    404     vst1.32     d18[0], [r2], r3
    405     vshr.s64    d24, d24, #8
    406 
    407     vbsl        d19, d24, d16
    408 
    409     vst1.32     d19[0], [r2], r3
    410     vshr.s64    d24, d24, #8
    411 
    412     vbsl        d10, d24, d16
    413 
    414     vst1.32     d10[0], [r2], r3
    415     vshr.s64    d24, d24, #8
    416 
    417     vbsl        d11, d24, d16
    418     vst1.32     d11[0], [r2], r3
    419 
    420 
    421 end_func:
    422     vpop        {d8 - d15}
    423     ldmfd       sp!,{r4-r12,r15}            @reload the registers from sp
    424 
    425