Wed, 31 Dec 2014 06:09:35 +0100
Cloned upstream origin tor-browser at tor-browser-31.3.0esr-4.5-1-build1
revision ID fc1c9ff7c1b2defdbc039f12214767608f46423f for hacking purpose.
1 ;
2 ; Copyright (c) 2010 The WebM project authors. All Rights Reserved.
3 ;
4 ; Use of this source code is governed by a BSD-style license
5 ; that can be found in the LICENSE file in the root of the source
6 ; tree. An additional intellectual property rights grant can be found
7 ; in the file PATENTS. All contributing project authors may
8 ; be found in the AUTHORS file in the root of the source tree.
9 ;
12 EXPORT |vp8_short_fdct4x4_neon|
13 EXPORT |vp8_short_fdct8x4_neon|
15 ARM
16 REQUIRE8
17 PRESERVE8
19 AREA ||.text||, CODE, READONLY, ALIGN=4
22 ALIGN 16 ; enable use of @128 bit aligned loads
23 coeff
24 DCW 5352, 5352, 5352, 5352
25 DCW 2217, 2217, 2217, 2217
26 DCD 14500, 14500, 14500, 14500
27 DCD 7500, 7500, 7500, 7500
28 DCD 12000, 12000, 12000, 12000
29 DCD 51000, 51000, 51000, 51000
31 ;void vp8_short_fdct4x4_c(short *input, short *output, int pitch)
32 |vp8_short_fdct4x4_neon| PROC
34 ; Part one
35 vld1.16 {d0}, [r0@64], r2
36 adr r12, coeff
37 vld1.16 {d1}, [r0@64], r2
38 vld1.16 {q8}, [r12@128]! ; d16=5352, d17=2217
39 vld1.16 {d2}, [r0@64], r2
40 vld1.32 {q9, q10}, [r12@128]! ; q9=14500, q10=7500
41 vld1.16 {d3}, [r0@64], r2
43 ; transpose d0=ip[0], d1=ip[1], d2=ip[2], d3=ip[3]
44 vtrn.32 d0, d2
45 vtrn.32 d1, d3
46 vld1.32 {q11,q12}, [r12@128] ; q11=12000, q12=51000
47 vtrn.16 d0, d1
48 vtrn.16 d2, d3
50 vadd.s16 d4, d0, d3 ; a1 = ip[0] + ip[3]
51 vadd.s16 d5, d1, d2 ; b1 = ip[1] + ip[2]
52 vsub.s16 d6, d1, d2 ; c1 = ip[1] - ip[2]
53 vsub.s16 d7, d0, d3 ; d1 = ip[0] - ip[3]
55 vshl.s16 q2, q2, #3 ; (a1, b1) << 3
56 vshl.s16 q3, q3, #3 ; (c1, d1) << 3
58 vadd.s16 d0, d4, d5 ; op[0] = a1 + b1
59 vsub.s16 d2, d4, d5 ; op[2] = a1 - b1
61 vmlal.s16 q9, d7, d16 ; d1*5352 + 14500
62 vmlal.s16 q10, d7, d17 ; d1*2217 + 7500
63 vmlal.s16 q9, d6, d17 ; c1*2217 + d1*5352 + 14500
64 vmlsl.s16 q10, d6, d16 ; d1*2217 - c1*5352 + 7500
66 vshrn.s32 d1, q9, #12 ; op[1] = (c1*2217 + d1*5352 + 14500)>>12
67 vshrn.s32 d3, q10, #12 ; op[3] = (d1*2217 - c1*5352 + 7500)>>12
70 ; Part two
72 ; transpose d0=ip[0], d1=ip[4], d2=ip[8], d3=ip[12]
73 vtrn.32 d0, d2
74 vtrn.32 d1, d3
75 vtrn.16 d0, d1
76 vtrn.16 d2, d3
78 vmov.s16 d26, #7
80 vadd.s16 d4, d0, d3 ; a1 = ip[0] + ip[12]
81 vadd.s16 d5, d1, d2 ; b1 = ip[4] + ip[8]
82 vsub.s16 d6, d1, d2 ; c1 = ip[4] - ip[8]
83 vadd.s16 d4, d4, d26 ; a1 + 7
84 vsub.s16 d7, d0, d3 ; d1 = ip[0] - ip[12]
86 vadd.s16 d0, d4, d5 ; op[0] = a1 + b1 + 7
87 vsub.s16 d2, d4, d5 ; op[8] = a1 - b1 + 7
89 vmlal.s16 q11, d7, d16 ; d1*5352 + 12000
90 vmlal.s16 q12, d7, d17 ; d1*2217 + 51000
92 vceq.s16 d4, d7, #0
94 vshr.s16 d0, d0, #4
95 vshr.s16 d2, d2, #4
97 vmlal.s16 q11, d6, d17 ; c1*2217 + d1*5352 + 12000
98 vmlsl.s16 q12, d6, d16 ; d1*2217 - c1*5352 + 51000
100 vmvn d4, d4
101 vshrn.s32 d1, q11, #16 ; op[4] = (c1*2217 + d1*5352 + 12000)>>16
102 vsub.s16 d1, d1, d4 ; op[4] += (d1!=0)
103 vshrn.s32 d3, q12, #16 ; op[12]= (d1*2217 - c1*5352 + 51000)>>16
105 vst1.16 {q0, q1}, [r1@128]
107 bx lr
109 ENDP
111 ;void vp8_short_fdct8x4_c(short *input, short *output, int pitch)
112 |vp8_short_fdct8x4_neon| PROC
114 ; Part one
116 vld1.16 {q0}, [r0@128], r2
117 adr r12, coeff
118 vld1.16 {q1}, [r0@128], r2
119 vld1.16 {q8}, [r12@128]! ; d16=5352, d17=2217
120 vld1.16 {q2}, [r0@128], r2
121 vld1.32 {q9, q10}, [r12@128]! ; q9=14500, q10=7500
122 vld1.16 {q3}, [r0@128], r2
124 ; transpose q0=ip[0], q1=ip[1], q2=ip[2], q3=ip[3]
125 vtrn.32 q0, q2 ; [A0|B0]
126 vtrn.32 q1, q3 ; [A1|B1]
127 vtrn.16 q0, q1 ; [A2|B2]
128 vtrn.16 q2, q3 ; [A3|B3]
130 vadd.s16 q11, q0, q3 ; a1 = ip[0] + ip[3]
131 vadd.s16 q12, q1, q2 ; b1 = ip[1] + ip[2]
132 vsub.s16 q13, q1, q2 ; c1 = ip[1] - ip[2]
133 vsub.s16 q14, q0, q3 ; d1 = ip[0] - ip[3]
135 vshl.s16 q11, q11, #3 ; a1 << 3
136 vshl.s16 q12, q12, #3 ; b1 << 3
137 vshl.s16 q13, q13, #3 ; c1 << 3
138 vshl.s16 q14, q14, #3 ; d1 << 3
140 vadd.s16 q0, q11, q12 ; [A0 | B0] = a1 + b1
141 vsub.s16 q2, q11, q12 ; [A2 | B2] = a1 - b1
143 vmov.s16 q11, q9 ; 14500
144 vmov.s16 q12, q10 ; 7500
146 vmlal.s16 q9, d28, d16 ; A[1] = d1*5352 + 14500
147 vmlal.s16 q10, d28, d17 ; A[3] = d1*2217 + 7500
148 vmlal.s16 q11, d29, d16 ; B[1] = d1*5352 + 14500
149 vmlal.s16 q12, d29, d17 ; B[3] = d1*2217 + 7500
151 vmlal.s16 q9, d26, d17 ; A[1] = c1*2217 + d1*5352 + 14500
152 vmlsl.s16 q10, d26, d16 ; A[3] = d1*2217 - c1*5352 + 7500
153 vmlal.s16 q11, d27, d17 ; B[1] = c1*2217 + d1*5352 + 14500
154 vmlsl.s16 q12, d27, d16 ; B[3] = d1*2217 - c1*5352 + 7500
156 vshrn.s32 d2, q9, #12 ; A[1] = (c1*2217 + d1*5352 + 14500)>>12
157 vshrn.s32 d6, q10, #12 ; A[3] = (d1*2217 - c1*5352 + 7500)>>12
158 vshrn.s32 d3, q11, #12 ; B[1] = (c1*2217 + d1*5352 + 14500)>>12
159 vshrn.s32 d7, q12, #12 ; B[3] = (d1*2217 - c1*5352 + 7500)>>12
162 ; Part two
163 vld1.32 {q9,q10}, [r12@128] ; q9=12000, q10=51000
165 ; transpose q0=ip[0], q1=ip[4], q2=ip[8], q3=ip[12]
166 vtrn.32 q0, q2 ; q0=[A0 | B0]
167 vtrn.32 q1, q3 ; q1=[A4 | B4]
168 vtrn.16 q0, q1 ; q2=[A8 | B8]
169 vtrn.16 q2, q3 ; q3=[A12|B12]
171 vmov.s16 q15, #7
173 vadd.s16 q11, q0, q3 ; a1 = ip[0] + ip[12]
174 vadd.s16 q12, q1, q2 ; b1 = ip[4] + ip[8]
175 vadd.s16 q11, q11, q15 ; a1 + 7
176 vsub.s16 q13, q1, q2 ; c1 = ip[4] - ip[8]
177 vsub.s16 q14, q0, q3 ; d1 = ip[0] - ip[12]
179 vadd.s16 q0, q11, q12 ; a1 + b1 + 7
180 vsub.s16 q1, q11, q12 ; a1 - b1 + 7
182 vmov.s16 q11, q9 ; 12000
183 vmov.s16 q12, q10 ; 51000
185 vshr.s16 d0, d0, #4 ; A[0] = (a1 + b1 + 7)>>4
186 vshr.s16 d4, d1, #4 ; B[0] = (a1 + b1 + 7)>>4
187 vshr.s16 d2, d2, #4 ; A[8] = (a1 + b1 + 7)>>4
188 vshr.s16 d6, d3, #4 ; B[8] = (a1 + b1 + 7)>>4
191 vmlal.s16 q9, d28, d16 ; A[4] = d1*5352 + 12000
192 vmlal.s16 q10, d28, d17 ; A[12] = d1*2217 + 51000
193 vmlal.s16 q11, d29, d16 ; B[4] = d1*5352 + 12000
194 vmlal.s16 q12, d29, d17 ; B[12] = d1*2217 + 51000
196 vceq.s16 q14, q14, #0
198 vmlal.s16 q9, d26, d17 ; A[4] = c1*2217 + d1*5352 + 12000
199 vmlsl.s16 q10, d26, d16 ; A[12] = d1*2217 - c1*5352 + 51000
200 vmlal.s16 q11, d27, d17 ; B[4] = c1*2217 + d1*5352 + 12000
201 vmlsl.s16 q12, d27, d16 ; B[12] = d1*2217 - c1*5352 + 51000
203 vmvn q14, q14
205 vshrn.s32 d1, q9, #16 ; A[4] = (c1*2217 + d1*5352 + 12000)>>16
206 vshrn.s32 d3, q10, #16 ; A[12]= (d1*2217 - c1*5352 + 51000)>>16
207 vsub.s16 d1, d1, d28 ; A[4] += (d1!=0)
209 vshrn.s32 d5, q11, #16 ; B[4] = (c1*2217 + d1*5352 + 12000)>>16
210 vshrn.s32 d7, q12, #16 ; B[12]= (d1*2217 - c1*5352 + 51000)>>16
211 vsub.s16 d5, d5, d29 ; B[4] += (d1!=0)
213 vst1.16 {q0, q1}, [r1@128]! ; block A
214 vst1.16 {q2, q3}, [r1@128]! ; block B
216 bx lr
218 ENDP
220 END