Home | History | Annotate | Download | only in arm
      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 .data
     23 .p2align 2
     24 
     25 scratch_intrapred_luma_4x4_prediction:
     26     .long ver, hor, d_c, dia_dl
     27     .long dia_dr, ver_r, hor_d, ver_l
     28     .long hor_u
     29 
     30 
     31 .text
     32 .p2align 2
     33 
     34 scratch_intrapred_luma_4x4_prediction_addr1:
     35     .long scratch_intrapred_luma_4x4_prediction - scrintra_4x4 - 8
     36 
     37 
     38 
     39 @/**
     40 @******************************************************************************
     41 @*
     42 @* @brief :Evaluate best intra 4x4 mode
     43 @*                and do the prediction.
     44 @*
     45 @* @par Description
     46 @*   This function evaluates  4x4 modes and compute corresponding sad
     47 @*   and return the buffer predicted with best mode.
     48 @*
     49 @* @param[in] pu1_src
     50 @*  UWORD8 pointer to the source
     51 @*
     52 @** @param[in] pu1_ngbr_pels
     53 @*  UWORD8 pointer to neighbouring pels
     54 @*
     55 @* @param[out] pu1_dst
     56 @*  UWORD8 pointer to the destination
     57 @*
     58 @* @param[in] src_strd
     59 @*  integer source stride
     60 @*
     61 @* @param[in] dst_strd
     62 @*  integer destination stride
     63 @*
     64 @* @param[in] u4_n_avblty
     65 @* availability of neighbouring pixels
     66 @*
     67 @* @param[in] u4_intra_mode
     68 @* Pointer to the variable in which best mode is returned
     69 @*
     70 @* @param[in] pu4_sadmin
     71 @* Pointer to the variable in which minimum cost is returned
     72 @*
     73 @* @param[in] u4_valid_intra_modes
     74 @* Says what all modes are valid
     75 @*
     76 @* * @param[in] u4_lambda
     77 @* Lamda value for computing cost from SAD
     78 @*
     79 @* @param[in] u4_predictd_mode
     80 @* Predicted mode for cost computation
     81 @*
     82 @*
     83 @*
     84 @* @return      none
     85 @*
     86 @******************************************************************************
     87 @*/
     88 @void ih264e_evaluate_intra_4x4_modes(UWORD8 *pu1_src,
     89 @                                     UWORD8 *pu1_ngbr_pels,
     90 @                                     UWORD8 *pu1_dst,
     91 @                                     UWORD32 src_strd,
     92 @                                    UWORD32 dst_strd,
     93 @                                     WORD32 u4_n_avblty,
     94 @                                     UWORD32 *u4_intra_mode,
     95 @                                     WORD32 *pu4_sadmin,
     96 @                                     UWORD32 u4_valid_intra_modes,
     97 @                                     UWORD32  u4_lambda,
     98 @                                     UWORD32 u4_predictd_mode)
     99 
    100 
    101 
    102     .global ih264e_evaluate_intra_4x4_modes_a9q
    103 
    104 ih264e_evaluate_intra_4x4_modes_a9q:
    105 
    106 @r0 = pu1_src,
    107 @r1 = pu1_ngbr_pels_i16,
    108 @r2 = pu1_dst,
    109 @r3 = src_strd,
    110 @r4 = dst_strd,
    111 @r5 = u4_n_avblty,
    112 @r6 = u4_intra_mode,
    113 @r7 = pu4_sadmin
    114 @r8 = u4_valid_intra_modes
    115 @r0 =u4_lambda
    116 @r1 = u4_predictd_mode
    117 
    118 
    119     stmfd         sp!, {r4-r12, r14}    @store register values to stack
    120 
    121 @--------------------
    122     ldr           r5, [sp, #44]         @r5 = u4_n_avblty,
    123 @----------------------
    124     vpush         {d8-d15}
    125 @Loading neighbours
    126     vld1.32       {q0}, [r1]
    127     add           r4, r1, #12
    128     vld1.8        d1[5], [r4]
    129     vld1.8        d1[7], [r1]
    130     @--------------------------------
    131     ldr           r8, [sp, #120]        @u4_valid_intra_modes
    132 @----------------------------------------------
    133 
    134 
    135 
    136 @ LOADING pu1_src
    137     vld1.32       {d20[0]}, [r0], r3
    138     vext.8        q1, q0, q0, #1
    139     vld1.32       {d20[1]}, [r0], r3
    140     mov           r11, #1
    141     vld1.32       {d21[0]}, [r0], r3
    142     lsl           r11, r11, #30
    143     vld1.32       {d21[1]}, [r0], r3
    144 
    145 
    146 
    147 @--------------------------------
    148     ldr           r0, [sp, #124]        @r0 =u4_lambda
    149     ldr           r1, [sp, #128]        @r1 = u4_predictd_mode
    150 @------
    151 
    152 
    153 vert:
    154     ands          r10, r8, #01          @VERT sad ??
    155     beq           horz
    156     vdup.32       q2, d2[1]
    157     vabdl.u8      q14, d4, d20
    158     vabal.u8      q14, d4, d21
    159     vadd.i16      d28, d29, d28
    160     subs          r6, r1, #0
    161     vpaddl.u16    d28, d28              @
    162     lslne         r6, r0, #2
    163     vpaddl.u32    d28, d28              @/
    164     moveq         r6, r0                @
    165     vmov.u32      r9, d28[0]            @ vert
    166     add           r9, r6, r9
    167 
    168     subs          r6, r11, r9
    169     movgt         r11, r9
    170     movgt         r12, #0
    171 
    172 horz:
    173     ands          r10, r8, #02          @HORZ sad ??
    174     beq           dc
    175     vdup.32       q3, d0[0]
    176     vmov.32       q4, q3
    177     vtrn.8        q3, q4
    178     vtrn.16       d7, d6
    179     vtrn.16       d9, d8
    180     vtrn.32       d9, d7
    181     vtrn.32       d8, d6
    182     vabdl.u8      q14, d6, d20
    183     subs          r6, r1, #1
    184     vabal.u8      q14, d7, d21
    185     vadd.i16      d28, d29, d28
    186     lslne         r6, r0, #2
    187     vpaddl.u16    d28, d28              @
    188     vpaddl.u32    d28, d28              @/
    189     vmov.u32      r9, d28[0]            @
    190     moveq         r6, r0                @
    191     add           r9, r6, r9
    192 
    193     subs          r6, r11, r9
    194     movgt         r11, r9
    195     movgt         r12, #1
    196 
    197 dc:
    198     ands          r10, r8, #04          @DC sad ??
    199     beq           diags
    200     vext.8        q4, q0, q0, #5
    201     vaddl.u8      q4, d0, d8
    202     vpaddl.u16    d8, d8                @
    203     vpaddl.u32    d8, d8                @/
    204     vmov.u32      r4, d8[0]             @
    205     mov           r14, #1
    206     ands          r10, r5, #1
    207     addne         r4, r4, #2
    208     addne         r14, r14, #1
    209     ands          r10, r5, #4
    210     addne         r4, r4, #2
    211     addne         r14, r14, #1
    212     ands          r10, r5, #5
    213     moveq         r4, #128
    214     moveq         r14, #0
    215     subs          r6, r1, #2
    216     lsr           r4, r4, r14
    217     vdup.8        q4, r4
    218     lslne         r6, r0, #2
    219     vabdl.u8      q14, d8, d20
    220     vabal.u8      q14, d9, d21
    221     vadd.i16      d28, d29, d28
    222     vpaddl.u16    d28, d28              @
    223     vpaddl.u32    d28, d28              @/
    224     vmov.u32      r9, d28[0]            @
    225 
    226     moveq         r6, r0                @
    227     add           r9, r6, r9
    228 
    229     subs          r6, r11, r9
    230     movgt         r11, r9
    231     movgt         r12, #2
    232 
    233 diags:
    234     ands          r10, r8, #504         @/* if modes other than VERT, HORZ and DC are  valid ????*/
    235     beq           pred
    236     @/* Performing FILT11 and FILT121 operation for all neighbour values*/
    237     vext.8        q5, q0, q0, #2
    238     vaddl.u8      q6, d0, d2
    239     vaddl.u8      q7, d1, d3
    240     vaddl.u8      q8, d10, d2
    241     vaddl.u8      q9, d11, d3
    242     vadd.u16      q12, q10, q11
    243     vqrshrun.s16  d10, q6, #1
    244     vqrshrun.s16  d11, q7, #1
    245     vadd.u16      q11, q6, q8
    246     vadd.u16      q12, q7, q9
    247     vqrshrun.s16  d12, q11, #2
    248     vqrshrun.s16  d13, q12, #2
    249     mov           r14, #0
    250     vdup.32       q13 , r14
    251     mov           r14, #-1
    252     vmov.i32      d26[0], r14
    253 
    254 diag_dl:
    255     ands          r10, r8, #0x08        @DIAG_DL sad ??
    256     beq           diag_dr
    257 
    258     vext.8        q15, q6, q6, #5
    259     vbit.32       d14, d30, d26
    260     vext.8        q15, q6, q6, #15
    261     vbit.32       d15, d31, d26
    262     vext.8        q15, q6, q6, #2
    263     vext.32       q14, q13, q13, #3
    264     vbit.32       d14, d30, d28
    265     vext.8        q15, q6, q6, #4
    266     vbit.32       d15, d30, d28
    267     vabdl.u8      q14, d14, d20
    268     subs          r6, r1, #3
    269     vabal.u8      q14, d15, d21
    270     vadd.i16      d28, d29, d28
    271     vpaddl.u16    d28, d28              @
    272     lslne         r6, r0, #2
    273     vpaddl.u32    d28, d28              @/
    274     vmov.u32      r9, d28[0]            @
    275 
    276     moveq         r6, r0                @
    277     add           r9, r6, r9
    278 
    279     subs          r6, r11, r9
    280     movgt         r11, r9
    281     movgt         r12, #3
    282 
    283 diag_dr:
    284     ands          r10, r8, #16          @DIAG_DR sad ??
    285     beq           vert_r
    286 
    287     vext.8        q15, q6, q6, #3
    288     vbit.32       d16, d30, d26
    289     vext.8        q15, q6, q6, #1
    290     vbit.32       d17, d30, d26
    291     vext.8        q15, q6, q6, #4
    292     vext.32       q14, q13, q13, #3
    293     vbit.32       d17, d31, d28
    294     vext.8        q15, q6, q6, #6
    295     vbit.32       d16, d31, d28
    296     vabdl.u8      q14, d16, d20
    297     subs          r6, r1, #4
    298     vabal.u8      q14, d17, d21
    299     vadd.i16      d28, d29, d28
    300     vpaddl.u16    d28, d28              @
    301     lslne         r6, r0, #2
    302     vpaddl.u32    d28, d28              @/
    303     vmov.u32      r9, d28[0]            @
    304 
    305     moveq         r6, r0                @
    306     add           r9, r6, r9
    307 
    308     subs          r6, r11, r9
    309     movgt         r11, r9
    310     movgt         r12, #4
    311 
    312 vert_r:
    313     ands          r10, r8, #32          @VERT_R sad ??
    314     beq           horz_d
    315     vext.8        q15, q5, q5, #4
    316     vbit.32       d18, d30, d26
    317     vext.8        q15, q5, q5, #3
    318     vbit.32       d19, d30, d26
    319     vext.32       q14, q13, q13, #3
    320     vext.8        q15, q6, q6, #15
    321     vbit.32       d18, d30, d28
    322     vext.8        q15, q6, q6, #14
    323     vbit.32       d19, d30, d28
    324     mov           r14, #0
    325     vdup.32       q14 , r14
    326     mov           r14, #0xff
    327     vmov.i8       d28[0], r14
    328     vext.8        q15, q6, q6, #2
    329     vbit.32       d19, d30, d28
    330     vext.32       q14, q14, q14, #3
    331     subs          r6, r1, #5
    332     vext.8        q15, q6, q6, #13
    333     vbit.32       d19, d30, d28
    334     lslne         r6, r0, #2
    335     vabdl.u8      q14, d18, d20
    336     vabal.u8      q14, d19, d21
    337     vadd.i16      d28, d29, d28
    338     vpaddl.u16    d28, d28              @
    339     vpaddl.u32    d28, d28              @/
    340     vmov.u32      r9, d28[0]            @
    341 
    342 
    343     moveq         r6, r0                @
    344     add           r9, r6, r9
    345 
    346     subs          r6, r11, r9
    347     movgt         r11, r9
    348     movgt         r12, #5
    349 
    350 horz_d:
    351     vmov.8        q1, q5
    352     vmov.8        q15, q6
    353     vzip.8        q1, q15
    354 
    355     ands          r10, r8, #64          @HORZ_D sad ??
    356     beq           vert_l
    357     vext.8        q15, q6, q6, #2
    358     vbit.32       d8, d30, d26
    359     mov           r14, #0
    360     vdup.32       q14 , r14
    361     mov           r14, #0xff
    362     vmov.i8       d28[0], r14
    363     vext.8        q15, q5, q5, #3
    364     vbit.32       d8, d30, d28
    365     vext.8        q15, q1, q1, #2
    366     vbit.32       d9, d30, d26
    367     vext.32       q14, q13, q13, #3
    368     vbit.32       d8, d2, d28
    369     subs          r6, r1, #6
    370     vext.8        q15, q1, q1, #12
    371     vbit.32       d9, d30, d28
    372     vabdl.u8      q14, d8, d20
    373     vabal.u8      q14, d9, d21
    374     vadd.i16      d28, d29, d28
    375     vpaddl.u16    d28, d28              @
    376     lslne         r6, r0, #2
    377     vpaddl.u32    d28, d28              @/
    378     vmov.u32      r9, d28[0]            @
    379 
    380 
    381     moveq         r6, r0                @
    382     add           r9, r6, r9
    383 
    384     subs          r6, r11, r9
    385     movgt         r11, r9
    386     movgt         r12, #6
    387 vert_l:
    388     ands          r10, r8, #128         @VERT_L sad ??
    389     beq           horz_u
    390     vext.8        q15, q5, q5, #5
    391     vbit.32       d24, d30, d26
    392     vext.8        q15, q15, q15, #1
    393     vbit.32       d25, d30, d26
    394     vext.8        q15, q6, q6, #1
    395     vext.32       q14, q13, q13, #3
    396     vbit.32       d24, d30, d28
    397     vext.8        q15, q15, q15, #1
    398     subs          r6, r1, #7
    399     vbit.32       d25, d30, d28
    400     vabdl.u8      q14, d24, d20
    401     vabal.u8      q14, d25, d21
    402     vadd.i16      d28, d29, d28
    403     vpaddl.u16    d28, d28              @
    404     lslne         r6, r0, #2
    405     vpaddl.u32    d28, d28              @/
    406     vmov.u32      r9, d28[0]            @
    407 
    408     moveq         r6, r0                @
    409     add           r9, r6, r9
    410 
    411     subs          r6, r11, r9
    412     movgt         r11, r9
    413     movgt         r12, #7
    414 
    415 horz_u:
    416     ands          r10, r8, #256         @HORZ_U sad ??
    417     beq           pred
    418     vrev64.8      q5, q1
    419     vdup.8        q1, d0[0]
    420     vext.8        q6, q6, #7
    421     mov           r14, #0
    422     vdup.32       q14 , r14
    423     mov           r14, #0xff
    424     vmov.i8       d28[0], r14
    425     vbit.32       d11, d13, d28
    426     movw          r14, #0xffff
    427     vmov.i16      d28[0], r14
    428     vext.8        q6, q5, q5, #7
    429     subs          r6, r1, #8
    430     vbit.32       d3, d12, d28
    431     vext.8        q6, q5, q5, #3
    432     vbit.32       d2, d12, d26
    433     vext.32       q14, q13, q13, #3
    434     vext.8        q6, q5, q5, #1
    435     vbit.32       d2, d12, d28
    436     vabdl.u8      q14, d2, d20
    437     vabal.u8      q14, d3, d21
    438     vadd.i16      d28, d29, d28
    439     vpaddl.u16    d28, d28              @
    440     lslne         r6, r0, #2
    441     vpaddl.u32    d28, d28              @/
    442     vmov.u32      r9, d28[0]            @
    443 
    444 
    445     moveq         r6, r0                @
    446     add           r9, r6, r9
    447 
    448     subs          r6, r11, r9
    449     movgt         r11, r9
    450     movgt         r12, #8
    451 
    452 pred: @/*dOING FINAL PREDICTION*/
    453 @---------------------------
    454     ldr           r7, [sp, #116]        @r7 = pu4_sadmin
    455     ldr           r6, [sp, #112]        @ R6 =MODE
    456 @--------------------------
    457     str           r11, [r7]             @/STORING MIN SAD*/
    458     str           r12, [r6]             @/FINAL MODE*/
    459 
    460 
    461     ldr           r3, scratch_intrapred_luma_4x4_prediction_addr1
    462 scrintra_4x4:
    463     add           r3, r3, pc
    464     lsl           r12, r12, #2
    465     add           r3, r3, r12
    466 
    467     ldr           r5, [r3]
    468     and           r5, r5, #0xfffffffe
    469 
    470     bx            r5
    471 
    472 
    473 ver:
    474     vext.8        q0, q0, q0, #1
    475     vdup.32       q15, d0[1]
    476     b             store
    477 
    478 hor:
    479     vmov.32       q15, q3
    480     b             store
    481 
    482 d_c:
    483     vdup.8        q15, r4
    484     b             store
    485 
    486 dia_dl:
    487     vmov.32       q15, q7
    488     b             store
    489 
    490 dia_dr:
    491     vmov.32       q15, q8
    492     b             store
    493 
    494 ver_r:
    495     vmov.32       q15, q9
    496     b             store
    497 
    498 hor_d:
    499     vmov.32       q15, q4
    500     b             store
    501 
    502 ver_l:
    503     vmov.32       q15, q12
    504     b             store
    505 
    506 hor_u:
    507     vmov.32       q15, q1
    508 
    509 store: @/* storing to pu1_dst*/
    510 
    511     ldr           r4, [sp, #104]        @r4 = dst_strd,
    512 
    513     vst1.32       {d30[0]}, [r2], r4
    514     vst1.32       {d30[1]}, [r2], r4
    515     vst1.32       {d31[0]}, [r2], r4
    516     vst1.32       {d31[1]}, [r2], r4
    517 
    518 
    519 end_func:
    520     vpop          {d8-d15}
    521     ldmfd         sp!, {r4-r12, pc}     @Restoring registers from stack
    522 
    523 
    524 
    525 
    526 
    527