1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/media/libvpx/vp8/encoder/arm/neon/shortfdct_neon.asm Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,221 @@ 1.4 +; 1.5 +; Copyright (c) 2010 The WebM project authors. All Rights Reserved. 1.6 +; 1.7 +; Use of this source code is governed by a BSD-style license 1.8 +; that can be found in the LICENSE file in the root of the source 1.9 +; tree. An additional intellectual property rights grant can be found 1.10 +; in the file PATENTS. All contributing project authors may 1.11 +; be found in the AUTHORS file in the root of the source tree. 1.12 +; 1.13 + 1.14 + 1.15 + EXPORT |vp8_short_fdct4x4_neon| 1.16 + EXPORT |vp8_short_fdct8x4_neon| 1.17 + 1.18 + ARM 1.19 + REQUIRE8 1.20 + PRESERVE8 1.21 + 1.22 + AREA ||.text||, CODE, READONLY, ALIGN=4 1.23 + 1.24 + 1.25 + ALIGN 16 ; enable use of @128 bit aligned loads 1.26 +coeff 1.27 + DCW 5352, 5352, 5352, 5352 1.28 + DCW 2217, 2217, 2217, 2217 1.29 + DCD 14500, 14500, 14500, 14500 1.30 + DCD 7500, 7500, 7500, 7500 1.31 + DCD 12000, 12000, 12000, 12000 1.32 + DCD 51000, 51000, 51000, 51000 1.33 + 1.34 +;void vp8_short_fdct4x4_c(short *input, short *output, int pitch) 1.35 +|vp8_short_fdct4x4_neon| PROC 1.36 + 1.37 + ; Part one 1.38 + vld1.16 {d0}, [r0@64], r2 1.39 + adr r12, coeff 1.40 + vld1.16 {d1}, [r0@64], r2 1.41 + vld1.16 {q8}, [r12@128]! ; d16=5352, d17=2217 1.42 + vld1.16 {d2}, [r0@64], r2 1.43 + vld1.32 {q9, q10}, [r12@128]! ; q9=14500, q10=7500 1.44 + vld1.16 {d3}, [r0@64], r2 1.45 + 1.46 + ; transpose d0=ip[0], d1=ip[1], d2=ip[2], d3=ip[3] 1.47 + vtrn.32 d0, d2 1.48 + vtrn.32 d1, d3 1.49 + vld1.32 {q11,q12}, [r12@128] ; q11=12000, q12=51000 1.50 + vtrn.16 d0, d1 1.51 + vtrn.16 d2, d3 1.52 + 1.53 + vadd.s16 d4, d0, d3 ; a1 = ip[0] + ip[3] 1.54 + vadd.s16 d5, d1, d2 ; b1 = ip[1] + ip[2] 1.55 + vsub.s16 d6, d1, d2 ; c1 = ip[1] - ip[2] 1.56 + vsub.s16 d7, d0, d3 ; d1 = ip[0] - ip[3] 1.57 + 1.58 + vshl.s16 q2, q2, #3 ; (a1, b1) << 3 1.59 + vshl.s16 q3, q3, #3 ; (c1, d1) << 3 1.60 + 1.61 + vadd.s16 d0, d4, d5 ; op[0] = a1 + b1 1.62 + vsub.s16 d2, d4, d5 ; op[2] = a1 - b1 1.63 + 1.64 + vmlal.s16 q9, d7, d16 ; d1*5352 + 14500 1.65 + vmlal.s16 q10, d7, d17 ; d1*2217 + 7500 1.66 + vmlal.s16 q9, d6, d17 ; c1*2217 + d1*5352 + 14500 1.67 + vmlsl.s16 q10, d6, d16 ; d1*2217 - c1*5352 + 7500 1.68 + 1.69 + vshrn.s32 d1, q9, #12 ; op[1] = (c1*2217 + d1*5352 + 14500)>>12 1.70 + vshrn.s32 d3, q10, #12 ; op[3] = (d1*2217 - c1*5352 + 7500)>>12 1.71 + 1.72 + 1.73 + ; Part two 1.74 + 1.75 + ; transpose d0=ip[0], d1=ip[4], d2=ip[8], d3=ip[12] 1.76 + vtrn.32 d0, d2 1.77 + vtrn.32 d1, d3 1.78 + vtrn.16 d0, d1 1.79 + vtrn.16 d2, d3 1.80 + 1.81 + vmov.s16 d26, #7 1.82 + 1.83 + vadd.s16 d4, d0, d3 ; a1 = ip[0] + ip[12] 1.84 + vadd.s16 d5, d1, d2 ; b1 = ip[4] + ip[8] 1.85 + vsub.s16 d6, d1, d2 ; c1 = ip[4] - ip[8] 1.86 + vadd.s16 d4, d4, d26 ; a1 + 7 1.87 + vsub.s16 d7, d0, d3 ; d1 = ip[0] - ip[12] 1.88 + 1.89 + vadd.s16 d0, d4, d5 ; op[0] = a1 + b1 + 7 1.90 + vsub.s16 d2, d4, d5 ; op[8] = a1 - b1 + 7 1.91 + 1.92 + vmlal.s16 q11, d7, d16 ; d1*5352 + 12000 1.93 + vmlal.s16 q12, d7, d17 ; d1*2217 + 51000 1.94 + 1.95 + vceq.s16 d4, d7, #0 1.96 + 1.97 + vshr.s16 d0, d0, #4 1.98 + vshr.s16 d2, d2, #4 1.99 + 1.100 + vmlal.s16 q11, d6, d17 ; c1*2217 + d1*5352 + 12000 1.101 + vmlsl.s16 q12, d6, d16 ; d1*2217 - c1*5352 + 51000 1.102 + 1.103 + vmvn d4, d4 1.104 + vshrn.s32 d1, q11, #16 ; op[4] = (c1*2217 + d1*5352 + 12000)>>16 1.105 + vsub.s16 d1, d1, d4 ; op[4] += (d1!=0) 1.106 + vshrn.s32 d3, q12, #16 ; op[12]= (d1*2217 - c1*5352 + 51000)>>16 1.107 + 1.108 + vst1.16 {q0, q1}, [r1@128] 1.109 + 1.110 + bx lr 1.111 + 1.112 + ENDP 1.113 + 1.114 +;void vp8_short_fdct8x4_c(short *input, short *output, int pitch) 1.115 +|vp8_short_fdct8x4_neon| PROC 1.116 + 1.117 + ; Part one 1.118 + 1.119 + vld1.16 {q0}, [r0@128], r2 1.120 + adr r12, coeff 1.121 + vld1.16 {q1}, [r0@128], r2 1.122 + vld1.16 {q8}, [r12@128]! ; d16=5352, d17=2217 1.123 + vld1.16 {q2}, [r0@128], r2 1.124 + vld1.32 {q9, q10}, [r12@128]! ; q9=14500, q10=7500 1.125 + vld1.16 {q3}, [r0@128], r2 1.126 + 1.127 + ; transpose q0=ip[0], q1=ip[1], q2=ip[2], q3=ip[3] 1.128 + vtrn.32 q0, q2 ; [A0|B0] 1.129 + vtrn.32 q1, q3 ; [A1|B1] 1.130 + vtrn.16 q0, q1 ; [A2|B2] 1.131 + vtrn.16 q2, q3 ; [A3|B3] 1.132 + 1.133 + vadd.s16 q11, q0, q3 ; a1 = ip[0] + ip[3] 1.134 + vadd.s16 q12, q1, q2 ; b1 = ip[1] + ip[2] 1.135 + vsub.s16 q13, q1, q2 ; c1 = ip[1] - ip[2] 1.136 + vsub.s16 q14, q0, q3 ; d1 = ip[0] - ip[3] 1.137 + 1.138 + vshl.s16 q11, q11, #3 ; a1 << 3 1.139 + vshl.s16 q12, q12, #3 ; b1 << 3 1.140 + vshl.s16 q13, q13, #3 ; c1 << 3 1.141 + vshl.s16 q14, q14, #3 ; d1 << 3 1.142 + 1.143 + vadd.s16 q0, q11, q12 ; [A0 | B0] = a1 + b1 1.144 + vsub.s16 q2, q11, q12 ; [A2 | B2] = a1 - b1 1.145 + 1.146 + vmov.s16 q11, q9 ; 14500 1.147 + vmov.s16 q12, q10 ; 7500 1.148 + 1.149 + vmlal.s16 q9, d28, d16 ; A[1] = d1*5352 + 14500 1.150 + vmlal.s16 q10, d28, d17 ; A[3] = d1*2217 + 7500 1.151 + vmlal.s16 q11, d29, d16 ; B[1] = d1*5352 + 14500 1.152 + vmlal.s16 q12, d29, d17 ; B[3] = d1*2217 + 7500 1.153 + 1.154 + vmlal.s16 q9, d26, d17 ; A[1] = c1*2217 + d1*5352 + 14500 1.155 + vmlsl.s16 q10, d26, d16 ; A[3] = d1*2217 - c1*5352 + 7500 1.156 + vmlal.s16 q11, d27, d17 ; B[1] = c1*2217 + d1*5352 + 14500 1.157 + vmlsl.s16 q12, d27, d16 ; B[3] = d1*2217 - c1*5352 + 7500 1.158 + 1.159 + vshrn.s32 d2, q9, #12 ; A[1] = (c1*2217 + d1*5352 + 14500)>>12 1.160 + vshrn.s32 d6, q10, #12 ; A[3] = (d1*2217 - c1*5352 + 7500)>>12 1.161 + vshrn.s32 d3, q11, #12 ; B[1] = (c1*2217 + d1*5352 + 14500)>>12 1.162 + vshrn.s32 d7, q12, #12 ; B[3] = (d1*2217 - c1*5352 + 7500)>>12 1.163 + 1.164 + 1.165 + ; Part two 1.166 + vld1.32 {q9,q10}, [r12@128] ; q9=12000, q10=51000 1.167 + 1.168 + ; transpose q0=ip[0], q1=ip[4], q2=ip[8], q3=ip[12] 1.169 + vtrn.32 q0, q2 ; q0=[A0 | B0] 1.170 + vtrn.32 q1, q3 ; q1=[A4 | B4] 1.171 + vtrn.16 q0, q1 ; q2=[A8 | B8] 1.172 + vtrn.16 q2, q3 ; q3=[A12|B12] 1.173 + 1.174 + vmov.s16 q15, #7 1.175 + 1.176 + vadd.s16 q11, q0, q3 ; a1 = ip[0] + ip[12] 1.177 + vadd.s16 q12, q1, q2 ; b1 = ip[4] + ip[8] 1.178 + vadd.s16 q11, q11, q15 ; a1 + 7 1.179 + vsub.s16 q13, q1, q2 ; c1 = ip[4] - ip[8] 1.180 + vsub.s16 q14, q0, q3 ; d1 = ip[0] - ip[12] 1.181 + 1.182 + vadd.s16 q0, q11, q12 ; a1 + b1 + 7 1.183 + vsub.s16 q1, q11, q12 ; a1 - b1 + 7 1.184 + 1.185 + vmov.s16 q11, q9 ; 12000 1.186 + vmov.s16 q12, q10 ; 51000 1.187 + 1.188 + vshr.s16 d0, d0, #4 ; A[0] = (a1 + b1 + 7)>>4 1.189 + vshr.s16 d4, d1, #4 ; B[0] = (a1 + b1 + 7)>>4 1.190 + vshr.s16 d2, d2, #4 ; A[8] = (a1 + b1 + 7)>>4 1.191 + vshr.s16 d6, d3, #4 ; B[8] = (a1 + b1 + 7)>>4 1.192 + 1.193 + 1.194 + vmlal.s16 q9, d28, d16 ; A[4] = d1*5352 + 12000 1.195 + vmlal.s16 q10, d28, d17 ; A[12] = d1*2217 + 51000 1.196 + vmlal.s16 q11, d29, d16 ; B[4] = d1*5352 + 12000 1.197 + vmlal.s16 q12, d29, d17 ; B[12] = d1*2217 + 51000 1.198 + 1.199 + vceq.s16 q14, q14, #0 1.200 + 1.201 + vmlal.s16 q9, d26, d17 ; A[4] = c1*2217 + d1*5352 + 12000 1.202 + vmlsl.s16 q10, d26, d16 ; A[12] = d1*2217 - c1*5352 + 51000 1.203 + vmlal.s16 q11, d27, d17 ; B[4] = c1*2217 + d1*5352 + 12000 1.204 + vmlsl.s16 q12, d27, d16 ; B[12] = d1*2217 - c1*5352 + 51000 1.205 + 1.206 + vmvn q14, q14 1.207 + 1.208 + vshrn.s32 d1, q9, #16 ; A[4] = (c1*2217 + d1*5352 + 12000)>>16 1.209 + vshrn.s32 d3, q10, #16 ; A[12]= (d1*2217 - c1*5352 + 51000)>>16 1.210 + vsub.s16 d1, d1, d28 ; A[4] += (d1!=0) 1.211 + 1.212 + vshrn.s32 d5, q11, #16 ; B[4] = (c1*2217 + d1*5352 + 12000)>>16 1.213 + vshrn.s32 d7, q12, #16 ; B[12]= (d1*2217 - c1*5352 + 51000)>>16 1.214 + vsub.s16 d5, d5, d29 ; B[4] += (d1!=0) 1.215 + 1.216 + vst1.16 {q0, q1}, [r1@128]! ; block A 1.217 + vst1.16 {q2, q3}, [r1@128]! ; block B 1.218 + 1.219 + bx lr 1.220 + 1.221 + ENDP 1.222 + 1.223 + END 1.224 +