tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

h264idct_neon.S (14881B)


      1 /*
      2 * Copyright (c) 2008 Mans Rullgard <mans@mansr.com>
      3 *
      4 * This file is part of FFmpeg.
      5 *
      6 * FFmpeg is free software; you can redistribute it and/or
      7 * modify it under the terms of the GNU Lesser General Public
      8 * License as published by the Free Software Foundation; either
      9 * version 2.1 of the License, or (at your option) any later version.
     10 *
     11 * FFmpeg is distributed in the hope that it will be useful,
     12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     14 * Lesser General Public License for more details.
     15 *
     16 * You should have received a copy of the GNU Lesser General Public
     17 * License along with FFmpeg; if not, write to the Free Software
     18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     19 */
     20 
     21 #include "libavutil/arm/asm.S"
     22 
     23 function ff_h264_idct_add_neon, export=1
     24 h264_idct_add_neon_nothumb:
     25        vld1.64         {d0-d3},  [r1,:128]
     26        vmov.i16        q15, #0
     27 
     28        vswp            d1,  d2
     29        vst1.16         {q15},    [r1,:128]!
     30        vadd.i16        d4,  d0,  d1
     31        vst1.16         {q15},    [r1,:128]!
     32        vshr.s16        q8,  q1,  #1
     33        vsub.i16        d5,  d0,  d1
     34        vadd.i16        d6,  d2,  d17
     35        vsub.i16        d7,  d16, d3
     36        vadd.i16        q0,  q2,  q3
     37        vsub.i16        q1,  q2,  q3
     38 
     39        vtrn.16         d0,  d1
     40        vtrn.16         d3,  d2
     41        vtrn.32         d0,  d3
     42        vtrn.32         d1,  d2
     43 
     44        vadd.i16        d4,  d0,  d3
     45        vld1.32         {d18[0]}, [r0,:32], r2
     46        vswp            d1,  d3
     47        vshr.s16        q8,  q1,  #1
     48        vld1.32         {d19[1]}, [r0,:32], r2
     49        vsub.i16        d5,  d0,  d1
     50        vld1.32         {d18[1]}, [r0,:32], r2
     51        vadd.i16        d6,  d16, d3
     52        vld1.32         {d19[0]}, [r0,:32], r2
     53        vsub.i16        d7,  d2,  d17
     54        sub             r0,  r0,  r2, lsl #2
     55        vadd.i16        q0,  q2,  q3
     56        vsub.i16        q1,  q2,  q3
     57 
     58        vrshr.s16       q0,  q0,  #6
     59        vrshr.s16       q1,  q1,  #6
     60 
     61        vaddw.u8        q0,  q0,  d18
     62        vaddw.u8        q1,  q1,  d19
     63 
     64        vqmovun.s16     d0,  q0
     65        vqmovun.s16     d1,  q1
     66 
     67        vst1.32         {d0[0]},  [r0,:32], r2
     68        vst1.32         {d1[1]},  [r0,:32], r2
     69        vst1.32         {d0[1]},  [r0,:32], r2
     70        vst1.32         {d1[0]},  [r0,:32], r2
     71 
     72        sub             r1,  r1,  #32
     73        bx              lr
     74 endfunc
     75 
     76 function ff_h264_idct_dc_add_neon, export=1
     77 h264_idct_dc_add_neon_nothumb:
     78        mov             r3,       #0
     79        vld1.16         {d2[],d3[]}, [r1,:16]
     80        strh            r3,       [r1]
     81        vrshr.s16       q1,  q1,  #6
     82        vld1.32         {d0[0]},  [r0,:32], r2
     83        vld1.32         {d0[1]},  [r0,:32], r2
     84        vaddw.u8        q2,  q1,  d0
     85        vld1.32         {d1[0]},  [r0,:32], r2
     86        vld1.32         {d1[1]},  [r0,:32], r2
     87        vaddw.u8        q1,  q1,  d1
     88        vqmovun.s16     d0,  q2
     89        vqmovun.s16     d1,  q1
     90        sub             r0,  r0,  r2, lsl #2
     91        vst1.32         {d0[0]},  [r0,:32], r2
     92        vst1.32         {d0[1]},  [r0,:32], r2
     93        vst1.32         {d1[0]},  [r0,:32], r2
     94        vst1.32         {d1[1]},  [r0,:32], r2
     95        bx              lr
     96 endfunc
     97 
     98 function ff_h264_idct_add16_neon, export=1
     99        push            {r4-r8,lr}
    100        mov             r4,  r0
    101        mov             r5,  r1
    102        mov             r1,  r2
    103        mov             r2,  r3
    104        ldr             r6,  [sp, #24]
    105        movrel          r7,  scan8
    106        mov             ip,  #16
    107 1:      ldrb            r8,  [r7], #1
    108        ldr             r0,  [r5], #4
    109        ldrb            r8,  [r6, r8]
    110        subs            r8,  r8,  #1
    111        blt             2f
    112        ldrsh           lr,  [r1]
    113        add             r0,  r0,  r4
    114        it              ne
    115        movne           lr,  #0
    116        cmp             lr,  #0
    117        ite             ne
    118        adrne           lr,  h264_idct_dc_add_neon_nothumb + CONFIG_THUMB
    119        adreq           lr,  h264_idct_add_neon_nothumb    + CONFIG_THUMB
    120        blx             lr
    121 2:      subs            ip,  ip,  #1
    122        add             r1,  r1,  #32
    123        bne             1b
    124        pop             {r4-r8,pc}
    125 endfunc
    126 
    127 function ff_h264_idct_add16intra_neon, export=1
    128        push            {r4-r8,lr}
    129        mov             r4,  r0
    130        mov             r5,  r1
    131        mov             r1,  r2
    132        mov             r2,  r3
    133        ldr             r6,  [sp, #24]
    134        movrel          r7,  scan8
    135        mov             ip,  #16
    136 1:      ldrb            r8,  [r7], #1
    137        ldr             r0,  [r5], #4
    138        ldrb            r8,  [r6, r8]
    139        add             r0,  r0,  r4
    140        cmp             r8,  #0
    141        ldrsh           r8,  [r1]
    142        iteet           ne
    143        adrne           lr,  h264_idct_add_neon_nothumb    + CONFIG_THUMB
    144        adreq           lr,  h264_idct_dc_add_neon_nothumb + CONFIG_THUMB
    145        cmpeq           r8,  #0
    146        blxne           lr
    147        subs            ip,  ip,  #1
    148        add             r1,  r1,  #32
    149        bne             1b
    150        pop             {r4-r8,pc}
    151 endfunc
    152 
    153 function ff_h264_idct_add8_neon, export=1
    154        push            {r4-r10,lr}
    155        ldm             r0,  {r4,r9}
    156        add             r5,  r1,  #16*4
    157        add             r1,  r2,  #16*32
    158        mov             r2,  r3
    159        mov             r10, r1
    160        ldr             r6,  [sp, #32]
    161        movrel          r7,  scan8+16
    162        mov             r12, #0
    163 1:      ldrb            r8,  [r7, r12]
    164        ldr             r0,  [r5, r12, lsl #2]
    165        ldrb            r8,  [r6, r8]
    166        add             r0,  r0,  r4
    167        add             r1,  r10, r12, lsl #5
    168        cmp             r8,  #0
    169        ldrsh           r8,  [r1]
    170        iteet           ne
    171        adrne           lr,  h264_idct_add_neon_nothumb    + CONFIG_THUMB
    172        adreq           lr,  h264_idct_dc_add_neon_nothumb + CONFIG_THUMB
    173        cmpeq           r8,  #0
    174        blxne           lr
    175        add             r12, r12, #1
    176        cmp             r12, #4
    177        itt             eq
    178        moveq           r12, #16
    179        moveq           r4,  r9
    180        cmp             r12, #20
    181        blt             1b
    182        pop             {r4-r10,pc}
    183 endfunc
    184 
    185 .macro  idct8x8_cols    pass
    186  .if \pass == 0
    187        qa      .req    q2
    188        qb      .req    q14
    189        vshr.s16        q2,  q10, #1
    190        vadd.i16        q0,  q8,  q12
    191        vld1.16         {q14-q15},[r1,:128]
    192        vst1.16         {q3},     [r1,:128]!
    193        vst1.16         {q3},     [r1,:128]!
    194        vsub.i16        q1,  q8,  q12
    195        vshr.s16        q3,  q14, #1
    196        vsub.i16        q2,  q2,  q14
    197        vadd.i16        q3,  q3,  q10
    198  .else
    199        qa      .req    q14
    200        qb      .req    q2
    201        vtrn.32         q8,  q10
    202        vtrn.16         q12, q13
    203        vtrn.32         q9,  q11
    204        vtrn.32         q12, q2
    205        vtrn.32         q13, q15
    206        vswp            d21, d4
    207        vshr.s16        q14, q10, #1
    208        vswp            d17, d24
    209        vshr.s16        q3,  q2,  #1
    210        vswp            d19, d26
    211        vadd.i16        q0,  q8,  q12
    212        vswp            d23, d30
    213        vsub.i16        q1,  q8,  q12
    214        vsub.i16        q14, q14, q2
    215        vadd.i16        q3,  q3,  q10
    216  .endif
    217        vadd.i16        q10, q1,  qa
    218        vsub.i16        q12, q1,  qa
    219        vadd.i16        q8,  q0,  q3
    220        vsub.i16        qb,  q0,  q3
    221        vsub.i16        q0,  q13, q11
    222        vadd.i16        q1,  q15, q9
    223        vsub.i16        qa,  q15, q9
    224        vadd.i16        q3,  q13, q11
    225        vsub.i16        q0,  q0,  q15
    226        vsub.i16        q1,  q1,  q11
    227        vadd.i16        qa,  qa,  q13
    228        vadd.i16        q3,  q3,  q9
    229        vshr.s16        q9,  q9,  #1
    230        vshr.s16        q11, q11, #1
    231        vshr.s16        q13, q13, #1
    232        vshr.s16        q15, q15, #1
    233        vsub.i16        q0,  q0,  q15
    234        vsub.i16        q1,  q1,  q11
    235        vadd.i16        qa,  qa,  q13
    236        vadd.i16        q3,  q3,  q9
    237        vshr.s16        q9,  q0,  #2
    238        vshr.s16        q11, q1,  #2
    239        vshr.s16        q13, qa,  #2
    240        vshr.s16        q15, q3,  #2
    241        vsub.i16        q3,  q3,  q9
    242        vsub.i16        qa,  q11, qa
    243        vadd.i16        q1,  q1,  q13
    244        vadd.i16        q0,  q0,  q15
    245  .if \pass == 0
    246        vsub.i16        q15, q8,  q3
    247        vadd.i16        q8,  q8,  q3
    248        vadd.i16        q9,  q10, q2
    249        vsub.i16        q2,  q10, q2
    250        vtrn.16         q8,  q9
    251        vadd.i16        q10, q12, q1
    252        vtrn.16         q2,  q15
    253        vadd.i16        q11, q14, q0
    254        vsub.i16        q13, q12, q1
    255        vtrn.16         q10, q11
    256        vsub.i16        q12, q14, q0
    257  .else
    258        vsub.i16        q15, q8,  q3
    259        vadd.i16        q8,  q8,  q3
    260        vadd.i16        q9,  q10, q14
    261        vsub.i16        q14, q10, q14
    262        vadd.i16        q10, q12, q1
    263        vsub.i16        q13, q12, q1
    264        vadd.i16        q11, q2, q0
    265        vsub.i16        q12, q2, q0
    266  .endif
    267        .unreq          qa
    268        .unreq          qb
    269 .endm
    270 
    271 function ff_h264_idct8_add_neon, export=1
    272 h264_idct8_add_neon_nothumb:
    273        vmov.i16        q3,       #0
    274        vld1.16         {q8-q9},  [r1,:128]
    275        vst1.16         {q3},     [r1,:128]!
    276        vst1.16         {q3},     [r1,:128]!
    277        vld1.16         {q10-q11},[r1,:128]
    278        vst1.16         {q3},     [r1,:128]!
    279        vst1.16         {q3},     [r1,:128]!
    280        vld1.16         {q12-q13},[r1,:128]
    281        vst1.16         {q3},     [r1,:128]!
    282        vst1.16         {q3},     [r1,:128]!
    283 
    284        idct8x8_cols    0
    285        idct8x8_cols    1
    286 
    287        mov             r3,  r0
    288        vrshr.s16       q8,  q8,  #6
    289        vld1.8          {d0},     [r0,:64], r2
    290        vrshr.s16       q9,  q9,  #6
    291        vld1.8          {d1},     [r0,:64], r2
    292        vrshr.s16       q10, q10, #6
    293        vld1.8          {d2},     [r0,:64], r2
    294        vrshr.s16       q11, q11, #6
    295        vld1.8          {d3},     [r0,:64], r2
    296        vrshr.s16       q12, q12, #6
    297        vld1.8          {d4},     [r0,:64], r2
    298        vrshr.s16       q13, q13, #6
    299        vld1.8          {d5},     [r0,:64], r2
    300        vrshr.s16       q14, q14, #6
    301        vld1.8          {d6},     [r0,:64], r2
    302        vrshr.s16       q15, q15, #6
    303        vld1.8          {d7},     [r0,:64], r2
    304        vaddw.u8        q8,  q8,  d0
    305        vaddw.u8        q9,  q9,  d1
    306        vaddw.u8        q10, q10, d2
    307        vqmovun.s16     d0,  q8
    308        vaddw.u8        q11, q11, d3
    309        vqmovun.s16     d1,  q9
    310        vaddw.u8        q12, q12, d4
    311        vqmovun.s16     d2,  q10
    312        vst1.8          {d0},     [r3,:64], r2
    313        vaddw.u8        q13, q13, d5
    314        vqmovun.s16     d3,  q11
    315        vst1.8          {d1},     [r3,:64], r2
    316        vaddw.u8        q14, q14, d6
    317        vqmovun.s16     d4,  q12
    318        vst1.8          {d2},     [r3,:64], r2
    319        vaddw.u8        q15, q15, d7
    320        vqmovun.s16     d5,  q13
    321        vst1.8          {d3},     [r3,:64], r2
    322        vqmovun.s16     d6,  q14
    323        vqmovun.s16     d7,  q15
    324        vst1.8          {d4},     [r3,:64], r2
    325        vst1.8          {d5},     [r3,:64], r2
    326        vst1.8          {d6},     [r3,:64], r2
    327        vst1.8          {d7},     [r3,:64], r2
    328 
    329        sub             r1,  r1,  #128
    330        bx              lr
    331 endfunc
    332 
    333 function ff_h264_idct8_dc_add_neon, export=1
    334 h264_idct8_dc_add_neon_nothumb:
    335        mov             r3,       #0
    336        vld1.16         {d30[],d31[]},[r1,:16]
    337        strh            r3,       [r1]
    338        vld1.32         {d0},     [r0,:64], r2
    339        vrshr.s16       q15, q15, #6
    340        vld1.32         {d1},     [r0,:64], r2
    341        vld1.32         {d2},     [r0,:64], r2
    342        vaddw.u8        q8,  q15, d0
    343        vld1.32         {d3},     [r0,:64], r2
    344        vaddw.u8        q9,  q15, d1
    345        vld1.32         {d4},     [r0,:64], r2
    346        vaddw.u8        q10, q15, d2
    347        vld1.32         {d5},     [r0,:64], r2
    348        vaddw.u8        q11, q15, d3
    349        vld1.32         {d6},     [r0,:64], r2
    350        vaddw.u8        q12, q15, d4
    351        vld1.32         {d7},     [r0,:64], r2
    352        vaddw.u8        q13, q15, d5
    353        vaddw.u8        q14, q15, d6
    354        vaddw.u8        q15, q15, d7
    355        vqmovun.s16     d0,  q8
    356        vqmovun.s16     d1,  q9
    357        vqmovun.s16     d2,  q10
    358        vqmovun.s16     d3,  q11
    359        sub             r0,  r0,  r2, lsl #3
    360        vst1.32         {d0},     [r0,:64], r2
    361        vqmovun.s16     d4,  q12
    362        vst1.32         {d1},     [r0,:64], r2
    363        vqmovun.s16     d5,  q13
    364        vst1.32         {d2},     [r0,:64], r2
    365        vqmovun.s16     d6,  q14
    366        vst1.32         {d3},     [r0,:64], r2
    367        vqmovun.s16     d7,  q15
    368        vst1.32         {d4},     [r0,:64], r2
    369        vst1.32         {d5},     [r0,:64], r2
    370        vst1.32         {d6},     [r0,:64], r2
    371        vst1.32         {d7},     [r0,:64], r2
    372        bx              lr
    373 endfunc
    374 
    375 function ff_h264_idct8_add4_neon, export=1
    376        push            {r4-r8,lr}
    377        mov             r4,  r0
    378        mov             r5,  r1
    379        mov             r1,  r2
    380        mov             r2,  r3
    381        ldr             r6,  [sp, #24]
    382        movrel          r7,  scan8
    383        mov             r12, #16
    384 1:      ldrb            r8,  [r7], #4
    385        ldr             r0,  [r5], #16
    386        ldrb            r8,  [r6, r8]
    387        subs            r8,  r8,  #1
    388        blt             2f
    389        ldrsh           lr,  [r1]
    390        add             r0,  r0,  r4
    391        it              ne
    392        movne           lr,  #0
    393        cmp             lr,  #0
    394        ite             ne
    395        adrne           lr,  h264_idct8_dc_add_neon_nothumb + CONFIG_THUMB
    396        adreq           lr,  h264_idct8_add_neon_nothumb    + CONFIG_THUMB
    397        blx             lr
    398 2:      subs            r12, r12, #4
    399        add             r1,  r1,  #128
    400        bne             1b
    401        pop             {r4-r8,pc}
    402 endfunc
    403 
    404 const   scan8
    405        .byte           4+ 1*8, 5+ 1*8, 4+ 2*8, 5+ 2*8
    406        .byte           6+ 1*8, 7+ 1*8, 6+ 2*8, 7+ 2*8
    407        .byte           4+ 3*8, 5+ 3*8, 4+ 4*8, 5+ 4*8
    408        .byte           6+ 3*8, 7+ 3*8, 6+ 4*8, 7+ 4*8
    409        .byte           4+ 6*8, 5+ 6*8, 4+ 7*8, 5+ 7*8
    410        .byte           6+ 6*8, 7+ 6*8, 6+ 7*8, 7+ 7*8
    411        .byte           4+ 8*8, 5+ 8*8, 4+ 9*8, 5+ 9*8
    412        .byte           6+ 8*8, 7+ 8*8, 6+ 9*8, 7+ 9*8
    413        .byte           4+11*8, 5+11*8, 4+12*8, 5+12*8
    414        .byte           6+11*8, 7+11*8, 6+12*8, 7+12*8
    415        .byte           4+13*8, 5+13*8, 4+14*8, 5+14*8
    416        .byte           6+13*8, 7+13*8, 6+14*8, 7+14*8
    417 endconst