diff libavcodec/arm/h264idct_neon.S @ 2:897f711a7157

rearrange to work with autoconf
author Nina Engelhardt <nengel@mailbox.tu-berlin.de>
date Tue, 25 Sep 2012 15:55:33 +0200
parents
children
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/libavcodec/arm/h264idct_neon.S	Tue Sep 25 15:55:33 2012 +0200
     1.3 @@ -0,0 +1,180 @@
     1.4 +/*
     1.5 + * Copyright (c) 2008 Mans Rullgard <mans@mansr.com>
     1.6 + *
     1.7 + * This file is part of FFmpeg.
     1.8 + *
     1.9 + * FFmpeg is free software; you can redistribute it and/or
    1.10 + * modify it under the terms of the GNU Lesser General Public
    1.11 + * License as published by the Free Software Foundation; either
    1.12 + * version 2.1 of the License, or (at your option) any later version.
    1.13 + *
    1.14 + * FFmpeg is distributed in the hope that it will be useful,
    1.15 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    1.16 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    1.17 + * Lesser General Public License for more details.
    1.18 + *
    1.19 + * You should have received a copy of the GNU Lesser General Public
    1.20 + * License along with FFmpeg; if not, write to the Free Software
    1.21 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
    1.22 + */
    1.23 +
    1.24 +#include "asm.S"
    1.25 +
    1.26 +        preserve8
    1.27 +        .text
    1.28 +
    1.29 +function ff_h264_idct_add_neon, export=1
    1.30 +        vld1.64         {d0-d3},  [r1,:128]
    1.31 +
    1.32 +        vswp            d1,  d2
    1.33 +        vadd.i16        d4,  d0,  d1
    1.34 +        vshr.s16        q8,  q1,  #1
    1.35 +        vsub.i16        d5,  d0,  d1
    1.36 +        vadd.i16        d6,  d2,  d17
    1.37 +        vsub.i16        d7,  d16, d3
    1.38 +        vadd.i16        q0,  q2,  q3
    1.39 +        vsub.i16        q1,  q2,  q3
    1.40 +
    1.41 +        vtrn.16         d0,  d1
    1.42 +        vtrn.16         d3,  d2
    1.43 +        vtrn.32         d0,  d3
    1.44 +        vtrn.32         d1,  d2
    1.45 +
    1.46 +        vadd.i16        d4,  d0,  d3
    1.47 +        vld1.32         {d18[0]}, [r0,:32], r2
    1.48 +        vswp            d1,  d3
    1.49 +        vshr.s16        q8,  q1,  #1
    1.50 +        vld1.32         {d19[1]}, [r0,:32], r2
    1.51 +        vsub.i16        d5,  d0,  d1
    1.52 +        vld1.32         {d18[1]}, [r0,:32], r2
    1.53 +        vadd.i16        d6,  d16, d3
    1.54 +        vld1.32         {d19[0]}, [r0,:32], r2
    1.55 +        vsub.i16        d7,  d2,  d17
    1.56 +        sub             r0,  r0,  r2, lsl #2
    1.57 +        vadd.i16        q0,  q2,  q3
    1.58 +        vsub.i16        q1,  q2,  q3
    1.59 +
    1.60 +        vrshr.s16       q0,  q0,  #6
    1.61 +        vrshr.s16       q1,  q1,  #6
    1.62 +
    1.63 +        vaddw.u8        q0,  q0,  d18
    1.64 +        vaddw.u8        q1,  q1,  d19
    1.65 +
    1.66 +        vqmovun.s16     d0,  q0
    1.67 +        vqmovun.s16     d1,  q1
    1.68 +
    1.69 +        vst1.32         {d0[0]},  [r0,:32], r2
    1.70 +        vst1.32         {d1[1]},  [r0,:32], r2
    1.71 +        vst1.32         {d0[1]},  [r0,:32], r2
    1.72 +        vst1.32         {d1[0]},  [r0,:32], r2
    1.73 +
    1.74 +        bx              lr
    1.75 +endfunc
    1.76 +
    1.77 +function ff_h264_idct_dc_add_neon, export=1
    1.78 +        vld1.16         {d2[],d3[]}, [r1,:16]
    1.79 +        vrshr.s16       q1,  q1,  #6
    1.80 +        vld1.32         {d0[0]},  [r0,:32], r2
    1.81 +        vld1.32         {d0[1]},  [r0,:32], r2
    1.82 +        vaddw.u8        q2,  q1,  d0
    1.83 +        vld1.32         {d1[0]},  [r0,:32], r2
    1.84 +        vld1.32         {d1[1]},  [r0,:32], r2
    1.85 +        vaddw.u8        q1,  q1,  d1
    1.86 +        vqmovun.s16     d0,  q2
    1.87 +        vqmovun.s16     d1,  q1
    1.88 +        sub             r0,  r0,  r2, lsl #2
    1.89 +        vst1.32         {d0[0]},  [r0,:32], r2
    1.90 +        vst1.32         {d0[1]},  [r0,:32], r2
    1.91 +        vst1.32         {d1[0]},  [r0,:32], r2
    1.92 +        vst1.32         {d1[1]},  [r0,:32], r2
    1.93 +        bx              lr
    1.94 +endfunc
    1.95 +
    1.96 +function ff_h264_idct_add16_neon, export=1
    1.97 +        push            {r4-r8,lr}
    1.98 +        mov             r4,  r0
    1.99 +        mov             r5,  r1
   1.100 +        mov             r1,  r2
   1.101 +        mov             r2,  r3
   1.102 +        ldr             r6,  [sp, #24]
   1.103 +        movrel          r7,  scan8
   1.104 +        mov             ip,  #16
   1.105 +1:      ldrb            r8,  [r7], #1
   1.106 +        ldr             r0,  [r5], #4
   1.107 +        ldrb            r8,  [r6, r8]
   1.108 +        subs            r8,  r8,  #1
   1.109 +        blt             2f
   1.110 +        ldrsh           lr,  [r1]
   1.111 +        add             r0,  r0,  r4
   1.112 +        movne           lr,  #0
   1.113 +        cmp             lr,  #0
   1.114 +        adrne           lr,  ff_h264_idct_dc_add_neon
   1.115 +        adreq           lr,  ff_h264_idct_add_neon
   1.116 +        blx             lr
   1.117 +2:      subs            ip,  ip,  #1
   1.118 +        add             r1,  r1,  #32
   1.119 +        bne             1b
   1.120 +        pop             {r4-r8,pc}
   1.121 +endfunc
   1.122 +
   1.123 +function ff_h264_idct_add16intra_neon, export=1
   1.124 +        push            {r4-r8,lr}
   1.125 +        mov             r4,  r0
   1.126 +        mov             r5,  r1
   1.127 +        mov             r1,  r2
   1.128 +        mov             r2,  r3
   1.129 +        ldr             r6,  [sp, #24]
   1.130 +        movrel          r7,  scan8
   1.131 +        mov             ip,  #16
   1.132 +1:      ldrb            r8,  [r7], #1
   1.133 +        ldr             r0,  [r5], #4
   1.134 +        ldrb            r8,  [r6, r8]
   1.135 +        add             r0,  r0,  r4
   1.136 +        cmp             r8,  #0
   1.137 +        ldrsh           r8,  [r1]
   1.138 +        adrne           lr,  ff_h264_idct_add_neon
   1.139 +        adreq           lr,  ff_h264_idct_dc_add_neon
   1.140 +        cmpeq           r8,  #0
   1.141 +        blxne           lr
   1.142 +        subs            ip,  ip,  #1
   1.143 +        add             r1,  r1,  #32
   1.144 +        bne             1b
   1.145 +        pop             {r4-r8,pc}
   1.146 +endfunc
   1.147 +
   1.148 +function ff_h264_idct_add8_neon, export=1
   1.149 +        push            {r4-r10,lr}
   1.150 +        ldm             r0,  {r4,r9}
   1.151 +        add             r5,  r1,  #16*4
   1.152 +        add             r1,  r2,  #16*32
   1.153 +        mov             r2,  r3
   1.154 +        ldr             r6,  [sp, #32]
   1.155 +        movrel          r7,  scan8+16
   1.156 +        mov             ip,  #8
   1.157 +1:      ldrb            r8,  [r7], #1
   1.158 +        ldr             r0,  [r5], #4
   1.159 +        ldrb            r8,  [r6, r8]
   1.160 +        tst             ip,  #4
   1.161 +        addeq           r0,  r0,  r4
   1.162 +        addne           r0,  r0,  r9
   1.163 +        cmp             r8,  #0
   1.164 +        ldrsh           r8,  [r1]
   1.165 +        adrne           lr,  ff_h264_idct_add_neon
   1.166 +        adreq           lr,  ff_h264_idct_dc_add_neon
   1.167 +        cmpeq           r8,  #0
   1.168 +        blxne           lr
   1.169 +        subs            ip,  ip,  #1
   1.170 +        add             r1,  r1,  #32
   1.171 +        bne             1b
   1.172 +        pop             {r4-r10,pc}
   1.173 +endfunc
   1.174 +
   1.175 +        .section .rodata
   1.176 +scan8:  .byte           4+1*8, 5+1*8, 4+2*8, 5+2*8
   1.177 +        .byte           6+1*8, 7+1*8, 6+2*8, 7+2*8
   1.178 +        .byte           4+3*8, 5+3*8, 4+4*8, 5+4*8
   1.179 +        .byte           6+3*8, 7+3*8, 6+4*8, 7+4*8
   1.180 +        .byte           1+1*8, 2+1*8
   1.181 +        .byte           1+2*8, 2+2*8
   1.182 +        .byte           1+4*8, 2+4*8
   1.183 +        .byte           1+5*8, 2+5*8