diff libavcodec/arm/int_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/int_neon.S	Tue Sep 25 15:55:33 2012 +0200
     1.3 @@ -0,0 +1,118 @@
     1.4 +/*
     1.5 + * ARM NEON optimised integer operations
     1.6 + * Copyright (c) 2009 Kostya Shishkov
     1.7 + *
     1.8 + * This file is part of FFmpeg.
     1.9 + *
    1.10 + * FFmpeg is free software; you can redistribute it and/or
    1.11 + * modify it under the terms of the GNU Lesser General Public
    1.12 + * License as published by the Free Software Foundation; either
    1.13 + * version 2.1 of the License, or (at your option) any later version.
    1.14 + *
    1.15 + * FFmpeg is distributed in the hope that it will be useful,
    1.16 + * but WITHOUT ANY WARRANTY; without even the implied warranty of
    1.17 + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
    1.18 + * Lesser General Public License for more details.
    1.19 + *
    1.20 + * You should have received a copy of the GNU Lesser General Public
    1.21 + * License along with FFmpeg; if not, write to the Free Software
    1.22 + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
    1.23 + */
    1.24 +
    1.25 +#include "asm.S"
    1.26 +
    1.27 +        preserve8
    1.28 +        .fpu neon
    1.29 +        .text
    1.30 +
    1.31 +function ff_scalarproduct_int16_neon, export=1
    1.32 +        vmov.i16        q0,  #0
    1.33 +        vmov.i16        q1,  #0
    1.34 +        vmov.i16        q2,  #0
    1.35 +        vmov.i16        q3,  #0
    1.36 +        negs            r3,  r3
    1.37 +        beq             2f
    1.38 +
    1.39 +        vdup.s32        q12, r3
    1.40 +1:      vld1.16         {d16-d17}, [r0]!
    1.41 +        vld1.16         {d20-d21}, [r1,:128]!
    1.42 +        vmull.s16       q12, d16,  d20
    1.43 +        vld1.16         {d18-d19}, [r0]!
    1.44 +        vmull.s16       q13, d17,  d21
    1.45 +        vld1.16         {d22-d23}, [r1,:128]!
    1.46 +        vmull.s16       q14, d18,  d22
    1.47 +        vmull.s16       q15, d19,  d23
    1.48 +        vshl.s32        q8,  q12,  q12
    1.49 +        vshl.s32        q9,  q13,  q12
    1.50 +        vadd.s32        q0,  q0,   q8
    1.51 +        vshl.s32        q10, q14,  q12
    1.52 +        vadd.s32        q1,  q1,   q9
    1.53 +        vshl.s32        q11, q15,  q12
    1.54 +        vadd.s32        q2,  q2,   q10
    1.55 +        vadd.s32        q3,  q3,   q11
    1.56 +        subs            r2,  r2,   #16
    1.57 +        bne             1b
    1.58 +        b               3f
    1.59 +
    1.60 +2:      vld1.16         {d16-d17}, [r0]!
    1.61 +        vld1.16         {d20-d21}, [r1,:128]!
    1.62 +        vmlal.s16       q0,  d16,  d20
    1.63 +        vld1.16         {d18-d19}, [r0]!
    1.64 +        vmlal.s16       q1,  d17,  d21
    1.65 +        vld1.16         {d22-d23}, [r1,:128]!
    1.66 +        vmlal.s16       q2,  d18,  d22
    1.67 +        vmlal.s16       q3,  d19,  d23
    1.68 +        subs            r2,  r2,   #16
    1.69 +        bne             2b
    1.70 +
    1.71 +3:      vpadd.s32       d16, d0,   d1
    1.72 +        vpadd.s32       d17, d2,   d3
    1.73 +        vpadd.s32       d10, d4,   d5
    1.74 +        vpadd.s32       d11, d6,   d7
    1.75 +        vpadd.s32       d0,  d16,  d17
    1.76 +        vpadd.s32       d1,  d10,  d11
    1.77 +        vpadd.s32       d2,  d0,   d1
    1.78 +        vpaddl.s32      d3,  d2
    1.79 +        vmov.32         r0,  d3[0]
    1.80 +        bx              lr
    1.81 +endfunc
    1.82 +
    1.83 +@ scalarproduct_and_madd_int16(/*aligned*/v0,v1,v2,order,mul)
    1.84 +function ff_scalarproduct_and_madd_int16_neon, export=1
    1.85 +        vld1.16         {d28[],d29[]}, [sp]
    1.86 +        vmov.i16        q0,  #0
    1.87 +        vmov.i16        q1,  #0
    1.88 +        vmov.i16        q2,  #0
    1.89 +        vmov.i16        q3,  #0
    1.90 +        mov             r12, r0
    1.91 +
    1.92 +1:      vld1.16         {d16-d17}, [r0,:128]!
    1.93 +        vld1.16         {d18-d19}, [r1]!
    1.94 +        vld1.16         {d20-d21}, [r2]!
    1.95 +        vld1.16         {d22-d23}, [r0,:128]!
    1.96 +        vld1.16         {d24-d25}, [r1]!
    1.97 +        vld1.16         {d26-d27}, [r2]!
    1.98 +        vmul.s16        q10, q10,  q14
    1.99 +        vmul.s16        q13, q13,  q14
   1.100 +        vmlal.s16       q0,  d16,  d18
   1.101 +        vmlal.s16       q1,  d17,  d19
   1.102 +        vadd.s16        q10, q8,   q10
   1.103 +        vadd.s16        q13, q11,  q13
   1.104 +        vmlal.s16       q2,  d22,  d24
   1.105 +        vmlal.s16       q3,  d23,  d25
   1.106 +        vst1.16         {q10},     [r12,:128]!
   1.107 +        subs            r3,  r3,   #16
   1.108 +        vst1.16         {q13},     [r12,:128]!
   1.109 +        bne             1b
   1.110 +
   1.111 +        vpadd.s32       d16, d0,   d1
   1.112 +        vpadd.s32       d17, d2,   d3
   1.113 +        vpadd.s32       d10, d4,   d5
   1.114 +        vpadd.s32       d11, d6,   d7
   1.115 +        vpadd.s32       d0,  d16,  d17
   1.116 +        vpadd.s32       d1,  d10,  d11
   1.117 +        vpadd.s32       d2,  d0,   d1
   1.118 +        vpaddl.s32      d3,  d2
   1.119 +        vmov.32         r0,  d3[0]
   1.120 +        bx              lr
   1.121 +endfunc