History

Convert all tabs to spaces in assembly sources, unify indentation

Previously the assembly sources had mixed indentation consisting of both spaces and tabs, making it quite hard to read unless the right tab size was used in the editor. Tabs have been interpreted as 4 spaces in most cases, matching the surrounding code.

Martin Storsjö committed 12 years ago

Commit 57f6bcc1 parent faaf62a38 files · +21316 −21316Browse files

Showing the changes to codec/processing/src (7 of 38 files). Show all

Unified · Split

7 files
  1. codec/processing/src/arm/adaptive_quantization.S +46 −46
  2. codec/processing/src/arm/down_sample_neon.S +218 −218
  3. codec/processing/src/arm/pixel_sad_neon.S +17 −17
  4. codec/processing/src/arm/vaa_calc_neon.S +584 −584
  5. codec/processing/src/x86/denoisefilter.asm +170 −170
  6. codec/processing/src/x86/downsample_bilinear.asm +978 −978
  7. codec/processing/src/x86/vaa.asm +1518 −1518
codec/processing/src/arm/adaptive_quantization.S+46−46
@@ -36,17 +36,17 @@ · 35 unmodified lines
36 36
37#ifdef __APPLE__37#ifdef __APPLE__
38.macro SQR_ADD_16BYTES38.macro SQR_ADD_16BYTES
39 vmull.u8 q3, $0, $039 vmull.u8 q3, $0, $0
40 vmull.u8 q8, $1, $140 vmull.u8 q8, $1, $1
41 vpadal.u16 $2, q341 vpadal.u16 $2, q3
42 vpadal.u16 $2, q842 vpadal.u16 $2, q8
43.endm43.endm
44#else44#else
45.macro SQR_ADD_16BYTES arg0, arg1, arg245.macro SQR_ADD_16BYTES arg0, arg1, arg2
46 vmull.u8 q3, \arg0, \arg046 vmull.u8 q3, \arg0, \arg0
47 vmull.u8 q8, \arg1, \arg147 vmull.u8 q8, \arg1, \arg1
48 vpadal.u16 \arg2, q348 vpadal.u16 \arg2, q3
49 vpadal.u16 \arg2, q849 vpadal.u16 \arg2, q8
50.endm50.endm
51#endif51#endif
52 52
@@ -54,66 +54,66 @@ · 1 unmodified line
54WELS_ASM_FUNC_BEGIN SampleVariance16x16_neon54WELS_ASM_FUNC_BEGIN SampleVariance16x16_neon
55 stmdb sp!, {r4}55 stmdb sp!, {r4}
56 56
57 vld1.8 {q15}, [r0], r1 //save the ref data (16bytes)57 vld1.8 {q15}, [r0], r1 //save the ref data (16bytes)
58 vld1.8 {q14}, [r2], r3 //save the src data (16bytes)58 vld1.8 {q14}, [r2], r3 //save the src data (16bytes)
59 59
60 60
61 vabd.u8 q13, q14, q1561 vabd.u8 q13, q14, q15
62 vmull.u8 q12, d27, d2762 vmull.u8 q12, d27, d27
63 vmull.u8 q11, d26, d2663 vmull.u8 q11, d26, d26
64 vaddl.u16 q12, d24, d2564 vaddl.u16 q12, d24, d25
65 vpadal.u16 q12, q11 //sqr65 vpadal.u16 q12, q11 //sqr
66 66
67 vaddl.u8 q13, d26, d27 //sum67 vaddl.u8 q13, d26, d27 //sum
68 68
69 vaddl.u8 q10, d28, d29 //sum_cur69 vaddl.u8 q10, d28, d29 //sum_cur
70 70
71 vmull.u8 q9, d29, d2971 vmull.u8 q9, d29, d29
72 vmull.u8 q8, d28, d2872 vmull.u8 q8, d28, d28
73 vaddl.u16 q9, d18, d19 //sqr_cur73 vaddl.u16 q9, d18, d19 //sqr_cur
74 vpadal.u16 q9, q874 vpadal.u16 q9, q8
75 75
76 mov r4, #1576 mov r4, #15
77pixel_var_16x16_loop0:77pixel_var_16x16_loop0:
78 78
79 vld1.8 {q0}, [r0], r1 //save the ref data (16bytes)79 vld1.8 {q0}, [r0], r1 //save the ref data (16bytes)
80 vld1.8 {q1}, [r2], r3 //save the src data (16bytes)80 vld1.8 {q1}, [r2], r3 //save the src data (16bytes)
81 81
82 vabd.u8 q2, q0, q182 vabd.u8 q2, q0, q1
83 83
84 //q10 save sum_cur84 //q10 save sum_cur
85 vpadal.u8 q10, q185 vpadal.u8 q10, q1
86 86
87 //q12 save sqr87 //q12 save sqr
88 SQR_ADD_16BYTES d4, d5, q1288 SQR_ADD_16BYTES d4, d5, q12
89 89
90 //q13 save sum90 //q13 save sum
91 vpadal.u8 q13, q291 vpadal.u8 q13, q2
92 92
93 subs r4, #193 subs r4, #1
94 94
95 //q9 save sqr_cur95 //q9 save sqr_cur
96 SQR_ADD_16BYTES d2, d3, q996 SQR_ADD_16BYTES d2, d3, q9
97 97
98 bne pixel_var_16x16_loop098 bne pixel_var_16x16_loop0
99 99
100 vadd.u16 d0, d26, d27 //sum100 vadd.u16 d0, d26, d27 //sum
101 vadd.u16 d1, d20, d21 //sum_cur101 vadd.u16 d1, d20, d21 //sum_cur
102 vpaddl.u16 q0, q0102 vpaddl.u16 q0, q0
103 vadd.u32 d2, d24, d25 //sqr103 vadd.u32 d2, d24, d25 //sqr
104 vadd.u32 d3, d18, d19 //sqr_cur104 vadd.u32 d3, d18, d19 //sqr_cur
105 vpadd.u32 d0, d0, d1105 vpadd.u32 d0, d0, d1
106 vpadd.u32 d1, d2, d3106 vpadd.u32 d1, d2, d3
107 107
108 ldr r4, [sp, #4]108 ldr r4, [sp, #4]
109 109
110 vshr.u32 q0, q0, #8110 vshr.u32 q0, q0, #8
111 vmul.u32 d0, d0111 vmul.u32 d0, d0
112 vsub.u32 d0, d1, d0112 vsub.u32 d0, d1, d0
113 vmovl.u32 q0, d0113 vmovl.u32 q0, d0
114 vst2.16 {d0[0], d1[0]}, [r4]114 vst2.16 {d0[0], d1[0]}, [r4]
115 115
116 ldmia sp!, {r4}116 ldmia sp!, {r4}
117 117
118WELS_ASM_FUNC_END118WELS_ASM_FUNC_END
119 119
codec/processing/src/arm/down_sample_neon.S+218−218
@@ -30,313 +30,313 @@ · 29 unmodified lines
30 *30 *
31 */31 */
32 32
33#ifdef HAVE_NEON33#ifdef HAVE_NEON
34.text34.text
35#include "arm_arch_common_macro.S"35#include "arm_arch_common_macro.S"
36 36
37 37
38WELS_ASM_FUNC_BEGIN DyadicBilinearDownsampler_neon38WELS_ASM_FUNC_BEGIN DyadicBilinearDownsampler_neon
39 stmdb sp!, {r4-r8, lr}39 stmdb sp!, {r4-r8, lr}
40 40
41 //Get the width and height41 //Get the width and height
42 ldr r4, [sp, #24] //src_width42 ldr r4, [sp, #24] //src_width
43 ldr r5, [sp, #28] //src_height43 ldr r5, [sp, #28] //src_height
44 44
45 //Initialize the register45 //Initialize the register
46 mov r6, r246 mov r6, r2
47 mov r8, r047 mov r8, r0
48 mov lr, #048 mov lr, #0
49 lsr r5, #149 lsr r5, #1
50 50
51 //Save the tailer for the unasigned size51 //Save the tailer for the unasigned size
52 mla r7, r1, r5, r052 mla r7, r1, r5, r0
53 vld1.32 {q15}, [r7]53 vld1.32 {q15}, [r7]
54 54
55 add r7, r2, r355 add r7, r2, r3
56 //processing a colume data56 //processing a colume data
57comp_ds_bilinear_loop0:57comp_ds_bilinear_loop0:
58 58
59 vld1.8 {q0,q1}, [r2]!59 vld1.8 {q0,q1}, [r2]!
60 vld1.8 {q2,q3}, [r7]!60 vld1.8 {q2,q3}, [r7]!
61 vpaddl.u8 q0, q061 vpaddl.u8 q0, q0
62 vpaddl.u8 q1, q162 vpaddl.u8 q1, q1
63 vpaddl.u8 q2, q263 vpaddl.u8 q2, q2
64 vpaddl.u8 q3, q364 vpaddl.u8 q3, q3
65 vrshr.u16 q0, #165 vrshr.u16 q0, #1
66 vrshr.u16 q1, #166 vrshr.u16 q1, #1
67 vrshr.u16 q2, #167 vrshr.u16 q2, #1
68 vrshr.u16 q3, #168 vrshr.u16 q3, #1
69 vrhadd.u16 q0, q269 vrhadd.u16 q0, q2
70 vrhadd.u16 q1, q370 vrhadd.u16 q1, q3
71 vmovn.u16 d0, q071 vmovn.u16 d0, q0
72 vmovn.u16 d1, q172 vmovn.u16 d1, q1
73 vst1.32 {q0}, [r0]!73 vst1.32 {q0}, [r0]!
74 add lr, #3274 add lr, #32
75 75
76 cmp lr, r476 cmp lr, r4
77 movcs lr, #077 movcs lr, #0
78 addcs r6, r6, r3, lsl #178 addcs r6, r6, r3, lsl #1
79 movcs r2, r679 movcs r2, r6
80 addcs r7, r2, r380 addcs r7, r2, r3
81 addcs r8, r181 addcs r8, r1
82 movcs r0, r882 movcs r0, r8
83 subscs r5, #183 subscs r5, #1
84 bne comp_ds_bilinear_loop084 bne comp_ds_bilinear_loop0
85 85
86 //restore the tailer for the unasigned size86 //restore the tailer for the unasigned size
87 vst1.32 {q15}, [r0]87 vst1.32 {q15}, [r0]
88 88
89 ldmia sp!, {r4-r8,lr}89 ldmia sp!, {r4-r8,lr}
90WELS_ASM_FUNC_END90WELS_ASM_FUNC_END
91 91
92 92
93WELS_ASM_FUNC_BEGIN comp_ds_bilinear_w_x8_neon93WELS_ASM_FUNC_BEGIN comp_ds_bilinear_w_x8_neon
94 stmdb sp!, {r4-r7, lr}94 stmdb sp!, {r4-r7, lr}
95 95
96 //Get the width and height96 //Get the width and height
97 ldr r4, [sp, #20] //src_width97 ldr r4, [sp, #20] //src_width
98 ldr r5, [sp, #24] //src_height98 ldr r5, [sp, #24] //src_height
99 99
100 //Get the difference100 //Get the difference
101 sub lr, r3, r4101 sub lr, r3, r4
102 sub r1, r1, r4, lsr #1102 sub r1, r1, r4, lsr #1
103 103
104 lsr r5, #1104 lsr r5, #1
105 105
106 //processing a colume data106 //processing a colume data
107comp_ds_bilinear_w_x8_loop0:107comp_ds_bilinear_w_x8_loop0:
108 108
109 lsr r6, r4, #3109 lsr r6, r4, #3
110 add r7, r2, r3110 add r7, r2, r3
111 //processing a line data111 //processing a line data
112comp_ds_bilinear_w_x8_loop1:112comp_ds_bilinear_w_x8_loop1:
113 113
114 vld1.8 {d0}, [r2]!114 vld1.8 {d0}, [r2]!
115 vld1.8 {d1}, [r7]!115 vld1.8 {d1}, [r7]!
116 vpaddl.u8 q0, q0116 vpaddl.u8 q0, q0
117 vrshr.u16 q0, #1117 vrshr.u16 q0, #1
118 vrhadd.u16 d0, d1118 vrhadd.u16 d0, d1
119 119
120 vmovn.u16 d0, q0120 vmovn.u16 d0, q0
121 vst1.32 {d0[0]}, [r0]!121 vst1.32 {d0[0]}, [r0]!
122 subs r6, #1122 subs r6, #1
123 bne comp_ds_bilinear_w_x8_loop1123 bne comp_ds_bilinear_w_x8_loop1
124 124
125 add r2, r7, lr125 add r2, r7, lr
126 add r0, r1126 add r0, r1
127 subs r5, #1127 subs r5, #1
128 bne comp_ds_bilinear_w_x8_loop0128 bne comp_ds_bilinear_w_x8_loop0
129 129
130 ldmia sp!, {r4-r7,lr}130 ldmia sp!, {r4-r7,lr}
131WELS_ASM_FUNC_END131WELS_ASM_FUNC_END
132 132
133 133
134WELS_ASM_FUNC_BEGIN comp_ds_bilinear_w_x16_neon134WELS_ASM_FUNC_BEGIN comp_ds_bilinear_w_x16_neon
135 stmdb sp!, {r4-r7, lr}135 stmdb sp!, {r4-r7, lr}
136 136
137 //Get the width and height137 //Get the width and height
138 ldr r4, [sp, #20] //src_width138 ldr r4, [sp, #20] //src_width
139 ldr r5, [sp, #24] //src_height139 ldr r5, [sp, #24] //src_height
140 140
141 //Get the difference141 //Get the difference
142 sub lr, r3, r4142 sub lr, r3, r4
143 sub r1, r1, r4, lsr #1143 sub r1, r1, r4, lsr #1
144 144
145 lsr r5, #1145 lsr r5, #1
146 146
147 //processing a colume data147 //processing a colume data
148comp_ds_bilinear_w_x16_loop0:148comp_ds_bilinear_w_x16_loop0:
149 149
150 lsr r6, r4, #4150 lsr r6, r4, #4
151 add r7, r2, r3151 add r7, r2, r3
152 //processing a line data152 //processing a line data
153comp_ds_bilinear_w_x16_loop1:153comp_ds_bilinear_w_x16_loop1:
154 154
155 vld1.8 {q0}, [r2]!155 vld1.8 {q0}, [r2]!
156 vld1.8 {q1}, [r7]!156 vld1.8 {q1}, [r7]!
157 vpaddl.u8 q0, q0157 vpaddl.u8 q0, q0
158 vpaddl.u8 q1, q1158 vpaddl.u8 q1, q1
159 vrshr.u16 q0, #1159 vrshr.u16 q0, #1
160 vrshr.u16 q1, #1160 vrshr.u16 q1, #1
161 vrhadd.u16 q0, q1161 vrhadd.u16 q0, q1
162 162
163 vmovn.u16 d0, q0163 vmovn.u16 d0, q0
164 vst1.32 {d0}, [r0]!164 vst1.32 {d0}, [r0]!
165 subs r6, #1165 subs r6, #1
166 bne comp_ds_bilinear_w_x16_loop1166 bne comp_ds_bilinear_w_x16_loop1
167 167
168 add r2, r7, lr168 add r2, r7, lr
169 add r0, r1169 add r0, r1
170 subs r5, #1170 subs r5, #1
171 bne comp_ds_bilinear_w_x16_loop0171 bne comp_ds_bilinear_w_x16_loop0
172 172
173 ldmia sp!, {r4-r7,lr}173 ldmia sp!, {r4-r7,lr}
174WELS_ASM_FUNC_END174WELS_ASM_FUNC_END
175 175
176 176
177WELS_ASM_FUNC_BEGIN DyadicBilinearDownsamplerWidthx32_neon177WELS_ASM_FUNC_BEGIN DyadicBilinearDownsamplerWidthx32_neon
178 stmdb sp!, {r4-r7, lr}178 stmdb sp!, {r4-r7, lr}
179 179
180 //Get the width and height180 //Get the width and height
181 ldr r4, [sp, #20] //src_width181 ldr r4, [sp, #20] //src_width
182 ldr r5, [sp, #24] //src_height182 ldr r5, [sp, #24] //src_height
183 183
184 //Get the difference184 //Get the difference
185 sub lr, r3, r4185 sub lr, r3, r4
186 sub r1, r1, r4, lsr #1186 sub r1, r1, r4, lsr #1
187 187
188 lsr r5, #1188 lsr r5, #1
189 189
190 //processing a colume data190 //processing a colume data
191comp_ds_bilinear_w_x32_loop0:191comp_ds_bilinear_w_x32_loop0:
192 192
193 lsr r6, r4, #5193 lsr r6, r4, #5
194 add r7, r2, r3194 add r7, r2, r3
195 //processing a line data195 //processing a line data
196comp_ds_bilinear_w_x32_loop1:196comp_ds_bilinear_w_x32_loop1:
197 197
198 vld1.8 {q0,q1}, [r2]!198 vld1.8 {q0,q1}, [r2]!
199 vld1.8 {q2,q3}, [r7]!199 vld1.8 {q2,q3}, [r7]!
200 vpaddl.u8 q0, q0200 vpaddl.u8 q0, q0
201 vpaddl.u8 q1, q1201 vpaddl.u8 q1, q1
202 vpaddl.u8 q2, q2202 vpaddl.u8 q2, q2
203 vpaddl.u8 q3, q3203 vpaddl.u8 q3, q3
204 vrshr.u16 q0, #1204 vrshr.u16 q0, #1
205 vrshr.u16 q1, #1205 vrshr.u16 q1, #1
206 vrshr.u16 q2, #1206 vrshr.u16 q2, #1
207 vrshr.u16 q3, #1207 vrshr.u16 q3, #1
208 vrhadd.u16 q0, q2208 vrhadd.u16 q0, q2
209 vrhadd.u16 q1, q3209 vrhadd.u16 q1, q3
210 210
211 vmovn.u16 d0, q0211 vmovn.u16 d0, q0
212 vmovn.u16 d1, q1212 vmovn.u16 d1, q1
213 vst1.32 {q0}, [r0]!213 vst1.32 {q0}, [r0]!
214 subs r6, #1214 subs r6, #1
215 bne comp_ds_bilinear_w_x32_loop1215 bne comp_ds_bilinear_w_x32_loop1
216 216
217 add r2, r7, lr217 add r2, r7, lr
218 add r0, r1218 add r0, r1
219 subs r5, #1219 subs r5, #1
220 bne comp_ds_bilinear_w_x32_loop0220 bne comp_ds_bilinear_w_x32_loop0
221 221
222 ldmia sp!, {r4-r7,lr}222 ldmia sp!, {r4-r7,lr}
223WELS_ASM_FUNC_END223WELS_ASM_FUNC_END
224 224
225 225
226WELS_ASM_FUNC_BEGIN GeneralBilinearAccurateDownsampler_neon226WELS_ASM_FUNC_BEGIN GeneralBilinearAccurateDownsampler_neon
227 stmdb sp!, {r4-r12, lr}227 stmdb sp!, {r4-r12, lr}
228 228
229 //Get the data from stack229 //Get the data from stack
230 ldr r4, [sp, #40] //the addr of src230 ldr r4, [sp, #40] //the addr of src
231 ldr r5, [sp, #44] //the value of src_stride231 ldr r5, [sp, #44] //the value of src_stride
232 ldr r6, [sp, #48] //the value of scaleX232 ldr r6, [sp, #48] //the value of scaleX
233 ldr r7, [sp, #52] //the value of scaleY233 ldr r7, [sp, #52] //the value of scaleY
234 234
235 mov r10, #32768235 mov r10, #32768
236 sub r10, #1236 sub r10, #1
237 and r8, r6, r10 // r8 uinc(scaleX mod 32767)237 and r8, r6, r10 // r8 uinc(scaleX mod 32767)
238 mov r11, #-1238 mov r11, #-1
239 mul r11, r8 // r11 -uinc239 mul r11, r8 // r11 -uinc
240 240
241 vdup.s16 d2, r8241 vdup.s16 d2, r8
242 vdup.s16 d0, r11242 vdup.s16 d0, r11
243 vzip.s16 d0, d2 // uinc -uinc uinc -uinc243 vzip.s16 d0, d2 // uinc -uinc uinc -uinc
244 244
245 and r9, r7, r10 // r9 vinc(scaleY mod 32767)245 and r9, r7, r10 // r9 vinc(scaleY mod 32767)
246 mov r11, #-1246 mov r11, #-1
247 mul r11, r9 // r11 -vinc247 mul r11, r9 // r11 -vinc
248 248
249 vdup.s16 d2, r9249 vdup.s16 d2, r9
250 vdup.s16 d3, r11250 vdup.s16 d3, r11
251 vext.8 d5, d3, d2, #4 // vinc vinc -vinc -vinc251 vext.8 d5, d3, d2, #4 // vinc vinc -vinc -vinc
252 252
253 mov r11, #0x40000000253 mov r11, #0x40000000
254 mov r12, #0x4000254 mov r12, #0x4000
255 sub r12, #1255 sub r12, #1
256 add r11, r12256 add r11, r12
257 vdup.s32 d1, r11; //init u 16384 16383 16384 16383257 vdup.s32 d1, r11; //init u 16384 16383 16384 16383
258 258
259 mov r11, #16384259 mov r11, #16384
260 vdup.s16 d16, r11260 vdup.s16 d16, r11
261 sub r11, #1261 sub r11, #1
262 vdup.s16 d17, r11262 vdup.s16 d17, r11
263 vext.8 d7, d17, d16, #4 //init v 16384 16384 16383 16383263 vext.8 d7, d17, d16, #4 //init v 16384 16384 16383 16383
264 264
265 veor q14, q14265 veor q14, q14
266 sub r1, r2 // stride - width266 sub r1, r2 // stride - width
267 mov r8, #16384 // yInverse267 mov r8, #16384 // yInverse
268 sub r3, #1268 sub r3, #1
269 269
270_HEIGHT:270_HEIGHT:
271 ldr r4, [sp, #40] //the addr of src271 ldr r4, [sp, #40] //the addr of src
272 mov r11, r8272 mov r11, r8
273 lsr r11, #15273 lsr r11, #15
274 mul r11, r5274 mul r11, r5
275 add r11, r4 // get current row address275 add r11, r4 // get current row address
276 mov r12, r11276 mov r12, r11
277 add r12, r5277 add r12, r5
278 278
279 mov r9, #16384 // xInverse279 mov r9, #16384 // xInverse
280 sub r10, r2, #1280 sub r10, r2, #1
281 vmov.s16 d6, d1281 vmov.s16 d6, d1
282 282
283_WIDTH:283_WIDTH:
284 mov lr, r9284 mov lr, r9
285 lsr lr, #15285 lsr lr, #15
286 add r4, r11,lr286 add r4, r11,lr
287 vld2.8 {d28[0],d29[0]}, [r4] //q14: 0000000b0000000a;287 vld2.8 {d28[0],d29[0]}, [r4] //q14: 0000000b0000000a;
288 add r4, r12,lr288 add r4, r12,lr
289 vld2.8 {d28[4],d29[4]}, [r4] //q14: 000d000b000c000a;289 vld2.8 {d28[4],d29[4]}, [r4] //q14: 000d000b000c000a;
290 vzip.32 d28, d29 //q14: 000d000c000b000a;290 vzip.32 d28, d29 //q14: 000d000c000b000a;
291 291
292 vmull.u16 q13, d6, d7 //q13: init u * init v292 vmull.u16 q13, d6, d7 //q13: init u * init v
293 vmull.u32 q12, d26,d28293 vmull.u32 q12, d26,d28
294 vmlal.u32 q12, d27,d29294 vmlal.u32 q12, d27,d29
295 vqadd.u64 d24, d24,d25295 vqadd.u64 d24, d24,d25
296 vrshr.u64 d24, #30296 vrshr.u64 d24, #30
297 297
298 vst1.8 {d24[0]}, [r0]!298 vst1.8 {d24[0]}, [r0]!
299 add r9, r6299 add r9, r6
300 vadd.u16 d6, d0 // inc u300 vadd.u16 d6, d0 // inc u
301 vshl.u16 d6, #1301 vshl.u16 d6, #1
302 vshr.u16 d6, #1302 vshr.u16 d6, #1
303 subs r10, #1303 subs r10, #1
304 bne _WIDTH304 bne _WIDTH
305 305
306WIDTH_END:306WIDTH_END:
307 lsr r9, #15307 lsr r9, #15
308 add r4,r11,r9308 add r4,r11,r9
309 vld1.8 {d24[0]}, [r4]309 vld1.8 {d24[0]}, [r4]
310 vst1.8 {d24[0]}, [r0]310 vst1.8 {d24[0]}, [r0]
311 add r0, #1311 add r0, #1
312 add r8, r7312 add r8, r7
313 add r0, r1313 add r0, r1
314 vadd.s16 d7, d5 // inc v314 vadd.s16 d7, d5 // inc v
315 vshl.u16 d7, #1315 vshl.u16 d7, #1
316 vshr.u16 d7, #1316 vshr.u16 d7, #1
317 subs r3, #1317 subs r3, #1
318 bne _HEIGHT318 bne _HEIGHT
319 319
320LAST_ROW:320LAST_ROW:
321 ldr r4, [sp, #40] //the addr of src321 ldr r4, [sp, #40] //the addr of src
322 lsr r8, #15322 lsr r8, #15
323 mul r8, r5323 mul r8, r5
324 add r4, r8 // get current row address324 add r4, r8 // get current row address
325 mov r9, #16384325 mov r9, #16384
326 326
327_LAST_ROW_WIDTH:327_LAST_ROW_WIDTH:
328 mov r11, r9328 mov r11, r9
329 lsr r11, #15329 lsr r11, #15
330 330
331 add r3, r4,r11331 add r3, r4,r11
332 vld1.8 {d0[0]}, [r3]332 vld1.8 {d0[0]}, [r3]
333 vst1.8 {d0[0]}, [r0]333 vst1.8 {d0[0]}, [r0]
334 add r0, #1334 add r0, #1
335 add r9, r6335 add r9, r6
336 subs r2, #1336 subs r2, #1
337 bne _LAST_ROW_WIDTH337 bne _LAST_ROW_WIDTH
338 338
339 ldmia sp!, {r4-r12, lr}339 ldmia sp!, {r4-r12, lr}
340WELS_ASM_FUNC_END340WELS_ASM_FUNC_END
341 341
342#endif342#endif
codec/processing/src/arm/pixel_sad_neon.S+17−17
@@ -37,32 +37,32 @@ · 36 unmodified lines
37 37
38WELS_ASM_FUNC_BEGIN WelsProcessingSampleSad8x8_neon38WELS_ASM_FUNC_BEGIN WelsProcessingSampleSad8x8_neon
39 stmdb sp!, {lr}39 stmdb sp!, {lr}
40 //Loading a horizontal line data (8 bytes)40 //Loading a horizontal line data (8 bytes)
41 vld1.8 {d0}, [r0], r141 vld1.8 {d0}, [r0], r1
42 vld1.8 {d1}, [r2], r342 vld1.8 {d1}, [r2], r3
43 43
44 //Do the SAD for 8 bytes44 //Do the SAD for 8 bytes
45 vabdl.u8 q1, d0, d145 vabdl.u8 q1, d0, d1
46 46
47 mov lr, #747 mov lr, #7
48pixel_sad_8x8_loop0:48pixel_sad_8x8_loop0:
49 49
50 //Loading a horizontal line data (8 bytes)50 //Loading a horizontal line data (8 bytes)
51 vld1.8 {d0}, [r0], r151 vld1.8 {d0}, [r0], r1
52 vld1.8 {d1}, [r2], r352 vld1.8 {d1}, [r2], r3
53 53
54 subs lr, #154 subs lr, #1
55 55
56 //Do the SAD for 8 bytes56 //Do the SAD for 8 bytes
57 vabal.u8 q1, d0, d157 vabal.u8 q1, d0, d1
58 bne pixel_sad_8x8_loop058 bne pixel_sad_8x8_loop0
59 59
60 vadd.u16 d2, d360 vadd.u16 d2, d3
61 vpaddl.u16 d2, d261 vpaddl.u16 d2, d2
62 vpaddl.u32 d2, d262 vpaddl.u32 d2, d2
63 vmov.u32 r0, d2[0]//TBO...63 vmov.u32 r0, d2[0]//TBO...
64 64
65 ldmia sp!, {lr}65 ldmia sp!, {lr}
66WELS_ASM_FUNC_END66WELS_ASM_FUNC_END
67 67
68#endif68#endif
codec/processing/src/arm/vaa_calc_neon.S+584−584
@@ -37,61 +37,61 @@ · 36 unmodified lines
37#ifdef __APPLE__37#ifdef __APPLE__
38 38
39.macro ABS_SUB_SUM_16BYTES39.macro ABS_SUB_SUM_16BYTES
40 vld1.32 {q15}, [$0], $240 vld1.32 {q15}, [$0], $2
41 vld1.32 {q14}, [$1], $241 vld1.32 {q14}, [$1], $2
42 vabal.u8 $3, d30, d2842 vabal.u8 $3, d30, d28
43 vabal.u8 $4, d31, d2943 vabal.u8 $4, d31, d29
44.endm44.endm
45 45
46.macro ABS_SUB_SUM_8x16BYTES46.macro ABS_SUB_SUM_8x16BYTES
47 vld1.32 {q15}, [$0], $247 vld1.32 {q15}, [$0], $2
48 vld1.32 {q14}, [$1], $248 vld1.32 {q14}, [$1], $2
49 vabdl.u8 $3, d30, d2849 vabdl.u8 $3, d30, d28
50 vabdl.u8 $4, d31, d2950 vabdl.u8 $4, d31, d29
51 51
52 ABS_SUB_SUM_16BYTES $0, $1, $2, $3, $452 ABS_SUB_SUM_16BYTES $0, $1, $2, $3, $4
53 ABS_SUB_SUM_16BYTES $0, $1, $2, $3, $453 ABS_SUB_SUM_16BYTES $0, $1, $2, $3, $4
54 ABS_SUB_SUM_16BYTES $0, $1, $2, $3, $454 ABS_SUB_SUM_16BYTES $0, $1, $2, $3, $4
55 ABS_SUB_SUM_16BYTES $0, $1, $2, $3, $455 ABS_SUB_SUM_16BYTES $0, $1, $2, $3, $4
56 ABS_SUB_SUM_16BYTES $0, $1, $2, $3, $456 ABS_SUB_SUM_16BYTES $0, $1, $2, $3, $4
57 ABS_SUB_SUM_16BYTES $0, $1, $2, $3, $457 ABS_SUB_SUM_16BYTES $0, $1, $2, $3, $4
58 ABS_SUB_SUM_16BYTES $0, $1, $2, $3, $458 ABS_SUB_SUM_16BYTES $0, $1, $2, $3, $4
59.endm59.endm
60 60
61.macro SAD_8X16BITS61.macro SAD_8X16BITS
62 vadd.u16 d31, $0, $162 vadd.u16 d31, $0, $1
63 vpaddl.u16 d31, d3163 vpaddl.u16 d31, d31
64 vpaddl.u32 $2, d3164 vpaddl.u32 $2, d31
65.endm65.endm
66 66
67#else67#else
68 68
69.macro ABS_SUB_SUM_16BYTES arg0, arg1, arg2, arg3, arg469.macro ABS_SUB_SUM_16BYTES arg0, arg1, arg2, arg3, arg4
70 vld1.32 {q15}, [\arg0], \arg270 vld1.32 {q15}, [\arg0], \arg2
71 vld1.32 {q14}, [\arg1], \arg271 vld1.32 {q14}, [\arg1], \arg2
72 vabal.u8 \arg3, d30, d2872 vabal.u8 \arg3, d30, d28
73 vabal.u8 \arg4, d31, d2973 vabal.u8 \arg4, d31, d29
74.endm74.endm
75 75
76.macro ABS_SUB_SUM_8x16BYTES arg0, arg1, arg2, arg3, arg476.macro ABS_SUB_SUM_8x16BYTES arg0, arg1, arg2, arg3, arg4
77 vld1.32 {q15}, [\arg0], \arg277 vld1.32 {q15}, [\arg0], \arg2
78 vld1.32 {q14}, [\arg1], \arg278 vld1.32 {q14}, [\arg1], \arg2
79 vabdl.u8 \arg3, d30, d2879 vabdl.u8 \arg3, d30, d28
80 vabdl.u8 \arg4, d31, d2980 vabdl.u8 \arg4, d31, d29
81 81
82 ABS_SUB_SUM_16BYTES \arg0, \arg1, \arg2, \arg3, \arg482 ABS_SUB_SUM_16BYTES \arg0, \arg1, \arg2, \arg3, \arg4
83 ABS_SUB_SUM_16BYTES \arg0, \arg1, \arg2, \arg3, \arg483 ABS_SUB_SUM_16BYTES \arg0, \arg1, \arg2, \arg3, \arg4
84 ABS_SUB_SUM_16BYTES \arg0, \arg1, \arg2, \arg3, \arg484 ABS_SUB_SUM_16BYTES \arg0, \arg1, \arg2, \arg3, \arg4
85 ABS_SUB_SUM_16BYTES \arg0, \arg1, \arg2, \arg3, \arg485 ABS_SUB_SUM_16BYTES \arg0, \arg1, \arg2, \arg3, \arg4
86 ABS_SUB_SUM_16BYTES \arg0, \arg1, \arg2, \arg3, \arg486 ABS_SUB_SUM_16BYTES \arg0, \arg1, \arg2, \arg3, \arg4
87 ABS_SUB_SUM_16BYTES \arg0, \arg1, \arg2, \arg3, \arg487 ABS_SUB_SUM_16BYTES \arg0, \arg1, \arg2, \arg3, \arg4
88 ABS_SUB_SUM_16BYTES \arg0, \arg1, \arg2, \arg3, \arg488 ABS_SUB_SUM_16BYTES \arg0, \arg1, \arg2, \arg3, \arg4
89.endm89.endm
90 90
91.macro SAD_8X16BITS arg0, arg1, arg291.macro SAD_8X16BITS arg0, arg1, arg2
92 vadd.u16 d31, \arg0, \arg192 vadd.u16 d31, \arg0, \arg1
93 vpaddl.u16 d31, d3193 vpaddl.u16 d31, d31
94 vpaddl.u32 \arg2, d3194 vpaddl.u32 \arg2, d31
95.endm95.endm
96#endif96#endif
97 97
@@ -100,16 +100,16 @@ WELS_ASM_FUNC_BEGIN VAACalcSad_neon · 2 unmodified lines
100 100
101 stmdb sp!, {r4-r8}101 stmdb sp!, {r4-r8}
102 102
103 ldr r4, [sp, #20] //load pic_stride103 ldr r4, [sp, #20] //load pic_stride
104 ldr r5, [sp, #28] //load psad8x8104 ldr r5, [sp, #28] //load psad8x8
105 105
106 //Initial the Q8 register for save the "psadframe"106 //Initial the Q8 register for save the "psadframe"
107 vmov.s64 q8, #0107 vmov.s64 q8, #0
108 108
109 //Get the jump distance to use on loop codes109 //Get the jump distance to use on loop codes
110 lsl r8, r4, #4110 lsl r8, r4, #4
111 sub r7, r8, #16 //R7 keep the 16*pic_stride-16111 sub r7, r8, #16 //R7 keep the 16*pic_stride-16
112 sub r8, r2 //R8 keep the 16*pic_stride-pic_width112 sub r8, r2 //R8 keep the 16*pic_stride-pic_width
113 113
114vaa_calc_sad_loop0:114vaa_calc_sad_loop0:
115 115
@@ -118,70 +118,70 @@ vaa_calc_sad_loop0: · 2 unmodified lines
118 118
119vaa_calc_sad_loop1:119vaa_calc_sad_loop1:
120 120
121 //Process the 16x16 bytes121 //Process the 16x16 bytes
122 ABS_SUB_SUM_8x16BYTES r0, r1, r4, q0, q1122 ABS_SUB_SUM_8x16BYTES r0, r1, r4, q0, q1
123 ABS_SUB_SUM_8x16BYTES r0, r1, r4, q2, q3123 ABS_SUB_SUM_8x16BYTES r0, r1, r4, q2, q3
124 124
125 //Do the SAD125 //Do the SAD
126 SAD_8X16BITS d0, d1, d0126 SAD_8X16BITS d0, d1, d0
127 SAD_8X16BITS d2, d3, d1127 SAD_8X16BITS d2, d3, d1
128 SAD_8X16BITS d4, d5, d2128 SAD_8X16BITS d4, d5, d2
129 SAD_8X16BITS d6, d7, d3129 SAD_8X16BITS d6, d7, d3
130 130
131 //Write to "psad8x8" buffer131 //Write to "psad8x8" buffer
132 vst4.32 {d0[0],d1[0],d2[0],d3[0]}, [r5]!132 vst4.32 {d0[0],d1[0],d2[0],d3[0]}, [r5]!
133 133
134 134
135 //Adjust the input address135 //Adjust the input address
136 sub r0, r7136 sub r0, r7
137 sub r1, r7137 sub r1, r7
138 138
139 subs r6, #16139 subs r6, #16
140 140
141 //Save to calculate "psadframe"141 //Save to calculate "psadframe"
142 vadd.u32 q0, q1142 vadd.u32 q0, q1
143 vadd.u32 q8, q0143 vadd.u32 q8, q0
144 144
145 bne vaa_calc_sad_loop1145 bne vaa_calc_sad_loop1
146 146
147 //Adjust the input address147 //Adjust the input address
148 add r0, r8148 add r0, r8
149 add r1, r8149 add r1, r8
150 150
151 subs r3, #16151 subs r3, #16
152 bne vaa_calc_sad_loop0152 bne vaa_calc_sad_loop0
153 153
154 ldr r6, [sp, #24] //load psadframe154 ldr r6, [sp, #24] //load psadframe
155 vadd.u32 d16, d17155 vadd.u32 d16, d17
156 vst1.32 {d16[0]}, [r6]156 vst1.32 {d16[0]}, [r6]
157 157
158 ldmia sp!, {r4-r8}158 ldmia sp!, {r4-r8}
159 159
160WELS_ASM_FUNC_END160WELS_ASM_FUNC_END
161 161
162 162
163#ifdef __APPLE__163#ifdef __APPLE__
164.macro SAD_SD_MAD_16BYTES164.macro SAD_SD_MAD_16BYTES
165 vld1.32 {q0}, [$0], $2165 vld1.32 {q0}, [$0], $2
166 vld1.32 {q1}, [$1], $2166 vld1.32 {q1}, [$1], $2
167 167
168 vpadal.u8 $3, q0168 vpadal.u8 $3, q0
169 vpadal.u8 $4, q1169 vpadal.u8 $4, q1
170 170
171 vabd.u8 q0, q0, q1171 vabd.u8 q0, q0, q1
172 vmax.u8 $5, q0172 vmax.u8 $5, q0
173 vpadal.u8 $6, q0173 vpadal.u8 $6, q0
174.endm174.endm
175 175
176.macro SAD_SD_MAD_8x16BYTES176.macro SAD_SD_MAD_8x16BYTES
177 vld1.32 {q0}, [$0], $2177 vld1.32 {q0}, [$0], $2
178 vld1.32 {q1}, [$1], $2178 vld1.32 {q1}, [$1], $2
179 179
180 vpaddl.u8 q2, q0180 vpaddl.u8 q2, q0
181 vpaddl.u8 q3, q1181 vpaddl.u8 q3, q1
182 182
183 vabd.u8 $3, q0, q1183 vabd.u8 $3, q0, q1
184 vpaddl.u8 $4, $3 //abs_diff184 vpaddl.u8 $4, $3 //abs_diff
185 185
186 186
187 SAD_SD_MAD_16BYTES $0,$1,$2,q2,q3,$3,$4187 SAD_SD_MAD_16BYTES $0,$1,$2,q2,q3,$3,$4
@@ -192,41 +192,41 @@ WELS_ASM_FUNC_END · 4 unmodified lines
192 SAD_SD_MAD_16BYTES $0,$1,$2,q2,q3,$3,$4192 SAD_SD_MAD_16BYTES $0,$1,$2,q2,q3,$3,$4
193 SAD_SD_MAD_16BYTES $0,$1,$2,q2,q3,$3,$4193 SAD_SD_MAD_16BYTES $0,$1,$2,q2,q3,$3,$4
194 194
195 vsub.u16 $5, q2, q3195 vsub.u16 $5, q2, q3
196.endm196.endm
197 197
198.macro SAD_SD_MAD_CALC198.macro SAD_SD_MAD_CALC
199 vpmax.u8 d0, $0, $1 //8bytes199 vpmax.u8 d0, $0, $1 //8bytes
200 vpmax.u8 d0, d0, d0 //4bytes200 vpmax.u8 d0, d0, d0 //4bytes
201 vpmax.u8 $2, d0, d0 //2bytes201 vpmax.u8 $2, d0, d0 //2bytes
202 202
203 vpaddl.u16 $3, $3203 vpaddl.u16 $3, $3
204 vpaddl.u32 $3, $3204 vpaddl.u32 $3, $3
205 vpaddl.s16 $4, $4205 vpaddl.s16 $4, $4
206 vpaddl.s32 $4, $4206 vpaddl.s32 $4, $4
207.endm207.endm
208#else208#else
209.macro SAD_SD_MAD_16BYTES arg0, arg1, arg2, arg3, arg4, arg5, arg6209.macro SAD_SD_MAD_16BYTES arg0, arg1, arg2, arg3, arg4, arg5, arg6
210 vld1.32 {q0}, [\arg0], \arg2210 vld1.32 {q0}, [\arg0], \arg2
211 vld1.32 {q1}, [\arg1], \arg2211 vld1.32 {q1}, [\arg1], \arg2
212 212
213 vpadal.u8 \arg3, q0213 vpadal.u8 \arg3, q0
214 vpadal.u8 \arg4, q1214 vpadal.u8 \arg4, q1
215 215
216 vabd.u8 q0, q0, q1216 vabd.u8 q0, q0, q1
217 vmax.u8 \arg5, q0217 vmax.u8 \arg5, q0
218 vpadal.u8 \arg6, q0218 vpadal.u8 \arg6, q0
219.endm219.endm
220 220
221.macro SAD_SD_MAD_8x16BYTES arg0, arg1, arg2, arg3, arg4, arg5221.macro SAD_SD_MAD_8x16BYTES arg0, arg1, arg2, arg3, arg4, arg5
222 vld1.32 {q0}, [\arg0], \arg2222 vld1.32 {q0}, [\arg0], \arg2
223 vld1.32 {q1}, [\arg1], \arg2223 vld1.32 {q1}, [\arg1], \arg2
224 224
225 vpaddl.u8 q2, q0225 vpaddl.u8 q2, q0
226 vpaddl.u8 q3, q1226 vpaddl.u8 q3, q1
227 227
228 vabd.u8 \arg3, q0, q1228 vabd.u8 \arg3, q0, q1
229 vpaddl.u8 \arg4, \arg3 //abs_diff229 vpaddl.u8 \arg4, \arg3 //abs_diff
230 230
231 231
232 SAD_SD_MAD_16BYTES \arg0,\arg1,\arg2,q2,q3,\arg3,\arg4232 SAD_SD_MAD_16BYTES \arg0,\arg1,\arg2,q2,q3,\arg3,\arg4
@@ -237,18 +237,18 @@ WELS_ASM_FUNC_END · 4 unmodified lines
237 SAD_SD_MAD_16BYTES \arg0,\arg1,\arg2,q2,q3,\arg3,\arg4237 SAD_SD_MAD_16BYTES \arg0,\arg1,\arg2,q2,q3,\arg3,\arg4
238 SAD_SD_MAD_16BYTES \arg0,\arg1,\arg2,q2,q3,\arg3,\arg4238 SAD_SD_MAD_16BYTES \arg0,\arg1,\arg2,q2,q3,\arg3,\arg4
239 239
240 vsub.u16 \arg5, q2, q3240 vsub.u16 \arg5, q2, q3
241.endm241.endm
242 242
243.macro SAD_SD_MAD_CALC arg0, arg1, arg2, arg3, arg4243.macro SAD_SD_MAD_CALC arg0, arg1, arg2, arg3, arg4
244 vpmax.u8 d0, \arg0, \arg1 //8bytes244 vpmax.u8 d0, \arg0, \arg1 //8bytes
245 vpmax.u8 d0, d0, d0 //4bytes245 vpmax.u8 d0, d0, d0 //4bytes
246 vpmax.u8 \arg2, d0, d0 //2bytes246 vpmax.u8 \arg2, d0, d0 //2bytes
247 247
248 vpaddl.u16 \arg3, \arg3248 vpaddl.u16 \arg3, \arg3
249 vpaddl.u32 \arg3, \arg3249 vpaddl.u32 \arg3, \arg3
250 vpaddl.s16 \arg4, \arg4250 vpaddl.s16 \arg4, \arg4
251 vpaddl.s32 \arg4, \arg4251 vpaddl.s32 \arg4, \arg4
252.endm252.endm
253#endif253#endif
254 254
@@ -256,18 +256,18 @@ WELS_ASM_FUNC_BEGIN VAACalcSadBgd_neon · 1 unmodified line
256 256
257 stmdb sp!, {r4-r10}257 stmdb sp!, {r4-r10}
258 258
259 ldr r4, [sp, #28] //load pic_stride259 ldr r4, [sp, #28] //load pic_stride
260 ldr r5, [sp, #36] //load psad8x8260 ldr r5, [sp, #36] //load psad8x8
261 ldr r6, [sp, #40] //load psd8x8261 ldr r6, [sp, #40] //load psd8x8
262 ldr r7, [sp, #44] //load pmad8x8262 ldr r7, [sp, #44] //load pmad8x8
263 263
264 //Initial the Q4 register for save the "psadframe"264 //Initial the Q4 register for save the "psadframe"
265 vmov.s64 q15, #0265 vmov.s64 q15, #0
266 266
267 //Get the jump distance to use on loop codes267 //Get the jump distance to use on loop codes
268 lsl r10, r4, #4268 lsl r10, r4, #4
269 sub r9, r10, #16 //R9 keep the 16*pic_stride-16269 sub r9, r10, #16 //R9 keep the 16*pic_stride-16
270 sub r10, r2 //R10 keep the 16*pic_stride-pic_width270 sub r10, r2 //R10 keep the 16*pic_stride-pic_width
271 271
272vaa_calc_sad_bgd_loop0:272vaa_calc_sad_bgd_loop0:
273 273
@@ -276,391 +276,391 @@ vaa_calc_sad_bgd_loop0: · 2 unmodified lines
276 276
277vaa_calc_sad_bgd_loop1:277vaa_calc_sad_bgd_loop1:
278 278
279 //Process the 16x16 bytes pmad psad psd279 //Process the 16x16 bytes pmad psad psd
280 SAD_SD_MAD_8x16BYTES r0, r1, r4, q13, q11, q9280 SAD_SD_MAD_8x16BYTES r0, r1, r4, q13, q11, q9
281 SAD_SD_MAD_8x16BYTES r0, r1, r4, q14, q12, q10281 SAD_SD_MAD_8x16BYTES r0, r1, r4, q14, q12, q10
282 282
283 SAD_SD_MAD_CALC d26, d27, d16, q11, q9283 SAD_SD_MAD_CALC d26, d27, d16, q11, q9
284 SAD_SD_MAD_CALC d28, d29, d17, q12, q10284 SAD_SD_MAD_CALC d28, d29, d17, q12, q10
285 285
286 //Write to "psad8x8" buffer286 //Write to "psad8x8" buffer
287 vst4.32 {d22[0],d23[0],d24[0],d25[0]}, [r5]!287 vst4.32 {d22[0],d23[0],d24[0],d25[0]}, [r5]!
288 //Adjust the input address288 //Adjust the input address
289 sub r0, r9289 sub r0, r9
290 sub r1, r9290 sub r1, r9
291 //Write to "psd8x8" buffer291 //Write to "psd8x8" buffer
292 vst4.32 {d18[0],d19[0],d20[0],d21[0]}, [r6]!292 vst4.32 {d18[0],d19[0],d20[0],d21[0]}, [r6]!
293 subs r8, #16293 subs r8, #16
294 //Write to "pmad8x8" buffer294 //Write to "pmad8x8" buffer
295 vst2.16 {d16[0],d17[0]}, [r7]!295 vst2.16 {d16[0],d17[0]}, [r7]!
296 //Save to calculate "psadframe"296 //Save to calculate "psadframe"
297 vadd.u32 q11, q12297 vadd.u32 q11, q12
298 vadd.u32 q15, q11298 vadd.u32 q15, q11
299 299
300 bne vaa_calc_sad_bgd_loop1300 bne vaa_calc_sad_bgd_loop1
301 301
302 //Adjust the input address302 //Adjust the input address
303 add r0, r10303 add r0, r10
304 add r1, r10304 add r1, r10
305 305
306 subs r3, #16306 subs r3, #16
307 bne vaa_calc_sad_bgd_loop0307 bne vaa_calc_sad_bgd_loop0
308 308
309 ldr r8, [sp, #32] //load psadframe309 ldr r8, [sp, #32] //load psadframe
310 vadd.u32 d30, d31310 vadd.u32 d30, d31
311 vst1.32 {d30[0]}, [r8]311 vst1.32 {d30[0]}, [r8]
312 ldmia sp!, {r4-r10}312 ldmia sp!, {r4-r10}
313 313
314WELS_ASM_FUNC_END314WELS_ASM_FUNC_END
315 315
316 316
317#ifdef __APPLE__317#ifdef __APPLE__
318.macro SSD_MUL_SUM_16BYTES_RESET318.macro SSD_MUL_SUM_16BYTES_RESET
319 vmull.u8 $3, $0, $0319 vmull.u8 $3, $0, $0
320 vpaddl.u16 $2, $3320 vpaddl.u16 $2, $3
321 321
322 vmull.u8 $3, $1, $1322 vmull.u8 $3, $1, $1
323 vpadal.u16 $2, $3323 vpadal.u16 $2, $3
324.endm324.endm
325 325
326.macro SSD_MUL_SUM_16BYTES326.macro SSD_MUL_SUM_16BYTES
327 vmull.u8 $3, $0, $0327 vmull.u8 $3, $0, $0
328 vpadal.u16 $2, $3328 vpadal.u16 $2, $3
329 329
330 vmull.u8 $3, $1, $1330 vmull.u8 $3, $1, $1
331 vpadal.u16 $2, $3331 vpadal.u16 $2, $3
332.endm332.endm
333 333
334.macro SAD_SSD_BGD_16334.macro SAD_SSD_BGD_16
335 vld1.8 {q0}, [$0], $2 //load cur_row335 vld1.8 {q0}, [$0], $2 //load cur_row
336 336
337 vpadal.u8 q3, q0 //add cur_row together337 vpadal.u8 q3, q0 //add cur_row together
338 vpadal.u8 q4, q1 //add ref_row together338 vpadal.u8 q4, q1 //add ref_row together
339 339
340 vabd.u8 q2, q0, q1 //abs_diff340 vabd.u8 q2, q0, q1 //abs_diff
341 341
342 vmax.u8 q5, q2 //l_mad for 16 bytes reset for every 8x16342 vmax.u8 q5, q2 //l_mad for 16 bytes reset for every 8x16
343 343
344 vpadal.u8 $3, q2 //l_sad for 16 bytes reset for every 8x16344 vpadal.u8 $3, q2 //l_sad for 16 bytes reset for every 8x16
345 345
346 SSD_MUL_SUM_16BYTES d4,d5, q8, q11 //q8 for l_sqiff reset for every 16x16346 SSD_MUL_SUM_16BYTES d4,d5, q8, q11 //q8 for l_sqiff reset for every 16x16
347 347
348 vld1.8 {q1}, [$1], $2 //load ref_row348 vld1.8 {q1}, [$1], $2 //load ref_row
349 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16349 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16
350 350
351 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16351 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16
352.endm352.endm
353 353
354//the last row of a 16x16 block354//the last row of a 16x16 block
355.macro SAD_SSD_BGD_16_end355.macro SAD_SSD_BGD_16_end
356 vld1.8 {q0}, [$0], $1 //load cur_row356 vld1.8 {q0}, [$0], $1 //load cur_row
357 357
358 vpadal.u8 q3, q0 //add cur_row together358 vpadal.u8 q3, q0 //add cur_row together
359 vpadal.u8 q4, q1 //add ref_row together359 vpadal.u8 q4, q1 //add ref_row together
360 360
361 vabd.u8 q2, q0, q1 //abs_diff361 vabd.u8 q2, q0, q1 //abs_diff
362 362
363 vmax.u8 q5, q2 //l_mad for 16 bytes reset for every 8x16363 vmax.u8 q5, q2 //l_mad for 16 bytes reset for every 8x16
364 364
365 vpadal.u8 $2, q2 //l_sad for 16 bytes reset for every 8x16365 vpadal.u8 $2, q2 //l_sad for 16 bytes reset for every 8x16
366 366
367 SSD_MUL_SUM_16BYTES d4,d5, q8, q11 //q8 for l_sqiff reset for every 16x16367 SSD_MUL_SUM_16BYTES d4,d5, q8, q11 //q8 for l_sqiff reset for every 16x16
368 368
369 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16369 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16
370 370
371 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16371 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16
372.endm372.endm
373 373
374//for the begin of a 8x16 block, use some instructions to reset the register374//for the begin of a 8x16 block, use some instructions to reset the register
375.macro SAD_SSD_BGD_16_RESET_8x8375.macro SAD_SSD_BGD_16_RESET_8x8
376 vld1.8 {q0}, [$0], $2 //load cur_row376 vld1.8 {q0}, [$0], $2 //load cur_row
377 377
378 vpaddl.u8 q3, q0 //add cur_row together378 vpaddl.u8 q3, q0 //add cur_row together
379 vpaddl.u8 q4, q1 //add ref_row together379 vpaddl.u8 q4, q1 //add ref_row together
380 380
381 vabd.u8 q2, q0, q1 //abs_diff381 vabd.u8 q2, q0, q1 //abs_diff
382 382
383 vmov q5,q2 //calculate max and avoid reset to zero, l_mad for 16 bytes reset for every 8x16383 vmov q5,q2 //calculate max and avoid reset to zero, l_mad for 16 bytes reset for every 8x16
384 384
385 vpaddl.u8 $3, q2 //l_sad for 16 bytes reset for every 8x16385 vpaddl.u8 $3, q2 //l_sad for 16 bytes reset for every 8x16
386 386
387 387
388 SSD_MUL_SUM_16BYTES d4,d5, q8, q11 //q8 for l_sqiff reset for every 16x16388 SSD_MUL_SUM_16BYTES d4,d5, q8, q11 //q8 for l_sqiff reset for every 16x16
389 389
390 vld1.8 {q1}, [$1], $2 //load ref_row390 vld1.8 {q1}, [$1], $2 //load ref_row
391 391
392 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16392 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16
393 393
394 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16394 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16
395.endm395.endm
396 396
397//for the begin of a 16x16 block, use some instructions to reset the register397//for the begin of a 16x16 block, use some instructions to reset the register
398.macro SAD_SSD_BGD_16_RESET_16x16398.macro SAD_SSD_BGD_16_RESET_16x16
399 vld1.8 {q0}, [$0], $2 //load cur_row399 vld1.8 {q0}, [$0], $2 //load cur_row
400 vld1.8 {q1}, [$1], $2 //load ref_row400 vld1.8 {q1}, [$1], $2 //load ref_row
401 401
402 vpaddl.u8 q3, q0 //add cur_row together402 vpaddl.u8 q3, q0 //add cur_row together
403 vpaddl.u8 q4, q1 //add ref_row together403 vpaddl.u8 q4, q1 //add ref_row together
404 404
405 vabd.u8 q2, q0, q1 //abs_diff405 vabd.u8 q2, q0, q1 //abs_diff
406 406
407 vmov q5,q2 //calculate max and avoid reset to zero, l_mad for 16 bytes reset for every 8x16407 vmov q5,q2 //calculate max and avoid reset to zero, l_mad for 16 bytes reset for every 8x16
408 408
409 vpaddl.u8 $3, q2 //l_sad for 16 bytes reset for every 8x16409 vpaddl.u8 $3, q2 //l_sad for 16 bytes reset for every 8x16
410 410
411 SSD_MUL_SUM_16BYTES_RESET d4,d5,q8, q11 //q8 for l_sqiff reset for every 16x16411 SSD_MUL_SUM_16BYTES_RESET d4,d5,q8, q11 //q8 for l_sqiff reset for every 16x16
412 412
413 vld1.8 {q1}, [$1], $2 //load ref_row413 vld1.8 {q1}, [$1], $2 //load ref_row
414 414
415 vpaddl.u8 q9, q0 //q9 for l_sum reset for every 16x16415 vpaddl.u8 q9, q0 //q9 for l_sum reset for every 16x16
416 416
417 SSD_MUL_SUM_16BYTES_RESET d0,d1,q10,q11 //q10 for lsqsum reset for every 16x16417 SSD_MUL_SUM_16BYTES_RESET d0,d1,q10,q11 //q10 for lsqsum reset for every 16x16
418.endm418.endm
419 419
420//for each 8x16 block420//for each 8x16 block
421.macro SAD_SSD_BGD_CALC_8x16421.macro SAD_SSD_BGD_CALC_8x16
422 422
423 vpmax.u8 d10, d10, d11 //4 numbers423 vpmax.u8 d10, d10, d11 //4 numbers
424 vpmax.u8 d10, d10, d10 //2 numbers424 vpmax.u8 d10, d10, d10 //2 numbers
425 vpmax.u8 d10, d10, d10 //1 number1425 vpmax.u8 d10, d10, d10 //1 number1
426 426
427 vmov $0, d10 //d26 d27 keeps the l_mad427 vmov $0, d10 //d26 d27 keeps the l_mad
428 428
429 //p_sd8x8 fix me429 //p_sd8x8 fix me
430 vpaddl.u16 q3, q3430 vpaddl.u16 q3, q3
431 vpaddl.u16 q4, q4431 vpaddl.u16 q4, q4
432 432
433 vsub.i32 $1, q3, q4433 vsub.i32 $1, q3, q4
434 vpaddl.u32 $1, $1434 vpaddl.u32 $1, $1
435 435
436 //psad8x8436 //psad8x8
437 vpaddl.u16 $2, $2437 vpaddl.u16 $2, $2
438 vpaddl.u32 $2, $2438 vpaddl.u32 $2, $2
439 439
440 //psadframe440 //psadframe
441 vadd.i32 q12, $2441 vadd.i32 q12, $2
442.endm442.endm
443 443
444.macro SAD_SSD_BGD_16x16444.macro SAD_SSD_BGD_16x16
445 //for one 8x16445 //for one 8x16
446 SAD_SSD_BGD_16_RESET_16x16 $0, $1, $2, q6446 SAD_SSD_BGD_16_RESET_16x16 $0, $1, $2, q6
447 SAD_SSD_BGD_16 $0, $1, $2, q6447 SAD_SSD_BGD_16 $0, $1, $2, q6
448 SAD_SSD_BGD_16 $0, $1, $2, q6448 SAD_SSD_BGD_16 $0, $1, $2, q6
449 SAD_SSD_BGD_16 $0, $1, $2, q6449 SAD_SSD_BGD_16 $0, $1, $2, q6
450 SAD_SSD_BGD_16 $0, $1, $2, q6450 SAD_SSD_BGD_16 $0, $1, $2, q6
451 SAD_SSD_BGD_16 $0, $1, $2, q6451 SAD_SSD_BGD_16 $0, $1, $2, q6
452 SAD_SSD_BGD_16 $0, $1, $2, q6452 SAD_SSD_BGD_16 $0, $1, $2, q6
453 SAD_SSD_BGD_16 $0, $1, $2, q6453 SAD_SSD_BGD_16 $0, $1, $2, q6
454 454
455 SAD_SSD_BGD_CALC_8x16 d26, q14, q6455 SAD_SSD_BGD_CALC_8x16 d26, q14, q6
456 456
457 //for another 8x16457 //for another 8x16
458 SAD_SSD_BGD_16_RESET_8x8 $0, $1, $2, q7458 SAD_SSD_BGD_16_RESET_8x8 $0, $1, $2, q7
459 SAD_SSD_BGD_16 $0, $1, $2, q7459 SAD_SSD_BGD_16 $0, $1, $2, q7
460 SAD_SSD_BGD_16 $0, $1, $2, q7460 SAD_SSD_BGD_16 $0, $1, $2, q7
461 SAD_SSD_BGD_16 $0, $1, $2, q7461 SAD_SSD_BGD_16 $0, $1, $2, q7
462 SAD_SSD_BGD_16 $0, $1, $2, q7462 SAD_SSD_BGD_16 $0, $1, $2, q7
463 SAD_SSD_BGD_16 $0, $1, $2, q7463 SAD_SSD_BGD_16 $0, $1, $2, q7
464 SAD_SSD_BGD_16 $0, $1, $2, q7464 SAD_SSD_BGD_16 $0, $1, $2, q7
465 SAD_SSD_BGD_16_end $0, $2, q7465 SAD_SSD_BGD_16_end $0, $2, q7
466 466
467 SAD_SSD_BGD_CALC_8x16 d27, q15, q7467 SAD_SSD_BGD_CALC_8x16 d27, q15, q7
468.endm468.endm
469 469
470.macro SSD_SAD_SD_MAD_PADDL470.macro SSD_SAD_SD_MAD_PADDL
471 vpaddl.s16 $0, $0471 vpaddl.s16 $0, $0
472 vpaddl.s32 $0, $0472 vpaddl.s32 $0, $0
473 vadd.i32 $1, $1, $2473 vadd.i32 $1, $1, $2
474.endm474.endm
475#else475#else
476.macro SSD_MUL_SUM_16BYTES_RESET arg0, arg1, arg2, arg3476.macro SSD_MUL_SUM_16BYTES_RESET arg0, arg1, arg2, arg3
477 vmull.u8 \arg3, \arg0, \arg0477 vmull.u8 \arg3, \arg0, \arg0
478 vpaddl.u16 \arg2, \arg3478 vpaddl.u16 \arg2, \arg3
479 479
480 vmull.u8 \arg3, \arg1, \arg1480 vmull.u8 \arg3, \arg1, \arg1
481 vpadal.u16 \arg2, \arg3481 vpadal.u16 \arg2, \arg3
482.endm482.endm
483 483
484.macro SSD_MUL_SUM_16BYTES arg0, arg1, arg2, arg3484.macro SSD_MUL_SUM_16BYTES arg0, arg1, arg2, arg3
485 vmull.u8 \arg3, \arg0, \arg0485 vmull.u8 \arg3, \arg0, \arg0
486 vpadal.u16 \arg2, \arg3486 vpadal.u16 \arg2, \arg3
487 487
488 vmull.u8 \arg3, \arg1, \arg1488 vmull.u8 \arg3, \arg1, \arg1
489 vpadal.u16 \arg2, \arg3489 vpadal.u16 \arg2, \arg3
490.endm490.endm
491 491
492.macro SAD_SSD_BGD_16 arg0, arg1, arg2, arg3492.macro SAD_SSD_BGD_16 arg0, arg1, arg2, arg3
493 vld1.8 {q0}, [\arg0], \arg2 //load cur_row493 vld1.8 {q0}, [\arg0], \arg2 //load cur_row
494 494
495 vpadal.u8 q3, q0 //add cur_row together495 vpadal.u8 q3, q0 //add cur_row together
496 vpadal.u8 q4, q1 //add ref_row together496 vpadal.u8 q4, q1 //add ref_row together
497 497
498 vabd.u8 q2, q0, q1 //abs_diff498 vabd.u8 q2, q0, q1 //abs_diff
499 499
500 vmax.u8 q5, q2 //l_mad for 16 bytes reset for every 8x16500 vmax.u8 q5, q2 //l_mad for 16 bytes reset for every 8x16
501 501
502 vpadal.u8 \arg3, q2 //l_sad for 16 bytes reset for every 8x16502 vpadal.u8 \arg3, q2 //l_sad for 16 bytes reset for every 8x16
503 503
504 SSD_MUL_SUM_16BYTES d4,d5, q8, q11 //q8 for l_sqiff reset for every 16x16504 SSD_MUL_SUM_16BYTES d4,d5, q8, q11 //q8 for l_sqiff reset for every 16x16
505 505
506 vld1.8 {q1}, [\arg1], \arg2 //load ref_row506 vld1.8 {q1}, [\arg1], \arg2 //load ref_row
507 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16507 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16
508 508
509 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16509 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16
510.endm510.endm
511 511
512//the last row of a 16x16 block512//the last row of a 16x16 block
513.macro SAD_SSD_BGD_16_end arg0, arg1, arg2513.macro SAD_SSD_BGD_16_end arg0, arg1, arg2
514 vld1.8 {q0}, [\arg0], \arg1 //load cur_row514 vld1.8 {q0}, [\arg0], \arg1 //load cur_row
515 515
516 vpadal.u8 q3, q0 //add cur_row together516 vpadal.u8 q3, q0 //add cur_row together
517 vpadal.u8 q4, q1 //add ref_row together517 vpadal.u8 q4, q1 //add ref_row together
518 518
519 vabd.u8 q2, q0, q1 //abs_diff519 vabd.u8 q2, q0, q1 //abs_diff
520 520
521 vmax.u8 q5, q2 //l_mad for 16 bytes reset for every 8x16521 vmax.u8 q5, q2 //l_mad for 16 bytes reset for every 8x16
522 522
523 vpadal.u8 \arg2, q2 //l_sad for 16 bytes reset for every 8x16523 vpadal.u8 \arg2, q2 //l_sad for 16 bytes reset for every 8x16
524 524
525 SSD_MUL_SUM_16BYTES d4,d5, q8, q11 //q8 for l_sqiff reset for every 16x16525 SSD_MUL_SUM_16BYTES d4,d5, q8, q11 //q8 for l_sqiff reset for every 16x16
526 526
527 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16527 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16
528 528
529 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16529 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16
530.endm530.endm
531 531
532//for the begin of a 8x16 block, use some instructions to reset the register532//for the begin of a 8x16 block, use some instructions to reset the register
533.macro SAD_SSD_BGD_16_RESET_8x8 arg0, arg1, arg2, arg3533.macro SAD_SSD_BGD_16_RESET_8x8 arg0, arg1, arg2, arg3
534 vld1.8 {q0}, [\arg0], \arg2 //load cur_row534 vld1.8 {q0}, [\arg0], \arg2 //load cur_row
535 535
536 vpaddl.u8 q3, q0 //add cur_row together536 vpaddl.u8 q3, q0 //add cur_row together
537 vpaddl.u8 q4, q1 //add ref_row together537 vpaddl.u8 q4, q1 //add ref_row together
538 538
539 vabd.u8 q2, q0, q1 //abs_diff539 vabd.u8 q2, q0, q1 //abs_diff
540 540
541 vmov q5,q2 //calculate max and avoid reset to zero, l_mad for 16 bytes reset for every 8x16541 vmov q5,q2 //calculate max and avoid reset to zero, l_mad for 16 bytes reset for every 8x16
542 542
543 vpaddl.u8 \arg3, q2 //l_sad for 16 bytes reset for every 8x16543 vpaddl.u8 \arg3, q2 //l_sad for 16 bytes reset for every 8x16
544 544
545 545
546 SSD_MUL_SUM_16BYTES d4,d5, q8, q11 //q8 for l_sqiff reset for every 16x16546 SSD_MUL_SUM_16BYTES d4,d5, q8, q11 //q8 for l_sqiff reset for every 16x16
547 547
548 vld1.8 {q1}, [\arg1], \arg2 //load ref_row548 vld1.8 {q1}, [\arg1], \arg2 //load ref_row
549 549
550 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16550 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16
551 551
552 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16552 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16
553.endm553.endm
554 554
555//for the begin of a 16x16 block, use some instructions to reset the register555//for the begin of a 16x16 block, use some instructions to reset the register
556.macro SAD_SSD_BGD_16_RESET_16x16 arg0, arg1, arg2, arg3556.macro SAD_SSD_BGD_16_RESET_16x16 arg0, arg1, arg2, arg3
557 vld1.8 {q0}, [\arg0], \arg2 //load cur_row557 vld1.8 {q0}, [\arg0], \arg2 //load cur_row
558 vld1.8 {q1}, [\arg1], \arg2 //load ref_row558 vld1.8 {q1}, [\arg1], \arg2 //load ref_row
559 559
560 vpaddl.u8 q3, q0 //add cur_row together560 vpaddl.u8 q3, q0 //add cur_row together
561 vpaddl.u8 q4, q1 //add ref_row together561 vpaddl.u8 q4, q1 //add ref_row together
562 562
563 vabd.u8 q2, q0, q1 //abs_diff563 vabd.u8 q2, q0, q1 //abs_diff
564 564
565 vmov q5,q2 //calculate max and avoid reset to zero, l_mad for 16 bytes reset for every 8x16565 vmov q5,q2 //calculate max and avoid reset to zero, l_mad for 16 bytes reset for every 8x16
566 566
567 vpaddl.u8 \arg3, q2 //l_sad for 16 bytes reset for every 8x16567 vpaddl.u8 \arg3, q2 //l_sad for 16 bytes reset for every 8x16
568 568
569 SSD_MUL_SUM_16BYTES_RESET d4,d5,q8, q11 //q8 for l_sqiff reset for every 16x16569 SSD_MUL_SUM_16BYTES_RESET d4,d5,q8, q11 //q8 for l_sqiff reset for every 16x16
570 570
571 vld1.8 {q1}, [\arg1], \arg2 //load ref_row571 vld1.8 {q1}, [\arg1], \arg2 //load ref_row
572 572
573 vpaddl.u8 q9, q0 //q9 for l_sum reset for every 16x16573 vpaddl.u8 q9, q0 //q9 for l_sum reset for every 16x16
574 574
575 SSD_MUL_SUM_16BYTES_RESET d0,d1,q10,q11 //q10 for lsqsum reset for every 16x16575 SSD_MUL_SUM_16BYTES_RESET d0,d1,q10,q11 //q10 for lsqsum reset for every 16x16
576.endm576.endm
577 577
578//for each 8x16 block578//for each 8x16 block
579.macro SAD_SSD_BGD_CALC_8x16 arg0, arg1, arg2579.macro SAD_SSD_BGD_CALC_8x16 arg0, arg1, arg2
580 580
581 vpmax.u8 d10, d10, d11 //4 numbers581 vpmax.u8 d10, d10, d11 //4 numbers
582 vpmax.u8 d10, d10, d10 //2 numbers582 vpmax.u8 d10, d10, d10 //2 numbers
583 vpmax.u8 d10, d10, d10 //1 number1583 vpmax.u8 d10, d10, d10 //1 number1
584 584
585 vmov \arg0, d10 //d26 d27 keeps the l_mad585 vmov \arg0, d10 //d26 d27 keeps the l_mad
586 586
587 //p_sd8x8587 //p_sd8x8
588 vpaddl.u16 q3, q3588 vpaddl.u16 q3, q3
589 vpaddl.u16 q4, q4589 vpaddl.u16 q4, q4
590 590
591 vsub.i32 \arg1, q3, q4591 vsub.i32 \arg1, q3, q4
592 vpaddl.u32 \arg1, \arg1592 vpaddl.u32 \arg1, \arg1
593 593
594 //psad8x8594 //psad8x8
595 vpaddl.u16 \arg2, \arg2595 vpaddl.u16 \arg2, \arg2
596 vpaddl.u32 \arg2, \arg2596 vpaddl.u32 \arg2, \arg2
597 597
598 //psadframe598 //psadframe
599 vadd.i32 q12, \arg2599 vadd.i32 q12, \arg2
600.endm600.endm
601 601
602.macro SAD_SSD_BGD_16x16 arg0, arg1, arg2602.macro SAD_SSD_BGD_16x16 arg0, arg1, arg2
603 //for one 8x16603 //for one 8x16
604 SAD_SSD_BGD_16_RESET_16x16 \arg0, \arg1, \arg2, q6604 SAD_SSD_BGD_16_RESET_16x16 \arg0, \arg1, \arg2, q6
605 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q6605 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q6
606 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q6606 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q6
607 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q6607 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q6
608 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q6608 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q6
609 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q6609 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q6
610 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q6610 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q6
611 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q6611 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q6
612 612
613 SAD_SSD_BGD_CALC_8x16 d26, q14, q6613 SAD_SSD_BGD_CALC_8x16 d26, q14, q6
614 614
615 //for another 8x16615 //for another 8x16
616 SAD_SSD_BGD_16_RESET_8x8 \arg0, \arg1, \arg2, q7616 SAD_SSD_BGD_16_RESET_8x8 \arg0, \arg1, \arg2, q7
617 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q7617 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q7
618 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q7618 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q7
619 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q7619 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q7
620 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q7620 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q7
621 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q7621 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q7
622 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q7622 SAD_SSD_BGD_16 \arg0, \arg1, \arg2, q7
623 SAD_SSD_BGD_16_end \arg0, \arg2, q7623 SAD_SSD_BGD_16_end \arg0, \arg2, q7
624 624
625 SAD_SSD_BGD_CALC_8x16 d27, q15, q7625 SAD_SSD_BGD_CALC_8x16 d27, q15, q7
626.endm626.endm
627 627
628.macro SSD_SAD_SD_MAD_PADDL arg0, arg1, arg2628.macro SSD_SAD_SD_MAD_PADDL arg0, arg1, arg2
629 vpaddl.s16 \arg0, \arg0629 vpaddl.s16 \arg0, \arg0
630 vpaddl.s32 \arg0, \arg0630 vpaddl.s32 \arg0, \arg0
631 vadd.i32 \arg1, \arg1, \arg2631 vadd.i32 \arg1, \arg1, \arg2
632.endm632.endm
633#endif633#endif
634 634
635 635
636WELS_ASM_FUNC_BEGIN VAACalcSadSsdBgd_neon636WELS_ASM_FUNC_BEGIN VAACalcSadSsdBgd_neon
637 stmdb sp!, {r0-r12, r14}637 stmdb sp!, {r0-r12, r14}
638 vpush {q4-q7}638 vpush {q4-q7}
639 639
640 ldr r4, [sp, #120] //r4 keeps the pic_stride640 ldr r4, [sp, #120] //r4 keeps the pic_stride
641 641
642 sub r5, r4, #1642 sub r5, r4, #1
643 lsl r5, r5, #4 //r5 keeps the little step643 lsl r5, r5, #4 //r5 keeps the little step
644 644
645 lsl r6, r4, #4645 lsl r6, r4, #4
646 sub r6, r2, r6 //r6 keeps the big step646 sub r6, r2, r6 //r6 keeps the big step
647 647
648 648
649 ldr r8, [sp, #128]//psad8x8649 ldr r8, [sp, #128]//psad8x8
650 ldr r9, [sp, #132]//psum16x16650 ldr r9, [sp, #132]//psum16x16
651 ldr r10, [sp, #136]//psqsum16x16651 ldr r10, [sp, #136]//psqsum16x16
652 ldr r11, [sp, #140]//psqdiff16x16652 ldr r11, [sp, #140]//psqdiff16x16
653 ldr r12, [sp, #144]//p_sd8x8653 ldr r12, [sp, #144]//p_sd8x8
654 ldr r14, [sp, #148]//p_mad8x8654 ldr r14, [sp, #148]//p_mad8x8
655 655
656 vmov.i8 q12, #0656 vmov.i8 q12, #0
657 657
658vaa_calc_sad_ssd_bgd_height_loop:658vaa_calc_sad_ssd_bgd_height_loop:
659 659
660 mov r7, r2660 mov r7, r2
661vaa_calc_sad_ssd_bgd_width_loop:661vaa_calc_sad_ssd_bgd_width_loop:
662 662
663 //l_sd q14&q15, l_mad q13, l_sad q6 & q7, l_sqdiff q8, l_sum q9, l_sqsum q10663 //l_sd q14&q15, l_mad q13, l_sad q6 & q7, l_sqdiff q8, l_sum q9, l_sqsum q10
664 SAD_SSD_BGD_16x16 r0,r1,r4664 SAD_SSD_BGD_16x16 r0,r1,r4
665 665
666 //psad8x8666 //psad8x8
@@ -694,243 +694,243 @@ vaa_calc_sad_ssd_bgd_width_loop: · 27 unmodified lines
694 694
695 bne vaa_calc_sad_ssd_bgd_width_loop695 bne vaa_calc_sad_ssd_bgd_width_loop
696 696
697 sub r0, r0, r6 //jump to next 16 x width697 sub r0, r0, r6 //jump to next 16 x width
698 sub r1, r1, r6 //jump to next 16 x width698 sub r1, r1, r6 //jump to next 16 x width
699 699
700 subs r3, #16700 subs r3, #16
701bne vaa_calc_sad_ssd_bgd_height_loop701bne vaa_calc_sad_ssd_bgd_height_loop
702 702
703 //psadframe703 //psadframe
704 ldr r7, [sp, #124]//psadframe704 ldr r7, [sp, #124]//psadframe
705 705
706 vadd.i32 d24, d24, d25706 vadd.i32 d24, d24, d25
707 vst1.32 {d24[0]}, [r7]707 vst1.32 {d24[0]}, [r7]
708 708
709 vpop {q4-q7}709 vpop {q4-q7}
710 ldmia sp!, {r0-r12, r14}710 ldmia sp!, {r0-r12, r14}
711 711
712WELS_ASM_FUNC_END712WELS_ASM_FUNC_END
713 713
714 714
715#ifdef __APPLE__715#ifdef __APPLE__
716.macro SAD_VAR_16716.macro SAD_VAR_16
717 vld1.8 {q0}, [$0], $2 //load cur_row717 vld1.8 {q0}, [$0], $2 //load cur_row
718 718
719 vpadal.u8 q3, q0 //add cur_row together719 vpadal.u8 q3, q0 //add cur_row together
720 vpadal.u8 q4, q1 //add ref_row together720 vpadal.u8 q4, q1 //add ref_row together
721 721
722 vabd.u8 q2, q0, q1 //abs_diff722 vabd.u8 q2, q0, q1 //abs_diff
723 723
724 vpadal.u8 $3, q2 //l_sad for 16 bytes reset for every 8x16724 vpadal.u8 $3, q2 //l_sad for 16 bytes reset for every 8x16
725 725
726 vld1.8 {q1}, [$1], $2726 vld1.8 {q1}, [$1], $2
727 727
728 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16728 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16
729 729
730 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16730 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16
731.endm731.endm
732 732
733.macro SAD_VAR_16_END733.macro SAD_VAR_16_END
734 vld1.8 {q0}, [$0], $1 //load cur_row734 vld1.8 {q0}, [$0], $1 //load cur_row
735 735
736 vpadal.u8 q3, q0 //add cur_row together736 vpadal.u8 q3, q0 //add cur_row together
737 vpadal.u8 q4, q1 //add ref_row together737 vpadal.u8 q4, q1 //add ref_row together
738 738
739 vabd.u8 q2, q0, q1 //abs_diff739 vabd.u8 q2, q0, q1 //abs_diff
740 740
741 vpadal.u8 $2, q2 //l_sad for 16 bytes reset for every 8x16741 vpadal.u8 $2, q2 //l_sad for 16 bytes reset for every 8x16
742 742
743 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16743 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16
744 744
745 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16745 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16
746.endm746.endm
747 747
748.macro SAD_VAR_16_RESET_16x16748.macro SAD_VAR_16_RESET_16x16
749 vld1.8 {q0}, [$0], $2 //load cur_row749 vld1.8 {q0}, [$0], $2 //load cur_row
750 vld1.8 {q1}, [$1], $2750 vld1.8 {q1}, [$1], $2
751 751
752 vpaddl.u8 q3, q0 //add cur_row together752 vpaddl.u8 q3, q0 //add cur_row together
753 vpaddl.u8 q4, q1 //add ref_row together753 vpaddl.u8 q4, q1 //add ref_row together
754 754
755 vabd.u8 q2, q0, q1 //abs_diff755 vabd.u8 q2, q0, q1 //abs_diff
756 756
757 vpaddl.u8 $3, q2 //l_sad for 16 bytes reset for every 8x16757 vpaddl.u8 $3, q2 //l_sad for 16 bytes reset for every 8x16
758 758
759 vld1.8 {q1}, [$1], $2759 vld1.8 {q1}, [$1], $2
760 760
761 vpaddl.u8 q9, q0 //q9 for l_sum reset for every 16x16761 vpaddl.u8 q9, q0 //q9 for l_sum reset for every 16x16
762 762
763 SSD_MUL_SUM_16BYTES_RESET d0,d1, q10, q11763 SSD_MUL_SUM_16BYTES_RESET d0,d1, q10, q11
764.endm764.endm
765 765
766.macro SAD_VAR_16_RESET_8x8766.macro SAD_VAR_16_RESET_8x8
767 vld1.8 {q0}, [$0], $2 //load cur_row767 vld1.8 {q0}, [$0], $2 //load cur_row
768 768
769 vpaddl.u8 q3, q0 //add cur_row together769 vpaddl.u8 q3, q0 //add cur_row together
770 vpaddl.u8 q4, q1 //add ref_row together770 vpaddl.u8 q4, q1 //add ref_row together
771 771
772 vabd.u8 q2, q0, q1 //abs_diff772 vabd.u8 q2, q0, q1 //abs_diff
773 773
774 vpaddl.u8 $3, q2 //l_sad for 16 bytes reset for every 8x16774 vpaddl.u8 $3, q2 //l_sad for 16 bytes reset for every 8x16
775 775
776 vld1.8 {q1}, [$1], $2776 vld1.8 {q1}, [$1], $2
777 777
778 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16778 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16
779 779
780 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16780 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16
781.endm781.endm
782 782
783.macro SAD_VAR_16x16783.macro SAD_VAR_16x16
784 //for one 8x16784 //for one 8x16
785 SAD_VAR_16_RESET_16x16 $0, $1, $2, q6785 SAD_VAR_16_RESET_16x16 $0, $1, $2, q6
786 SAD_VAR_16 $0, $1, $2, q6786 SAD_VAR_16 $0, $1, $2, q6
787 SAD_VAR_16 $0, $1, $2, q6787 SAD_VAR_16 $0, $1, $2, q6
788 SAD_VAR_16 $0, $1, $2, q6788 SAD_VAR_16 $0, $1, $2, q6
789 SAD_VAR_16 $0, $1, $2, q6789 SAD_VAR_16 $0, $1, $2, q6
790 SAD_VAR_16 $0, $1, $2, q6790 SAD_VAR_16 $0, $1, $2, q6
791 SAD_VAR_16 $0, $1, $2, q6791 SAD_VAR_16 $0, $1, $2, q6
792 SAD_VAR_16 $0, $1, $2, q6792 SAD_VAR_16 $0, $1, $2, q6
793 793
794 vpaddl.u16 q6, q6794 vpaddl.u16 q6, q6
795 vpaddl.u32 q6, q6795 vpaddl.u32 q6, q6
796 vadd.i32 q12, q6796 vadd.i32 q12, q6
797 797
798 //for another 8x16798 //for another 8x16
799 SAD_VAR_16_RESET_8x8 $0, $1, $2, q7799 SAD_VAR_16_RESET_8x8 $0, $1, $2, q7
800 SAD_VAR_16 $0, $1, $2, q7800 SAD_VAR_16 $0, $1, $2, q7
801 SAD_VAR_16 $0, $1, $2, q7801 SAD_VAR_16 $0, $1, $2, q7
802 SAD_VAR_16 $0, $1, $2, q7802 SAD_VAR_16 $0, $1, $2, q7
803 SAD_VAR_16 $0, $1, $2, q7803 SAD_VAR_16 $0, $1, $2, q7
804 SAD_VAR_16 $0, $1, $2, q7804 SAD_VAR_16 $0, $1, $2, q7
805 SAD_VAR_16 $0, $1, $2, q7805 SAD_VAR_16 $0, $1, $2, q7
806 SAD_VAR_16_END $0, $2, q7806 SAD_VAR_16_END $0, $2, q7
807 807
808 vpaddl.u16 q7, q7808 vpaddl.u16 q7, q7
809 vpaddl.u32 q7, q7809 vpaddl.u32 q7, q7
810 810
811 vadd.i32 q12, q7811 vadd.i32 q12, q7
812.endm812.endm
813#else813#else
814.macro SAD_VAR_16 arg0, arg1, arg2, arg3814.macro SAD_VAR_16 arg0, arg1, arg2, arg3
815 vld1.8 {q0}, [\arg0], \arg2 //load cur_row815 vld1.8 {q0}, [\arg0], \arg2 //load cur_row
816 816
817 vpadal.u8 q3, q0 //add cur_row together817 vpadal.u8 q3, q0 //add cur_row together
818 vpadal.u8 q4, q1 //add ref_row together818 vpadal.u8 q4, q1 //add ref_row together
819 819
820 vabd.u8 q2, q0, q1 //abs_diff820 vabd.u8 q2, q0, q1 //abs_diff
821 821
822 vpadal.u8 \arg3, q2 //l_sad for 16 bytes reset for every 8x16822 vpadal.u8 \arg3, q2 //l_sad for 16 bytes reset for every 8x16
823 823
824 vld1.8 {q1}, [\arg1], \arg2824 vld1.8 {q1}, [\arg1], \arg2
825 825
826 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16826 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16
827 827
828 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16828 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16
829.endm829.endm
830 830
831.macro SAD_VAR_16_END arg0, arg1, arg2831.macro SAD_VAR_16_END arg0, arg1, arg2
832 vld1.8 {q0}, [\arg0], \arg1 //load cur_row832 vld1.8 {q0}, [\arg0], \arg1 //load cur_row
833 833
834 vpadal.u8 q3, q0 //add cur_row together834 vpadal.u8 q3, q0 //add cur_row together
835 vpadal.u8 q4, q1 //add ref_row together835 vpadal.u8 q4, q1 //add ref_row together
836 836
837 vabd.u8 q2, q0, q1 //abs_diff837 vabd.u8 q2, q0, q1 //abs_diff
838 838
839 vpadal.u8 \arg2, q2 //l_sad for 16 bytes reset for every 8x16839 vpadal.u8 \arg2, q2 //l_sad for 16 bytes reset for every 8x16
840 840
841 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16841 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16
842 842
843 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16843 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16
844.endm844.endm
845 845
846 846
847.macro SAD_VAR_16_RESET_16x16 arg0, arg1, arg2, arg3847.macro SAD_VAR_16_RESET_16x16 arg0, arg1, arg2, arg3
848 vld1.8 {q0}, [\arg0], \arg2 //load cur_row848 vld1.8 {q0}, [\arg0], \arg2 //load cur_row
849 vld1.8 {q1}, [\arg1], \arg2849 vld1.8 {q1}, [\arg1], \arg2
850 850
851 vpaddl.u8 q3, q0 //add cur_row together851 vpaddl.u8 q3, q0 //add cur_row together
852 vpaddl.u8 q4, q1 //add ref_row together852 vpaddl.u8 q4, q1 //add ref_row together
853 853
854 vabd.u8 q2, q0, q1 //abs_diff854 vabd.u8 q2, q0, q1 //abs_diff
855 855
856 vpaddl.u8 \arg3, q2 //l_sad for 16 bytes reset for every 8x16856 vpaddl.u8 \arg3, q2 //l_sad for 16 bytes reset for every 8x16
857 857
858 vld1.8 {q1}, [\arg1], \arg2858 vld1.8 {q1}, [\arg1], \arg2
859 859
860 vpaddl.u8 q9, q0 //q9 for l_sum reset for every 16x16860 vpaddl.u8 q9, q0 //q9 for l_sum reset for every 16x16
861 861
862 SSD_MUL_SUM_16BYTES_RESET d0,d1, q10, q11862 SSD_MUL_SUM_16BYTES_RESET d0,d1, q10, q11
863.endm863.endm
864 864
865.macro SAD_VAR_16_RESET_8x8 arg0, arg1, arg2, arg3865.macro SAD_VAR_16_RESET_8x8 arg0, arg1, arg2, arg3
866 vld1.8 {q0}, [\arg0], \arg2 //load cur_row866 vld1.8 {q0}, [\arg0], \arg2 //load cur_row
867 867
868 vpaddl.u8 q3, q0 //add cur_row together868 vpaddl.u8 q3, q0 //add cur_row together
869 vpaddl.u8 q4, q1 //add ref_row together869 vpaddl.u8 q4, q1 //add ref_row together
870 870
871 vabd.u8 q2, q0, q1 //abs_diff871 vabd.u8 q2, q0, q1 //abs_diff
872 872
873 vpaddl.u8 \arg3, q2 //l_sad for 16 bytes reset for every 8x16873 vpaddl.u8 \arg3, q2 //l_sad for 16 bytes reset for every 8x16
874 874
875 vld1.8 {q1}, [\arg1], \arg2875 vld1.8 {q1}, [\arg1], \arg2
876 876
877 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16877 vpadal.u8 q9, q0 //q9 for l_sum reset for every 16x16
878 878
879 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16879 SSD_MUL_SUM_16BYTES d0,d1, q10, q11 //q10 for lsqsum reset for every 16x16
880.endm880.endm
881 881
882.macro SAD_VAR_16x16 arg0, arg1, arg2882.macro SAD_VAR_16x16 arg0, arg1, arg2
883 //for one 8x16883 //for one 8x16
884 SAD_VAR_16_RESET_16x16 \arg0, \arg1, \arg2, q6884 SAD_VAR_16_RESET_16x16 \arg0, \arg1, \arg2, q6
885 SAD_VAR_16 \arg0, \arg1, \arg2, q6885 SAD_VAR_16 \arg0, \arg1, \arg2, q6
886 SAD_VAR_16 \arg0, \arg1, \arg2, q6886 SAD_VAR_16 \arg0, \arg1, \arg2, q6
887 SAD_VAR_16 \arg0, \arg1, \arg2, q6887 SAD_VAR_16 \arg0, \arg1, \arg2, q6
888 SAD_VAR_16 \arg0, \arg1, \arg2, q6888 SAD_VAR_16 \arg0, \arg1, \arg2, q6
889 SAD_VAR_16 \arg0, \arg1, \arg2, q6889 SAD_VAR_16 \arg0, \arg1, \arg2, q6
890 SAD_VAR_16 \arg0, \arg1, \arg2, q6890 SAD_VAR_16 \arg0, \arg1, \arg2, q6
891 SAD_VAR_16 \arg0, \arg1, \arg2, q6891 SAD_VAR_16 \arg0, \arg1, \arg2, q6
892 892
893 vpaddl.u16 q6, q6893 vpaddl.u16 q6, q6
894 vpaddl.u32 q6, q6894 vpaddl.u32 q6, q6
895 vadd.i32 q12, q6895 vadd.i32 q12, q6
896 896
897 //for another 8x16897 //for another 8x16
898 SAD_VAR_16_RESET_8x8 \arg0, \arg1, \arg2, q7898 SAD_VAR_16_RESET_8x8 \arg0, \arg1, \arg2, q7
899 SAD_VAR_16 \arg0, \arg1, \arg2, q7899 SAD_VAR_16 \arg0, \arg1, \arg2, q7
900 SAD_VAR_16 \arg0, \arg1, \arg2, q7900 SAD_VAR_16 \arg0, \arg1, \arg2, q7
901 SAD_VAR_16 \arg0, \arg1, \arg2, q7901 SAD_VAR_16 \arg0, \arg1, \arg2, q7
902 SAD_VAR_16 \arg0, \arg1, \arg2, q7902 SAD_VAR_16 \arg0, \arg1, \arg2, q7
903 SAD_VAR_16 \arg0, \arg1, \arg2, q7903 SAD_VAR_16 \arg0, \arg1, \arg2, q7
904 SAD_VAR_16 \arg0, \arg1, \arg2, q7904 SAD_VAR_16 \arg0, \arg1, \arg2, q7
905 SAD_VAR_16_END \arg0, \arg2, q7905 SAD_VAR_16_END \arg0, \arg2, q7
906 906
907 vpaddl.u16 q7, q7907 vpaddl.u16 q7, q7
908 vpaddl.u32 q7, q7908 vpaddl.u32 q7, q7
909 909
910 vadd.i32 q12, q7910 vadd.i32 q12, q7
911.endm911.endm
912#endif912#endif
913 913
914 914
915WELS_ASM_FUNC_BEGIN VAACalcSadVar_neon915WELS_ASM_FUNC_BEGIN VAACalcSadVar_neon
916 stmdb sp!, {r4-r11}916 stmdb sp!, {r4-r11}
917 vpush {q4}917 vpush {q4}
918 vpush {q6-q7}918 vpush {q6-q7}
919 919
920 ldr r4, [sp, #80] //r4 keeps the pic_stride920 ldr r4, [sp, #80] //r4 keeps the pic_stride
921 921
922 sub r5, r4, #1922 sub r5, r4, #1
923 lsl r5, r5, #4 //r5 keeps the little step923 lsl r5, r5, #4 //r5 keeps the little step
924 924
925 lsl r6, r4, #4925 lsl r6, r4, #4
926 sub r6, r2, r6 //r6 keeps the big step926 sub r6, r2, r6 //r6 keeps the big step
927 927
928 ldr r7, [sp, #84] //psadframe928 ldr r7, [sp, #84] //psadframe
929 ldr r8, [sp, #88] //psad8x8929 ldr r8, [sp, #88] //psad8x8
930 ldr r9, [sp, #92] //psum16x16930 ldr r9, [sp, #92] //psum16x16
931 ldr r10, [sp, #96] //psqsum16x16931 ldr r10, [sp, #96] //psqsum16x16
932 932
933 vmov.i8 q12, #0933 vmov.i8 q12, #0
934vaa_calc_sad_var_height_loop:934vaa_calc_sad_var_height_loop:
935 935
936 mov r11, r2936 mov r11, r2
@@ -956,154 +956,154 @@ vaa_calc_sad_var_width_loop: · 19 unmodified lines
956 956
957 bne vaa_calc_sad_var_width_loop957 bne vaa_calc_sad_var_width_loop
958 958
959 sub r0, r0, r6 //jump to next 16 x width959 sub r0, r0, r6 //jump to next 16 x width
960 sub r1, r1, r6 //jump to next 16 x width960 sub r1, r1, r6 //jump to next 16 x width
961 961
962 subs r3, #16962 subs r3, #16
963bne vaa_calc_sad_var_height_loop963bne vaa_calc_sad_var_height_loop
964 964
965 vadd.i32 d24, d24, d25965 vadd.i32 d24, d24, d25
966 vst1.32 {d24[0]}, [r7]966 vst1.32 {d24[0]}, [r7]
967 967
968 vpop {q6-q7}968 vpop {q6-q7}
969 vpop {q4}969 vpop {q4}
970 ldmia sp!, {r4-r11}970 ldmia sp!, {r4-r11}
971WELS_ASM_FUNC_END971WELS_ASM_FUNC_END
972 972
973 973
974#ifdef __APPLE__974#ifdef __APPLE__
975.macro SAD_SSD_16975.macro SAD_SSD_16
976 SAD_VAR_16 $0, $1, $2, $3976 SAD_VAR_16 $0, $1, $2, $3
977 977
978 SSD_MUL_SUM_16BYTES d4,d5,q8, q11978 SSD_MUL_SUM_16BYTES d4,d5,q8, q11
979.endm979.endm
980 980
981.macro SAD_SSD_16_END981.macro SAD_SSD_16_END
982 SAD_VAR_16_END $0, $1, $2982 SAD_VAR_16_END $0, $1, $2
983 983
984 SSD_MUL_SUM_16BYTES d4,d5,q8, q11 //q8 for l_sqiff reset for every 16x16984 SSD_MUL_SUM_16BYTES d4,d5,q8, q11 //q8 for l_sqiff reset for every 16x16
985.endm985.endm
986 986
987.macro SAD_SSD_16_RESET_16x16987.macro SAD_SSD_16_RESET_16x16
988 SAD_VAR_16_RESET_16x16 $0, $1, $2, $3988 SAD_VAR_16_RESET_16x16 $0, $1, $2, $3
989 989
990 SSD_MUL_SUM_16BYTES_RESET d4,d5,q8, q11 //q8 for l_sqiff reset for every 16x16990 SSD_MUL_SUM_16BYTES_RESET d4,d5,q8, q11 //q8 for l_sqiff reset for every 16x16
991.endm991.endm
992 992
993.macro SAD_SSD_16_RESET_8x8993.macro SAD_SSD_16_RESET_8x8
994 SAD_VAR_16_RESET_8x8 $0, $1, $2, $3994 SAD_VAR_16_RESET_8x8 $0, $1, $2, $3
995 995
996 SSD_MUL_SUM_16BYTES d4,d5,q8, q11 //q8 for l_sqiff reset for every 16x16996 SSD_MUL_SUM_16BYTES d4,d5,q8, q11 //q8 for l_sqiff reset for every 16x16
997.endm997.endm
998 998
999.macro SAD_SSD_16x16999.macro SAD_SSD_16x16
1000 //for one 8x161000 //for one 8x16
1001 SAD_SSD_16_RESET_16x16 $0, $1, $2, q61001 SAD_SSD_16_RESET_16x16 $0, $1, $2, q6
1002 SAD_SSD_16 $0, $1, $2, q61002 SAD_SSD_16 $0, $1, $2, q6
1003 SAD_SSD_16 $0, $1, $2, q61003 SAD_SSD_16 $0, $1, $2, q6
1004 SAD_SSD_16 $0, $1, $2, q61004 SAD_SSD_16 $0, $1, $2, q6
1005 SAD_SSD_16 $0, $1, $2, q61005 SAD_SSD_16 $0, $1, $2, q6
1006 SAD_SSD_16 $0, $1, $2, q61006 SAD_SSD_16 $0, $1, $2, q6
1007 SAD_SSD_16 $0, $1, $2, q61007 SAD_SSD_16 $0, $1, $2, q6
1008 SAD_SSD_16 $0, $1, $2, q61008 SAD_SSD_16 $0, $1, $2, q6
1009 1009
1010 vpaddl.u16 q6, q61010 vpaddl.u16 q6, q6
1011 vpaddl.u32 q6, q61011 vpaddl.u32 q6, q6
1012 vadd.i32 q12, q61012 vadd.i32 q12, q6
1013 1013
1014 //for another 8x161014 //for another 8x16
1015 SAD_SSD_16_RESET_8x8 $0, $1, $2, q71015 SAD_SSD_16_RESET_8x8 $0, $1, $2, q7
1016 SAD_SSD_16 $0, $1, $2, q71016 SAD_SSD_16 $0, $1, $2, q7
1017 SAD_SSD_16 $0, $1, $2, q71017 SAD_SSD_16 $0, $1, $2, q7
1018 SAD_SSD_16 $0, $1, $2, q71018 SAD_SSD_16 $0, $1, $2, q7
1019 SAD_SSD_16 $0, $1, $2, q71019 SAD_SSD_16 $0, $1, $2, q7
1020 SAD_SSD_16 $0, $1, $2, q71020 SAD_SSD_16 $0, $1, $2, q7
1021 SAD_SSD_16 $0, $1, $2, q71021 SAD_SSD_16 $0, $1, $2, q7
1022 SAD_SSD_16_END $0, $2, q71022 SAD_SSD_16_END $0, $2, q7
1023 1023
1024 vpaddl.u16 q7, q71024 vpaddl.u16 q7, q7
1025 vpaddl.u32 q7, q71025 vpaddl.u32 q7, q7
1026 1026
1027 vadd.i32 q12, q71027 vadd.i32 q12, q7
1028.endm1028.endm
1029#else1029#else
1030.macro SAD_SSD_16 arg0, arg1, arg2, arg31030.macro SAD_SSD_16 arg0, arg1, arg2, arg3
1031 SAD_VAR_16 \arg0, \arg1, \arg2, \arg31031 SAD_VAR_16 \arg0, \arg1, \arg2, \arg3
1032 1032
1033 SSD_MUL_SUM_16BYTES d4,d5,q8, q111033 SSD_MUL_SUM_16BYTES d4,d5,q8, q11
1034.endm1034.endm
1035 1035
1036.macro SAD_SSD_16_END arg0, arg1, arg21036.macro SAD_SSD_16_END arg0, arg1, arg2
1037 SAD_VAR_16_END \arg0, \arg1, \arg21037 SAD_VAR_16_END \arg0, \arg1, \arg2
1038 1038
1039 SSD_MUL_SUM_16BYTES d4,d5,q8, q11 //q8 for l_sqiff reset for every 16x161039 SSD_MUL_SUM_16BYTES d4,d5,q8, q11 //q8 for l_sqiff reset for every 16x16
1040.endm1040.endm
1041 1041
1042.macro SAD_SSD_16_RESET_16x16 arg0, arg1, arg2, arg31042.macro SAD_SSD_16_RESET_16x16 arg0, arg1, arg2, arg3
1043 SAD_VAR_16_RESET_16x16 \arg0, \arg1, \arg2, \arg31043 SAD_VAR_16_RESET_16x16 \arg0, \arg1, \arg2, \arg3
1044 1044
1045 SSD_MUL_SUM_16BYTES_RESET d4,d5,q8, q11 //q8 for l_sqiff reset for every 16x161045 SSD_MUL_SUM_16BYTES_RESET d4,d5,q8, q11 //q8 for l_sqiff reset for every 16x16
1046.endm1046.endm
1047 1047
1048.macro SAD_SSD_16_RESET_8x8 arg0, arg1, arg2, arg31048.macro SAD_SSD_16_RESET_8x8 arg0, arg1, arg2, arg3
1049 SAD_VAR_16_RESET_8x8 \arg0, \arg1, \arg2, \arg31049 SAD_VAR_16_RESET_8x8 \arg0, \arg1, \arg2, \arg3
1050 1050
1051 SSD_MUL_SUM_16BYTES d4,d5,q8, q11 //q8 for l_sqiff reset for every 16x161051 SSD_MUL_SUM_16BYTES d4,d5,q8, q11 //q8 for l_sqiff reset for every 16x16
1052.endm1052.endm
1053 1053
1054.macro SAD_SSD_16x16 arg0, arg1, arg21054.macro SAD_SSD_16x16 arg0, arg1, arg2
1055 //for one 8x161055 //for one 8x16
1056 SAD_SSD_16_RESET_16x16 \arg0, \arg1, \arg2, q61056 SAD_SSD_16_RESET_16x16 \arg0, \arg1, \arg2, q6
1057 SAD_SSD_16 \arg0, \arg1, \arg2, q61057 SAD_SSD_16 \arg0, \arg1, \arg2, q6
1058 SAD_SSD_16 \arg0, \arg1, \arg2, q61058 SAD_SSD_16 \arg0, \arg1, \arg2, q6
1059 SAD_SSD_16 \arg0, \arg1, \arg2, q61059 SAD_SSD_16 \arg0, \arg1, \arg2, q6
1060 SAD_SSD_16 \arg0, \arg1, \arg2, q61060 SAD_SSD_16 \arg0, \arg1, \arg2, q6
1061 SAD_SSD_16 \arg0, \arg1, \arg2, q61061 SAD_SSD_16 \arg0, \arg1, \arg2, q6
1062 SAD_SSD_16 \arg0, \arg1, \arg2, q61062 SAD_SSD_16 \arg0, \arg1, \arg2, q6
1063 SAD_SSD_16 \arg0, \arg1, \arg2, q61063 SAD_SSD_16 \arg0, \arg1, \arg2, q6
1064 1064
1065 vpaddl.u16 q6, q61065 vpaddl.u16 q6, q6
1066 vpaddl.u32 q6, q61066 vpaddl.u32 q6, q6
1067 vadd.i32 q12, q61067 vadd.i32 q12, q6
1068 1068
1069 //for another 8x161069 //for another 8x16
1070 SAD_SSD_16_RESET_8x8 \arg0, \arg1, \arg2, q71070 SAD_SSD_16_RESET_8x8 \arg0, \arg1, \arg2, q7
1071 SAD_SSD_16 \arg0, \arg1, \arg2, q71071 SAD_SSD_16 \arg0, \arg1, \arg2, q7
1072 SAD_SSD_16 \arg0, \arg1, \arg2, q71072 SAD_SSD_16 \arg0, \arg1, \arg2, q7
1073 SAD_SSD_16 \arg0, \arg1, \arg2, q71073 SAD_SSD_16 \arg0, \arg1, \arg2, q7
1074 SAD_SSD_16 \arg0, \arg1, \arg2, q71074 SAD_SSD_16 \arg0, \arg1, \arg2, q7
1075 SAD_SSD_16 \arg0, \arg1, \arg2, q71075 SAD_SSD_16 \arg0, \arg1, \arg2, q7
1076 SAD_SSD_16 \arg0, \arg1, \arg2, q71076 SAD_SSD_16 \arg0, \arg1, \arg2, q7
1077 SAD_SSD_16_END \arg0, \arg2, q71077 SAD_SSD_16_END \arg0, \arg2, q7
1078 1078
1079 vpaddl.u16 q7, q71079 vpaddl.u16 q7, q7
1080 vpaddl.u32 q7, q71080 vpaddl.u32 q7, q7
1081 1081
1082 vadd.i32 q12, q71082 vadd.i32 q12, q7
1083.endm1083.endm
1084#endif1084#endif
1085 1085
1086 1086
1087WELS_ASM_FUNC_BEGIN VAACalcSadSsd_neon1087WELS_ASM_FUNC_BEGIN VAACalcSadSsd_neon
1088 stmdb sp!, {r4-r12}1088 stmdb sp!, {r4-r12}
1089 vpush {q4}1089 vpush {q4}
1090 vpush {q6-q7}1090 vpush {q6-q7}
1091 1091
1092 ldr r4, [sp, #84] //r4 keeps the pic_stride1092 ldr r4, [sp, #84] //r4 keeps the pic_stride
1093 1093
1094 sub r5, r4, #11094 sub r5, r4, #1
1095 lsl r5, r5, #4 //r5 keeps the little step1095 lsl r5, r5, #4 //r5 keeps the little step
1096 1096
1097 lsl r6, r4, #41097 lsl r6, r4, #4
1098 sub r6, r2, r6 //r6 keeps the big step1098 sub r6, r2, r6 //r6 keeps the big step
1099 1099
1100 ldr r7, [sp, #88] //psadframe1100 ldr r7, [sp, #88] //psadframe
1101 ldr r8, [sp, #92] //psad8x81101 ldr r8, [sp, #92] //psad8x8
1102 ldr r9, [sp, #96] //psum16x161102 ldr r9, [sp, #96] //psum16x16
1103 ldr r10, [sp, #100] //psqsum16x161103 ldr r10, [sp, #100] //psqsum16x16
1104 ldr r11, [sp, #104] //psqdiff16x161104 ldr r11, [sp, #104] //psqdiff16x16
1105 1105
1106 vmov.i8 q12, #01106 vmov.i8 q12, #0
1107vaa_calc_sad_ssd_height_loop:1107vaa_calc_sad_ssd_height_loop:
1108 1108
1109 mov r12, r21109 mov r12, r2
@@ -1136,18 +1136,18 @@ vaa_calc_sad_ssd_width_loop: · 26 unmodified lines
1136 1136
1137 bne vaa_calc_sad_ssd_width_loop1137 bne vaa_calc_sad_ssd_width_loop
1138 1138
1139 sub r0, r0, r6 //jump to next 16 x width1139 sub r0, r0, r6 //jump to next 16 x width
1140 sub r1, r1, r6 //jump to next 16 x width1140 sub r1, r1, r6 //jump to next 16 x width
1141 1141
1142 subs r3, #161142 subs r3, #16
1143 bne vaa_calc_sad_ssd_height_loop1143 bne vaa_calc_sad_ssd_height_loop
1144 1144
1145 vadd.i32 d24, d24, d251145 vadd.i32 d24, d24, d25
1146 vst1.32 {d24[0]}, [r7]1146 vst1.32 {d24[0]}, [r7]
1147 1147
1148 vpop {q6-q7}1148 vpop {q6-q7}
1149 vpop {q4}1149 vpop {q4}
1150 ldmia sp!, {r4-r12}1150 ldmia sp!, {r4-r12}
1151WELS_ASM_FUNC_END1151WELS_ASM_FUNC_END
1152 1152
1153#endif1153#endif
codec/processing/src/x86/denoisefilter.asm+170−170
@@ -56,217 +56,217 @@ sse2_20 times 8 dw 20 · 55 unmodified lines
56;***********************************************************************56;***********************************************************************
57SECTION .text57SECTION .text
58 58
59%macro WEIGHT_LINE 959%macro WEIGHT_LINE 9
60 movq %2, %960 movq %2, %9
61 punpcklbw %2, %761 punpcklbw %2, %7
62 movdqa %8, %262 movdqa %8, %2
63 63
64 movdqa %1, %664 movdqa %1, %6
65 psubusb %1, %865 psubusb %1, %8
66 psubusb %8, %666 psubusb %8, %6
67 por %8, %1 ; ABS(curPixel - centerPixel);67 por %8, %1 ; ABS(curPixel - centerPixel);
68 68
69 movdqa %1, %369 movdqa %1, %3
70 psubusb %1, %870 psubusb %1, %8
71 71
72 pmullw %1, %172 pmullw %1, %1
73 psrlw %1, 573 psrlw %1, 5
74 pmullw %2, %174 pmullw %2, %1
75 paddusw %4, %175 paddusw %4, %1
76 paddusw %5, %276 paddusw %5, %2
77%endmacro77%endmacro
78 78
79%macro WEIGHT_LINE1_UV 479%macro WEIGHT_LINE1_UV 4
80 movdqa %2, %180 movdqa %2, %1
81 punpcklbw %2, %481 punpcklbw %2, %4
82 paddw %3, %282 paddw %3, %2
83 83
84 movdqa %2, %184 movdqa %2, %1
85 psrldq %2, 185 psrldq %2, 1
86 punpcklbw %2, %486 punpcklbw %2, %4
87 paddw %3, %287 paddw %3, %2
88 88
89 movdqa %2, %189 movdqa %2, %1
90 psrldq %2, 290 psrldq %2, 2
91 punpcklbw %2, %491 punpcklbw %2, %4
92 psllw %2, 192 psllw %2, 1
93 paddw %3, %293 paddw %3, %2
94 94
95 movdqa %2, %195 movdqa %2, %1
96 psrldq %2, 396 psrldq %2, 3
97 punpcklbw %2, %497 punpcklbw %2, %4
98 paddw %3, %298 paddw %3, %2
99 99
100 movdqa %2, %1100 movdqa %2, %1
101 psrldq %2, 4101 psrldq %2, 4
102 punpcklbw %2, %4102 punpcklbw %2, %4
103 paddw %3, %2103 paddw %3, %2
104%endmacro104%endmacro
105 105
106%macro WEIGHT_LINE2_UV 4106%macro WEIGHT_LINE2_UV 4
107 movdqa %2, %1107 movdqa %2, %1
108 punpcklbw %2, %4108 punpcklbw %2, %4
109 paddw %3, %2109 paddw %3, %2
110 110
111 movdqa %2, %1111 movdqa %2, %1
112 psrldq %2, 1112 psrldq %2, 1
113 punpcklbw %2, %4113 punpcklbw %2, %4
114 psllw %2, 1114 psllw %2, 1
115 paddw %3, %2115 paddw %3, %2
116 116
117 movdqa %2, %1117 movdqa %2, %1
118 psrldq %2, 2118 psrldq %2, 2
119 punpcklbw %2, %4119 punpcklbw %2, %4
120 psllw %2, 2120 psllw %2, 2
121 paddw %3, %2121 paddw %3, %2
122 122
123 movdqa %2, %1123 movdqa %2, %1
124 psrldq %2, 3124 psrldq %2, 3
125 punpcklbw %2, %4125 punpcklbw %2, %4
126 psllw %2, 1126 psllw %2, 1
127 paddw %3, %2127 paddw %3, %2
128 128
129 movdqa %2, %1129 movdqa %2, %1
130 psrldq %2, 4130 psrldq %2, 4
131 punpcklbw %2, %4131 punpcklbw %2, %4
132 paddw %3, %2132 paddw %3, %2
133%endmacro133%endmacro
134 134
135%macro WEIGHT_LINE3_UV 4135%macro WEIGHT_LINE3_UV 4
136 movdqa %2, %1136 movdqa %2, %1
137 punpcklbw %2, %4137 punpcklbw %2, %4
138 psllw %2, 1138 psllw %2, 1
139 paddw %3, %2139 paddw %3, %2
140 140
141 movdqa %2, %1141 movdqa %2, %1
142 psrldq %2, 1142 psrldq %2, 1
143 punpcklbw %2, %4143 punpcklbw %2, %4
144 psllw %2, 2144 psllw %2, 2
145 paddw %3, %2145 paddw %3, %2
146 146
147 movdqa %2, %1147 movdqa %2, %1
148 psrldq %2, 2148 psrldq %2, 2
149 punpcklbw %2, %4149 punpcklbw %2, %4
150 pmullw %2, [sse2_20]150 pmullw %2, [sse2_20]
151 paddw %3, %2151 paddw %3, %2
152 152
153 movdqa %2, %1153 movdqa %2, %1
154 psrldq %2, 3154 psrldq %2, 3
155 punpcklbw %2, %4155 punpcklbw %2, %4
156 psllw %2, 2156 psllw %2, 2
157 paddw %3, %2157 paddw %3, %2
158 158
159 movdqa %2, %1159 movdqa %2, %1
160 psrldq %2, 4160 psrldq %2, 4
161 punpcklbw %2, %4161 punpcklbw %2, %4
162 psllw %2, 1162 psllw %2, 1
163 paddw %3, %2163 paddw %3, %2
164%endmacro164%endmacro
165 165
166;***********************************************************************166;***********************************************************************
167; BilateralLumaFilter8_sse2(uint8_t *pixels, int stride);167; BilateralLumaFilter8_sse2(uint8_t *pixels, int stride);
168;***********************************************************************168;***********************************************************************
169; 1 2 3169; 1 2 3
170; 4 0 5170; 4 0 5
171; 6 7 8171; 6 7 8
172; 0: the center point172; 0: the center point
173 173
174WELS_EXTERN BilateralLumaFilter8_sse2174WELS_EXTERN BilateralLumaFilter8_sse2
175 175
176 push r3176 push r3
177 %assign push_num 1177 %assign push_num 1
178 LOAD_2_PARA178 LOAD_2_PARA
179 PUSH_XMM 8179 PUSH_XMM 8
180 180
181 pxor xmm7, xmm7181 pxor xmm7, xmm7
182 182
183 mov r3, r0183 mov r3, r0
184 184
185 movq xmm6, [r0]185 movq xmm6, [r0]
186 punpcklbw xmm6, xmm7186 punpcklbw xmm6, xmm7
187 movdqa xmm3, [sse2_32]187 movdqa xmm3, [sse2_32]
188 pxor xmm4, xmm4 ; nTotWeight188 pxor xmm4, xmm4 ; nTotWeight
189 pxor xmm5, xmm5 ; nSum189 pxor xmm5, xmm5 ; nSum
190 190
191 dec r0191 dec r0
192 WEIGHT_LINE xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm0, [r0] ; pixel 4192 WEIGHT_LINE xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm0, [r0] ; pixel 4
193 WEIGHT_LINE xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm0, [r0 + 2] ; pixel 5193 WEIGHT_LINE xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm0, [r0 + 2] ; pixel 5
194 194
195 sub r0, r1195 sub r0, r1
196 WEIGHT_LINE xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm0, [r0] ; pixel 1196 WEIGHT_LINE xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm0, [r0] ; pixel 1
197 WEIGHT_LINE xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm0, [r0 + 1] ; pixel 2197 WEIGHT_LINE xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm0, [r0 + 1] ; pixel 2
198 WEIGHT_LINE xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm0, [r0 + 2] ; pixel 3198 WEIGHT_LINE xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm0, [r0 + 2] ; pixel 3
199 199
200 lea r0, [r0 + r1 * 2]200 lea r0, [r0 + r1 * 2]
201 WEIGHT_LINE xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm0, [r0] ; pixel 6201 WEIGHT_LINE xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm0, [r0] ; pixel 6
202 WEIGHT_LINE xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm0, [r0 + 1] ; pixel 7202 WEIGHT_LINE xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm0, [r0 + 1] ; pixel 7
203 WEIGHT_LINE xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm0, [r0 + 2] ; pixel 8203 WEIGHT_LINE xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm0, [r0 + 2] ; pixel 8
204 204
205 pcmpeqw xmm0, xmm0205 pcmpeqw xmm0, xmm0
206 psrlw xmm0, 15206 psrlw xmm0, 15
207 psllw xmm0, 8207 psllw xmm0, 8
208 psubusw xmm0, xmm4208 psubusw xmm0, xmm4
209 pmullw xmm0, xmm6209 pmullw xmm0, xmm6
210 paddusw xmm5, xmm0210 paddusw xmm5, xmm0
211 psrlw xmm5, 8211 psrlw xmm5, 8
212 packuswb xmm5, xmm5212 packuswb xmm5, xmm5
213 movq [r3], xmm5213 movq [r3], xmm5
214 214
215 215
216 POP_XMM216 POP_XMM
217 pop r3217 pop r3
218 %assign push_num 0218 %assign push_num 0
219 219
220 ret220 ret
221 221
222;***********************************************************************222;***********************************************************************
223; void WaverageChromaFilter8_sse2(uint8_t *pixels, int stride);223; void WaverageChromaFilter8_sse2(uint8_t *pixels, int stride);
224;***********************************************************************224;***********************************************************************
225;5x5 filter:225;5x5 filter:
226;1 1 2 1 1226;1 1 2 1 1
227;1 2 4 2 1227;1 2 4 2 1
228;2 4 20 4 2228;2 4 20 4 2
229;1 2 4 2 1229;1 2 4 2 1
230;1 1 2 1 1230;1 1 2 1 1
231 231
232WELS_EXTERN WaverageChromaFilter8_sse2232WELS_EXTERN WaverageChromaFilter8_sse2
233 233
234 push r3234 push r3
235 235
236 %assign push_num 1236 %assign push_num 1
237 237
238 LOAD_2_PARA238 LOAD_2_PARA
239 239
240 mov r3, r1240 mov r3, r1
241 add r3, r3241 add r3, r3
242 sub r0, r3 ; pixels - 2 * stride242 sub r0, r3 ; pixels - 2 * stride
243 sub r0, 2243 sub r0, 2
244 244
245 pxor xmm0, xmm0245 pxor xmm0, xmm0
246 pxor xmm3, xmm3246 pxor xmm3, xmm3
247 247
248 movdqu xmm1, [r0]248 movdqu xmm1, [r0]
249 WEIGHT_LINE1_UV xmm1, xmm2, xmm3, xmm0249 WEIGHT_LINE1_UV xmm1, xmm2, xmm3, xmm0
250 250
251 movdqu xmm1, [r0 + r1]251 movdqu xmm1, [r0 + r1]
252 WEIGHT_LINE2_UV xmm1, xmm2, xmm3, xmm0252 WEIGHT_LINE2_UV xmm1, xmm2, xmm3, xmm0
253 253
254 add r0, r3254 add r0, r3
255 movdqu xmm1, [r0]255 movdqu xmm1, [r0]
256 WEIGHT_LINE3_UV xmm1, xmm2, xmm3, xmm0256 WEIGHT_LINE3_UV xmm1, xmm2, xmm3, xmm0
257 257
258 movdqu xmm1, [r0 + r1]258 movdqu xmm1, [r0 + r1]
259 WEIGHT_LINE2_UV xmm1, xmm2, xmm3, xmm0259 WEIGHT_LINE2_UV xmm1, xmm2, xmm3, xmm0
260 260
261 movdqu xmm1, [r0 + r1 * 2]261 movdqu xmm1, [r0 + r1 * 2]
262 WEIGHT_LINE1_UV xmm1, xmm2, xmm3, xmm0262 WEIGHT_LINE1_UV xmm1, xmm2, xmm3, xmm0
263 263
264 psrlw xmm3, 6264 psrlw xmm3, 6
265 packuswb xmm3, xmm3265 packuswb xmm3, xmm3
266 movq [r0 + 2], xmm3266 movq [r0 + 2], xmm3
267 267
268 268
269 pop r3269 pop r3
270 270
271 %assign push_num 0271 %assign push_num 0
272 ret272 ret
codec/processing/src/x86/downsample_bilinear.asm+978−978
@@ -29,13 +29,13 @@ · 28 unmodified lines
29;* POSSIBILITY OF SUCH DAMAGE.29;* POSSIBILITY OF SUCH DAMAGE.
30;*30;*
31;*31;*
32;* upsampling.asm32;* upsampling.asm
33;*33;*
34;* Abstract34;* Abstract
35;* SIMD for pixel domain down sampling35;* SIMD for pixel domain down sampling
36;*36;*
37;* History37;* History
38;* 10/22/2009 Created38;* 10/22/2009 Created
39;*39;*
40;*************************************************************************/40;*************************************************************************/
41%include "asm_inc.asm"41%include "asm_inc.asm"
@@ -61,9 +61,9 @@ SECTION .rodata align=16 · 19 unmodified lines
61 61
62ALIGN 1662ALIGN 16
63shufb_mask_low:63shufb_mask_low:
64 db 00h, 80h, 02h, 80h, 04h, 80h, 06h, 80h, 08h, 80h, 0ah, 80h, 0ch, 80h, 0eh, 80h64 db 00h, 80h, 02h, 80h, 04h, 80h, 06h, 80h, 08h, 80h, 0ah, 80h, 0ch, 80h, 0eh, 80h
65shufb_mask_high:65shufb_mask_high:
66 db 01h, 80h, 03h, 80h, 05h, 80h, 07h, 80h, 09h, 80h, 0bh, 80h, 0dh, 80h, 0fh, 80h66 db 01h, 80h, 03h, 80h, 05h, 80h, 07h, 80h, 09h, 80h, 0bh, 80h, 0dh, 80h, 0fh, 80h
67 67
68 68
69;***********************************************************************69;***********************************************************************
@@ -73,737 +73,737 @@ shufb_mask_high: · 3 unmodified lines
73SECTION .text73SECTION .text
74 74
75;***********************************************************************75;***********************************************************************
76; void DyadicBilinearDownsamplerWidthx32_sse( unsigned char* pDst, const int iDstStride,76; void DyadicBilinearDownsamplerWidthx32_sse( unsigned char* pDst, const int iDstStride,
77; unsigned char* pSrc, const int iSrcStride,77; unsigned char* pSrc, const int iSrcStride,
78; const int iSrcWidth, const int iSrcHeight );78; const int iSrcWidth, const int iSrcHeight );
79;***********************************************************************79;***********************************************************************
80WELS_EXTERN DyadicBilinearDownsamplerWidthx32_sse80WELS_EXTERN DyadicBilinearDownsamplerWidthx32_sse
81 push ebx81 push ebx
82 push edx82 push edx
83 push esi83 push esi
84 push edi84 push edi
85 push ebp85 push ebp
86 86
87 mov edi, [esp+24] ; pDst87 mov edi, [esp+24] ; pDst
88 mov edx, [esp+28] ; iDstStride88 mov edx, [esp+28] ; iDstStride
89 mov esi, [esp+32] ; pSrc89 mov esi, [esp+32] ; pSrc
90 mov ecx, [esp+36] ; iSrcStride90 mov ecx, [esp+36] ; iSrcStride
91 mov ebp, [esp+44] ; iSrcHeight91 mov ebp, [esp+44] ; iSrcHeight
92 92
93 sar ebp, $01 ; iSrcHeight >> 193 sar ebp, $01 ; iSrcHeight >> 1
94 94
95.yloops:95.yloops:
96 mov eax, [esp+40] ; iSrcWidth96 mov eax, [esp+40] ; iSrcWidth
97 sar eax, $01 ; iSrcWidth >> 197 sar eax, $01 ; iSrcWidth >> 1
98 mov ebx, eax ; iDstWidth restored at ebx98 mov ebx, eax ; iDstWidth restored at ebx
99 sar eax, $04 ; (iSrcWidth >> 1) / 16 ; loop count = num_of_mb99 sar eax, $04 ; (iSrcWidth >> 1) / 16 ; loop count = num_of_mb
100 neg ebx ; - (iSrcWidth >> 1)100 neg ebx ; - (iSrcWidth >> 1)
101 ; each loop = source bandwidth: 32 bytes101 ; each loop = source bandwidth: 32 bytes
102.xloops:102.xloops:
103 ; 1st part horizonal loop: x16 bytes103 ; 1st part horizonal loop: x16 bytes
104 ; mem hi<- ->lo104 ; mem hi<- ->lo
105 ;1st Line Src: mm0: d D c C b B a A mm1: h H g G f F e E105 ;1st Line Src: mm0: d D c C b B a A mm1: h H g G f F e E
106 ;2nd Line Src: mm2: l L k K j J i I mm3: p P o O n N m M106 ;2nd Line Src: mm2: l L k K j J i I mm3: p P o O n N m M
107 ;=> target:107 ;=> target:
108 ;: H G F E D C B A, P O N M L K J I108 ;: H G F E D C B A, P O N M L K J I
109 ;: h g f e d c b a, p o n m l k j i109 ;: h g f e d c b a, p o n m l k j i
110 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;110 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
111 movq mm0, [esi] ; 1st pSrc line111 movq mm0, [esi] ; 1st pSrc line
112 movq mm1, [esi+8] ; 1st pSrc line + 8112 movq mm1, [esi+8] ; 1st pSrc line + 8
113 movq mm2, [esi+ecx] ; 2nd pSrc line113 movq mm2, [esi+ecx] ; 2nd pSrc line
114 movq mm3, [esi+ecx+8] ; 2nd pSrc line + 8114 movq mm3, [esi+ecx+8] ; 2nd pSrc line + 8
115 115
116 ; to handle mm0, mm1, mm2, mm3116 ; to handle mm0, mm1, mm2, mm3
117 pshufw mm4, mm0, 0d8h ; d D b B c C a A ; 11011000 B117 pshufw mm4, mm0, 0d8h ; d D b B c C a A ; 11011000 B
118 pshufw mm5, mm4, 04eh ; c C a A d D b B ; 01001110 B118 pshufw mm5, mm4, 04eh ; c C a A d D b B ; 01001110 B
119 punpcklbw mm4, mm5 ; d c D C b a B A119 punpcklbw mm4, mm5 ; d c D C b a B A
120 pshufw mm4, mm4, 0d8h ; d c b a D C B A ; 11011000 B: mm4120 pshufw mm4, mm4, 0d8h ; d c b a D C B A ; 11011000 B: mm4
121 121
122 pshufw mm5, mm1, 0d8h ; h H f F g G e E ; 11011000 B122 pshufw mm5, mm1, 0d8h ; h H f F g G e E ; 11011000 B
123 pshufw mm6, mm5, 04eh ; g G e E h H f F ; 01001110 B123 pshufw mm6, mm5, 04eh ; g G e E h H f F ; 01001110 B
124 punpcklbw mm5, mm6 ; h g H G f e F E124 punpcklbw mm5, mm6 ; h g H G f e F E
125 pshufw mm5, mm5, 0d8h ; h g f e H G F E ; 11011000 B: mm5125 pshufw mm5, mm5, 0d8h ; h g f e H G F E ; 11011000 B: mm5
126 126
127 pshufw mm6, mm2, 0d8h ; l L j J k K i I ; 11011000 B127 pshufw mm6, mm2, 0d8h ; l L j J k K i I ; 11011000 B
128 pshufw mm7, mm6, 04eh ; k K i I l L j J ; 01001110 B128 pshufw mm7, mm6, 04eh ; k K i I l L j J ; 01001110 B
129 punpcklbw mm6, mm7 ; l k L K j i J I129 punpcklbw mm6, mm7 ; l k L K j i J I
130 pshufw mm6, mm6, 0d8h ; l k j i L K J I ; 11011000 B: mm6130 pshufw mm6, mm6, 0d8h ; l k j i L K J I ; 11011000 B: mm6
131 131
132 pshufw mm7, mm3, 0d8h ; p P n N o O m M ; 11011000 B132 pshufw mm7, mm3, 0d8h ; p P n N o O m M ; 11011000 B
133 pshufw mm0, mm7, 04eh ; o O m M p P n N ; 01001110 B133 pshufw mm0, mm7, 04eh ; o O m M p P n N ; 01001110 B
134 punpcklbw mm7, mm0 ; p o P O n m N M134 punpcklbw mm7, mm0 ; p o P O n m N M
135 pshufw mm7, mm7, 0d8h ; p o n m P O N M ; 11011000 B: mm7135 pshufw mm7, mm7, 0d8h ; p o n m P O N M ; 11011000 B: mm7
136 136
137 ; to handle mm4, mm5, mm6, mm7137 ; to handle mm4, mm5, mm6, mm7
138 movq mm0, mm4 ;138 movq mm0, mm4 ;
139 punpckldq mm0, mm5 ; H G F E D C B A139 punpckldq mm0, mm5 ; H G F E D C B A
140 punpckhdq mm4, mm5 ; h g f e d c b a140 punpckhdq mm4, mm5 ; h g f e d c b a
141 141
142 movq mm1, mm6142 movq mm1, mm6
143 punpckldq mm1, mm7 ; P O N M L K J I143 punpckldq mm1, mm7 ; P O N M L K J I
144 punpckhdq mm6, mm7 ; p o n m l k j i144 punpckhdq mm6, mm7 ; p o n m l k j i
145 145
146 ; avg within MB horizon width (16 x 2 lines)146 ; avg within MB horizon width (16 x 2 lines)
147 pavgb mm0, mm4 ; (A+a+1)>>1, .., (H+h+1)>>1, temp_row1147 pavgb mm0, mm4 ; (A+a+1)>>1, .., (H+h+1)>>1, temp_row1
148 pavgb mm1, mm6 ; (I+i+1)>>1, .., (P+p+1)>>1, temp_row2148 pavgb mm1, mm6 ; (I+i+1)>>1, .., (P+p+1)>>1, temp_row2
149 pavgb mm0, mm1 ; (temp_row1+temp_row2+1)>>1, pending here and wait another horizonal part done then write memory once149 pavgb mm0, mm1 ; (temp_row1+temp_row2+1)>>1, pending here and wait another horizonal part done then write memory once
150 150
151 ; 2nd part horizonal loop: x16 bytes151 ; 2nd part horizonal loop: x16 bytes
152 ; mem hi<- ->lo152 ; mem hi<- ->lo
153 ;1st Line Src: mm0: d D c C b B a A mm1: h H g G f F e E153 ;1st Line Src: mm0: d D c C b B a A mm1: h H g G f F e E
154 ;2nd Line Src: mm2: l L k K j J i I mm3: p P o O n N m M154 ;2nd Line Src: mm2: l L k K j J i I mm3: p P o O n N m M
155 ;=> target:155 ;=> target:
156 ;: H G F E D C B A, P O N M L K J I156 ;: H G F E D C B A, P O N M L K J I
157 ;: h g f e d c b a, p o n m l k j i157 ;: h g f e d c b a, p o n m l k j i
158 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;158 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
159 movq mm1, [esi+16] ; 1st pSrc line + 16159 movq mm1, [esi+16] ; 1st pSrc line + 16
160 movq mm2, [esi+24] ; 1st pSrc line + 24160 movq mm2, [esi+24] ; 1st pSrc line + 24
161 movq mm3, [esi+ecx+16] ; 2nd pSrc line + 16161 movq mm3, [esi+ecx+16] ; 2nd pSrc line + 16
162 movq mm4, [esi+ecx+24] ; 2nd pSrc line + 24162 movq mm4, [esi+ecx+24] ; 2nd pSrc line + 24
163 163
164 ; to handle mm1, mm2, mm3, mm4164 ; to handle mm1, mm2, mm3, mm4
165 pshufw mm5, mm1, 0d8h ; d D b B c C a A ; 11011000 B165 pshufw mm5, mm1, 0d8h ; d D b B c C a A ; 11011000 B
166 pshufw mm6, mm5, 04eh ; c C a A d D b B ; 01001110 B166 pshufw mm6, mm5, 04eh ; c C a A d D b B ; 01001110 B
167 punpcklbw mm5, mm6 ; d c D C b a B A167 punpcklbw mm5, mm6 ; d c D C b a B A
168 pshufw mm5, mm5, 0d8h ; d c b a D C B A ; 11011000 B: mm5168 pshufw mm5, mm5, 0d8h ; d c b a D C B A ; 11011000 B: mm5
169 169
170 pshufw mm6, mm2, 0d8h ; h H f F g G e E ; 11011000 B170 pshufw mm6, mm2, 0d8h ; h H f F g G e E ; 11011000 B
171 pshufw mm7, mm6, 04eh ; g G e E h H f F ; 01001110 B171 pshufw mm7, mm6, 04eh ; g G e E h H f F ; 01001110 B
172 punpcklbw mm6, mm7 ; h g H G f e F E172 punpcklbw mm6, mm7 ; h g H G f e F E
173 pshufw mm6, mm6, 0d8h ; h g f e H G F E ; 11011000 B: mm6173 pshufw mm6, mm6, 0d8h ; h g f e H G F E ; 11011000 B: mm6
174 174
175 pshufw mm7, mm3, 0d8h ; l L j J k K i I ; 11011000 B175 pshufw mm7, mm3, 0d8h ; l L j J k K i I ; 11011000 B
176 pshufw mm1, mm7, 04eh ; k K i I l L j J ; 01001110 B176 pshufw mm1, mm7, 04eh ; k K i I l L j J ; 01001110 B
177 punpcklbw mm7, mm1 ; l k L K j i J I177 punpcklbw mm7, mm1 ; l k L K j i J I
178 pshufw mm7, mm7, 0d8h ; l k j i L K J I ; 11011000 B: mm7178 pshufw mm7, mm7, 0d8h ; l k j i L K J I ; 11011000 B: mm7
179 179
180 pshufw mm1, mm4, 0d8h ; p P n N o O m M ; 11011000 B180 pshufw mm1, mm4, 0d8h ; p P n N o O m M ; 11011000 B
181 pshufw mm2, mm1, 04eh ; o O m M p P n N ; 01001110 B181 pshufw mm2, mm1, 04eh ; o O m M p P n N ; 01001110 B
182 punpcklbw mm1, mm2 ; p o P O n m N M182 punpcklbw mm1, mm2 ; p o P O n m N M
183 pshufw mm1, mm1, 0d8h ; p o n m P O N M ; 11011000 B: mm1183 pshufw mm1, mm1, 0d8h ; p o n m P O N M ; 11011000 B: mm1
184 184
185 ; to handle mm5, mm6, mm7, mm1185 ; to handle mm5, mm6, mm7, mm1
186 movq mm2, mm5186 movq mm2, mm5
187 punpckldq mm2, mm6 ; H G F E D C B A187 punpckldq mm2, mm6 ; H G F E D C B A
188 punpckhdq mm5, mm6 ; h g f e d c b a188 punpckhdq mm5, mm6 ; h g f e d c b a
189 189
190 movq mm3, mm7190 movq mm3, mm7
191 punpckldq mm3, mm1 ; P O N M L K J I191 punpckldq mm3, mm1 ; P O N M L K J I
192 punpckhdq mm7, mm1 ; p o n m l k j i192 punpckhdq mm7, mm1 ; p o n m l k j i
193 193
194 ; avg within MB horizon width (16 x 2 lines)194 ; avg within MB horizon width (16 x 2 lines)
195 pavgb mm2, mm5 ; (A+a+1)>>1, .., (H+h+1)>>1, temp_row1195 pavgb mm2, mm5 ; (A+a+1)>>1, .., (H+h+1)>>1, temp_row1
196 pavgb mm3, mm7 ; (I+i+1)>>1, .., (P+p+1)>>1, temp_row2196 pavgb mm3, mm7 ; (I+i+1)>>1, .., (P+p+1)>>1, temp_row2
197 pavgb mm2, mm3 ; (temp_row1+temp_row2+1)>>1, done in another 2nd horizonal part197 pavgb mm2, mm3 ; (temp_row1+temp_row2+1)>>1, done in another 2nd horizonal part
198 198
199 movq [edi ], mm0199 movq [edi ], mm0
200 movq [edi+8], mm2200 movq [edi+8], mm2
201 201
202 ; next SMB202 ; next SMB
203 lea esi, [esi+32]203 lea esi, [esi+32]
204 lea edi, [edi+16]204 lea edi, [edi+16]
205 205
206 dec eax206 dec eax
207 jg near .xloops207 jg near .xloops
208 208
209 ; next line209 ; next line
210 lea esi, [esi+2*ecx] ; next end of lines210 lea esi, [esi+2*ecx] ; next end of lines
211 lea esi, [esi+2*ebx] ; reset to base 0 [- 2 * iDstWidth]211 lea esi, [esi+2*ebx] ; reset to base 0 [- 2 * iDstWidth]
212 lea edi, [edi+edx]212 lea edi, [edi+edx]
213 lea edi, [edi+ebx] ; reset to base 0 [- iDstWidth]213 lea edi, [edi+ebx] ; reset to base 0 [- iDstWidth]
214 214
215 dec ebp215 dec ebp
216 jg near .yloops216 jg near .yloops
217 217
218 WELSEMMS218 WELSEMMS
219 pop ebp219 pop ebp
220 pop edi220 pop edi
221 pop esi221 pop esi
222 pop edx222 pop edx
223 pop ebx223 pop ebx
224 ret224 ret
225 225
226;***********************************************************************226;***********************************************************************
227; void DyadicBilinearDownsamplerWidthx16_sse( unsigned char* pDst, const int iDstStride,227; void DyadicBilinearDownsamplerWidthx16_sse( unsigned char* pDst, const int iDstStride,
228; unsigned char* pSrc, const int iSrcStride,228; unsigned char* pSrc, const int iSrcStride,
229; const int iSrcWidth, const int iSrcHeight );229; const int iSrcWidth, const int iSrcHeight );
230;***********************************************************************230;***********************************************************************
231WELS_EXTERN DyadicBilinearDownsamplerWidthx16_sse231WELS_EXTERN DyadicBilinearDownsamplerWidthx16_sse
232 push ebx232 push ebx
233 push edx233 push edx
234 push esi234 push esi
235 push edi235 push edi
236 push ebp236 push ebp
237 237
238 mov edi, [esp+24] ; pDst238 mov edi, [esp+24] ; pDst
239 mov edx, [esp+28] ; iDstStride239 mov edx, [esp+28] ; iDstStride
240 mov esi, [esp+32] ; pSrc240 mov esi, [esp+32] ; pSrc
241 mov ecx, [esp+36] ; iSrcStride241 mov ecx, [esp+36] ; iSrcStride
242 mov ebp, [esp+44] ; iSrcHeight242 mov ebp, [esp+44] ; iSrcHeight
243 243
244 sar ebp, $01 ; iSrcHeight >> 1244 sar ebp, $01 ; iSrcHeight >> 1
245 245
246.yloops:246.yloops:
247 mov eax, [esp+40] ; iSrcWidth247 mov eax, [esp+40] ; iSrcWidth
248 sar eax, $01 ; iSrcWidth >> 1248 sar eax, $01 ; iSrcWidth >> 1
249 mov ebx, eax ; iDstWidth restored at ebx249 mov ebx, eax ; iDstWidth restored at ebx
250 sar eax, $03 ; (iSrcWidth >> 1) / 8 ; loop count = num_of_mb250 sar eax, $03 ; (iSrcWidth >> 1) / 8 ; loop count = num_of_mb
251 neg ebx ; - (iSrcWidth >> 1)251 neg ebx ; - (iSrcWidth >> 1)
252 ; each loop = source bandwidth: 16 bytes252 ; each loop = source bandwidth: 16 bytes
253.xloops:253.xloops:
254 ; 1st part horizonal loop: x16 bytes254 ; 1st part horizonal loop: x16 bytes
255 ; mem hi<- ->lo255 ; mem hi<- ->lo
256 ;1st Line Src: mm0: d D c C b B a A mm1: h H g G f F e E256 ;1st Line Src: mm0: d D c C b B a A mm1: h H g G f F e E
257 ;2nd Line Src: mm2: l L k K j J i I mm3: p P o O n N m M257 ;2nd Line Src: mm2: l L k K j J i I mm3: p P o O n N m M
258 ;=> target:258 ;=> target:
259 ;: H G F E D C B A, P O N M L K J I259 ;: H G F E D C B A, P O N M L K J I
260 ;: h g f e d c b a, p o n m l k j i260 ;: h g f e d c b a, p o n m l k j i
261 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;261 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
262 movq mm0, [esi] ; 1st pSrc line262 movq mm0, [esi] ; 1st pSrc line
263 movq mm1, [esi+8] ; 1st pSrc line + 8263 movq mm1, [esi+8] ; 1st pSrc line + 8
264 movq mm2, [esi+ecx] ; 2nd pSrc line264 movq mm2, [esi+ecx] ; 2nd pSrc line
265 movq mm3, [esi+ecx+8] ; 2nd pSrc line + 8265 movq mm3, [esi+ecx+8] ; 2nd pSrc line + 8
266 266
267 ; to handle mm0, mm1, mm2, mm3267 ; to handle mm0, mm1, mm2, mm3
268 pshufw mm4, mm0, 0d8h ; d D b B c C a A ; 11011000 B268 pshufw mm4, mm0, 0d8h ; d D b B c C a A ; 11011000 B
269 pshufw mm5, mm4, 04eh ; c C a A d D b B ; 01001110 B269 pshufw mm5, mm4, 04eh ; c C a A d D b B ; 01001110 B
270 punpcklbw mm4, mm5 ; d c D C b a B A270 punpcklbw mm4, mm5 ; d c D C b a B A
271 pshufw mm4, mm4, 0d8h ; d c b a D C B A ; 11011000 B: mm4271 pshufw mm4, mm4, 0d8h ; d c b a D C B A ; 11011000 B: mm4
272 272
273 pshufw mm5, mm1, 0d8h ; h H f F g G e E ; 11011000 B273 pshufw mm5, mm1, 0d8h ; h H f F g G e E ; 11011000 B
274 pshufw mm6, mm5, 04eh ; g G e E h H f F ; 01001110 B274 pshufw mm6, mm5, 04eh ; g G e E h H f F ; 01001110 B
275 punpcklbw mm5, mm6 ; h g H G f e F E275 punpcklbw mm5, mm6 ; h g H G f e F E
276 pshufw mm5, mm5, 0d8h ; h g f e H G F E ; 11011000 B: mm5276 pshufw mm5, mm5, 0d8h ; h g f e H G F E ; 11011000 B: mm5
277 277
278 pshufw mm6, mm2, 0d8h ; l L j J k K i I ; 11011000 B278 pshufw mm6, mm2, 0d8h ; l L j J k K i I ; 11011000 B
279 pshufw mm7, mm6, 04eh ; k K i I l L j J ; 01001110 B279 pshufw mm7, mm6, 04eh ; k K i I l L j J ; 01001110 B
280 punpcklbw mm6, mm7 ; l k L K j i J I280 punpcklbw mm6, mm7 ; l k L K j i J I
281 pshufw mm6, mm6, 0d8h ; l k j i L K J I ; 11011000 B: mm6281 pshufw mm6, mm6, 0d8h ; l k j i L K J I ; 11011000 B: mm6
282 282
283 pshufw mm7, mm3, 0d8h ; p P n N o O m M ; 11011000 B283 pshufw mm7, mm3, 0d8h ; p P n N o O m M ; 11011000 B
284 pshufw mm0, mm7, 04eh ; o O m M p P n N ; 01001110 B284 pshufw mm0, mm7, 04eh ; o O m M p P n N ; 01001110 B
285 punpcklbw mm7, mm0 ; p o P O n m N M285 punpcklbw mm7, mm0 ; p o P O n m N M
286 pshufw mm7, mm7, 0d8h ; p o n m P O N M ; 11011000 B: mm7286 pshufw mm7, mm7, 0d8h ; p o n m P O N M ; 11011000 B: mm7
287 287
288 ; to handle mm4, mm5, mm6, mm7288 ; to handle mm4, mm5, mm6, mm7
289 movq mm0, mm4 ;289 movq mm0, mm4 ;
290 punpckldq mm0, mm5 ; H G F E D C B A290 punpckldq mm0, mm5 ; H G F E D C B A
291 punpckhdq mm4, mm5 ; h g f e d c b a291 punpckhdq mm4, mm5 ; h g f e d c b a
292 292
293 movq mm1, mm6293 movq mm1, mm6
294 punpckldq mm1, mm7 ; P O N M L K J I294 punpckldq mm1, mm7 ; P O N M L K J I
295 punpckhdq mm6, mm7 ; p o n m l k j i295 punpckhdq mm6, mm7 ; p o n m l k j i
296 296
297 ; avg within MB horizon width (16 x 2 lines)297 ; avg within MB horizon width (16 x 2 lines)
298 pavgb mm0, mm4 ; (A+a+1)>>1, .., (H+h+1)>>1, temp_row1298 pavgb mm0, mm4 ; (A+a+1)>>1, .., (H+h+1)>>1, temp_row1
299 pavgb mm1, mm6 ; (I+i+1)>>1, .., (P+p+1)>>1, temp_row2299 pavgb mm1, mm6 ; (I+i+1)>>1, .., (P+p+1)>>1, temp_row2
300 pavgb mm0, mm1 ; (temp_row1+temp_row2+1)>>1, pending here and wait another horizonal part done then write memory once300 pavgb mm0, mm1 ; (temp_row1+temp_row2+1)>>1, pending here and wait another horizonal part done then write memory once
301 301
302 movq [edi ], mm0302 movq [edi ], mm0
303 303
304 ; next SMB304 ; next SMB
305 lea esi, [esi+16]305 lea esi, [esi+16]
306 lea edi, [edi+8]306 lea edi, [edi+8]
307 307
308 dec eax308 dec eax
309 jg near .xloops309 jg near .xloops
310 310
311 ; next line311 ; next line
312 lea esi, [esi+2*ecx] ; next end of lines312 lea esi, [esi+2*ecx] ; next end of lines
313 lea esi, [esi+2*ebx] ; reset to base 0 [- 2 * iDstWidth]313 lea esi, [esi+2*ebx] ; reset to base 0 [- 2 * iDstWidth]
314 lea edi, [edi+edx]314 lea edi, [edi+edx]
315 lea edi, [edi+ebx] ; reset to base 0 [- iDstWidth]315 lea edi, [edi+ebx] ; reset to base 0 [- iDstWidth]
316 316
317 dec ebp317 dec ebp
318 jg near .yloops318 jg near .yloops
319 319
320 WELSEMMS320 WELSEMMS
321 pop ebp321 pop ebp
322 pop edi322 pop edi
323 pop esi323 pop esi
324 pop edx324 pop edx
325 pop ebx325 pop ebx
326 ret326 ret
327 327
328;***********************************************************************328;***********************************************************************
329; void DyadicBilinearDownsamplerWidthx8_sse( unsigned char* pDst, const int iDstStride,329; void DyadicBilinearDownsamplerWidthx8_sse( unsigned char* pDst, const int iDstStride,
330; unsigned char* pSrc, const int iSrcStride,330; unsigned char* pSrc, const int iSrcStride,
331; const int iSrcWidth, const int iSrcHeight );331; const int iSrcWidth, const int iSrcHeight );
332;***********************************************************************332;***********************************************************************
333WELS_EXTERN DyadicBilinearDownsamplerWidthx8_sse333WELS_EXTERN DyadicBilinearDownsamplerWidthx8_sse
334 push ebx334 push ebx
335 push edx335 push edx
336 push esi336 push esi
337 push edi337 push edi
338 push ebp338 push ebp
339 339
340 mov edi, [esp+24] ; pDst340 mov edi, [esp+24] ; pDst
341 mov edx, [esp+28] ; iDstStride341 mov edx, [esp+28] ; iDstStride
342 mov esi, [esp+32] ; pSrc342 mov esi, [esp+32] ; pSrc
343 mov ecx, [esp+36] ; iSrcStride343 mov ecx, [esp+36] ; iSrcStride
344 mov ebp, [esp+44] ; iSrcHeight344 mov ebp, [esp+44] ; iSrcHeight
345 345
346 sar ebp, $01 ; iSrcHeight >> 1346 sar ebp, $01 ; iSrcHeight >> 1
347 347
348.yloops:348.yloops:
349 mov eax, [esp+40] ; iSrcWidth349 mov eax, [esp+40] ; iSrcWidth
350 sar eax, $01 ; iSrcWidth >> 1350 sar eax, $01 ; iSrcWidth >> 1
351 mov ebx, eax ; iDstWidth restored at ebx351 mov ebx, eax ; iDstWidth restored at ebx
352 sar eax, $02 ; (iSrcWidth >> 1) / 4 ; loop count = num_of_mb352 sar eax, $02 ; (iSrcWidth >> 1) / 4 ; loop count = num_of_mb
353 neg ebx ; - (iSrcWidth >> 1)353 neg ebx ; - (iSrcWidth >> 1)
354 ; each loop = source bandwidth: 8 bytes354 ; each loop = source bandwidth: 8 bytes
355.xloops:355.xloops:
356 ; 1st part horizonal loop: x8 bytes356 ; 1st part horizonal loop: x8 bytes
357 ; mem hi<- ->lo357 ; mem hi<- ->lo
358 ;1st Line Src: mm0: d D c C b B a A358 ;1st Line Src: mm0: d D c C b B a A
359 ;2nd Line Src: mm1: h H g G f F e E359 ;2nd Line Src: mm1: h H g G f F e E
360 ;=> target:360 ;=> target:
361 ;: H G F E D C B A361 ;: H G F E D C B A
362 ;: h g f e d c b a362 ;: h g f e d c b a
363 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;363 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
364 movq mm0, [esi] ; 1st pSrc line364 movq mm0, [esi] ; 1st pSrc line
365 movq mm1, [esi+ecx] ; 2nd pSrc line365 movq mm1, [esi+ecx] ; 2nd pSrc line
366 366
367 ; to handle mm0, mm1, mm2, mm3367 ; to handle mm0, mm1, mm2, mm3
368 pshufw mm2, mm0, 0d8h ; d D b B c C a A ; 11011000 B368 pshufw mm2, mm0, 0d8h ; d D b B c C a A ; 11011000 B
369 pshufw mm3, mm2, 04eh ; c C a A d D b B ; 01001110 B369 pshufw mm3, mm2, 04eh ; c C a A d D b B ; 01001110 B
370 punpcklbw mm2, mm3 ; d c D C b a B A370 punpcklbw mm2, mm3 ; d c D C b a B A
371 pshufw mm2, mm2, 0d8h ; d c b a D C B A ; 11011000 B: mm4371 pshufw mm2, mm2, 0d8h ; d c b a D C B A ; 11011000 B: mm4
372 372
373 pshufw mm4, mm1, 0d8h ; h H f F g G e E ; 11011000 B373 pshufw mm4, mm1, 0d8h ; h H f F g G e E ; 11011000 B
374 pshufw mm5, mm4, 04eh ; g G e E h H f F ; 01001110 B374 pshufw mm5, mm4, 04eh ; g G e E h H f F ; 01001110 B
375 punpcklbw mm4, mm5 ; h g H G f e F E375 punpcklbw mm4, mm5 ; h g H G f e F E
376 pshufw mm4, mm4, 0d8h ; h g f e H G F E ; 11011000 B: mm5376 pshufw mm4, mm4, 0d8h ; h g f e H G F E ; 11011000 B: mm5
377 377
378 ; to handle mm2, mm4378 ; to handle mm2, mm4
379 movq mm0, mm2 ;379 movq mm0, mm2 ;
380 punpckldq mm0, mm4 ; H G F E D C B A380 punpckldq mm0, mm4 ; H G F E D C B A
381 punpckhdq mm2, mm4 ; h g f e d c b a381 punpckhdq mm2, mm4 ; h g f e d c b a
382 382
383 ; avg within MB horizon width (16 x 2 lines)383 ; avg within MB horizon width (16 x 2 lines)
384 pavgb mm0, mm2 ; (H+h+1)>>1, .., (A+a+1)>>1, temp_row1, 2384 pavgb mm0, mm2 ; (H+h+1)>>1, .., (A+a+1)>>1, temp_row1, 2
385 pshufw mm1, mm0, 04eh ; 01001110 B385 pshufw mm1, mm0, 04eh ; 01001110 B
386 pavgb mm0, mm1 ; (temp_row1+temp_row2+1)>>1, pending here and wait another horizonal part done then write memory once386 pavgb mm0, mm1 ; (temp_row1+temp_row2+1)>>1, pending here and wait another horizonal part done then write memory once
387 387
388 movd [edi], mm0388 movd [edi], mm0
389 389
390 ; next unit390 ; next unit
391 lea esi, [esi+8]391 lea esi, [esi+8]
392 lea edi, [edi+4]392 lea edi, [edi+4]
393 393
394 dec eax394 dec eax
395 jg near .xloops395 jg near .xloops
396 396
397 ; next line397 ; next line
398 lea esi, [esi+2*ecx] ; next end of lines398 lea esi, [esi+2*ecx] ; next end of lines
399 lea esi, [esi+2*ebx] ; reset to base 0 [- 2 * iDstWidth]399 lea esi, [esi+2*ebx] ; reset to base 0 [- 2 * iDstWidth]
400 lea edi, [edi+edx]400 lea edi, [edi+edx]
401 lea edi, [edi+ebx] ; reset to base 0 [- iDstWidth]401 lea edi, [edi+ebx] ; reset to base 0 [- iDstWidth]
402 402
403 dec ebp403 dec ebp
404 jg near .yloops404 jg near .yloops
405 405
406 WELSEMMS406 WELSEMMS
407 pop ebp407 pop ebp
408 pop edi408 pop edi
409 pop esi409 pop esi
410 pop edx410 pop edx
411 pop ebx411 pop ebx
412 ret412 ret
413 413
414 414
415 415
416; got about 50% improvement over DyadicBilinearDownsamplerWidthx32_sse416; got about 50% improvement over DyadicBilinearDownsamplerWidthx32_sse
417;***********************************************************************417;***********************************************************************
418; void DyadicBilinearDownsamplerWidthx32_ssse3( unsigned char* pDst, const int iDstStride,418; void DyadicBilinearDownsamplerWidthx32_ssse3( unsigned char* pDst, const int iDstStride,
419; unsigned char* pSrc, const int iSrcStride,419; unsigned char* pSrc, const int iSrcStride,
420; const int iSrcWidth, const int iSrcHeight );420; const int iSrcWidth, const int iSrcHeight );
421;***********************************************************************421;***********************************************************************
422WELS_EXTERN DyadicBilinearDownsamplerWidthx32_ssse3422WELS_EXTERN DyadicBilinearDownsamplerWidthx32_ssse3
423 push ebx423 push ebx
424 push edx424 push edx
425 push esi425 push esi
426 push edi426 push edi
427 push ebp427 push ebp
428 428
429 mov edi, [esp+24] ; pDst429 mov edi, [esp+24] ; pDst
430 mov edx, [esp+28] ; iDstStride430 mov edx, [esp+28] ; iDstStride
431 mov esi, [esp+32] ; pSrc431 mov esi, [esp+32] ; pSrc
432 mov ecx, [esp+36] ; iSrcStride432 mov ecx, [esp+36] ; iSrcStride
433 mov ebp, [esp+44] ; iSrcHeight433 mov ebp, [esp+44] ; iSrcHeight
434 434
435 sar ebp, $01 ; iSrcHeight >> 1435 sar ebp, $01 ; iSrcHeight >> 1
436 436
437 movdqa xmm7, [shufb_mask_low] ; mask low437 movdqa xmm7, [shufb_mask_low] ; mask low
438 movdqa xmm6, [shufb_mask_high] ; mask high438 movdqa xmm6, [shufb_mask_high] ; mask high
439 439
440.yloops:440.yloops:
441 mov eax, [esp+40] ; iSrcWidth441 mov eax, [esp+40] ; iSrcWidth
442 sar eax, $01 ; iSrcWidth >> 1442 sar eax, $01 ; iSrcWidth >> 1
443 mov ebx, eax ; iDstWidth restored at ebx443 mov ebx, eax ; iDstWidth restored at ebx
444 sar eax, $04 ; (iSrcWidth >> 1) / 16 ; loop count = num_of_mb444 sar eax, $04 ; (iSrcWidth >> 1) / 16 ; loop count = num_of_mb
445 neg ebx ; - (iSrcWidth >> 1)445 neg ebx ; - (iSrcWidth >> 1)
446 ; each loop = source bandwidth: 32 bytes446 ; each loop = source bandwidth: 32 bytes
447.xloops:447.xloops:
448 ; 1st part horizonal loop: x16 bytes448 ; 1st part horizonal loop: x16 bytes
449 ; mem hi<- ->lo449 ; mem hi<- ->lo
450 ;1st Line Src: xmm0: h H g G f F e E d D c C b B a A450 ;1st Line Src: xmm0: h H g G f F e E d D c C b B a A
451 ; xmm1: p P o O n N m M l L k K j J i I451 ; xmm1: p P o O n N m M l L k K j J i I
452 ;2nd Line Src: xmm2: h H g G f F e E d D c C b B a A452 ;2nd Line Src: xmm2: h H g G f F e E d D c C b B a A
453 ; xmm3: p P o O n N m M l L k K j J i I453 ; xmm3: p P o O n N m M l L k K j J i I
454 ;=> target:454 ;=> target:
455 ;: P O N M L K J I H G F E D C B A455 ;: P O N M L K J I H G F E D C B A
456 ;: p o n m l k j i h g f e d c b a456 ;: p o n m l k j i h g f e d c b a
457 ;: P .. A457 ;: P .. A
458 ;: p .. a458 ;: p .. a
459 459
460 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;460 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
461 movdqa xmm0, [esi] ; 1st_src_line461 movdqa xmm0, [esi] ; 1st_src_line
462 movdqa xmm1, [esi+16] ; 1st_src_line + 16462 movdqa xmm1, [esi+16] ; 1st_src_line + 16
463 movdqa xmm2, [esi+ecx] ; 2nd_src_line463 movdqa xmm2, [esi+ecx] ; 2nd_src_line
464 movdqa xmm3, [esi+ecx+16] ; 2nd_src_line + 16464 movdqa xmm3, [esi+ecx+16] ; 2nd_src_line + 16
465 465
466 ; packing & avg466 ; packing & avg
467 movdqa xmm4, xmm0 ; h H g G f F e E d D c C b B a A467 movdqa xmm4, xmm0 ; h H g G f F e E d D c C b B a A
468 pshufb xmm0, xmm7 ; 0 H 0 G 0 F 0 E 0 D 0 C 0 B 0 A468 pshufb xmm0, xmm7 ; 0 H 0 G 0 F 0 E 0 D 0 C 0 B 0 A
469 pshufb xmm4, xmm6 ; 0 h 0 g 0 f 0 e 0 d 0 c 0 b 0 a469 pshufb xmm4, xmm6 ; 0 h 0 g 0 f 0 e 0 d 0 c 0 b 0 a
470 ; another implementation for xmm4 high bits470 ; another implementation for xmm4 high bits
471; psubb xmm4, xmm0 ; h 0 g 0 f 0 e 0 d 0 c 0 b 0 a 0471; psubb xmm4, xmm0 ; h 0 g 0 f 0 e 0 d 0 c 0 b 0 a 0
472; psrlw xmm4, 8 ; 0 h 0 g 0 f 0 e 0 d 0 c 0 b 0 a472; psrlw xmm4, 8 ; 0 h 0 g 0 f 0 e 0 d 0 c 0 b 0 a
473 pavgb xmm0, xmm4473 pavgb xmm0, xmm4
474 474
475 movdqa xmm5, xmm1475 movdqa xmm5, xmm1
476 pshufb xmm1, xmm7476 pshufb xmm1, xmm7
477 pshufb xmm5, xmm6477 pshufb xmm5, xmm6
478; psubb xmm5, xmm1478; psubb xmm5, xmm1
479; psrlw xmm5, 8479; psrlw xmm5, 8
480 pavgb xmm1, xmm5480 pavgb xmm1, xmm5
481 481
482 movdqa xmm4, xmm2482 movdqa xmm4, xmm2
483 pshufb xmm2, xmm7483 pshufb xmm2, xmm7
484 pshufb xmm4, xmm6484 pshufb xmm4, xmm6
485; psubb xmm4, xmm2485; psubb xmm4, xmm2
486; psrlw xmm4, 8486; psrlw xmm4, 8
487 pavgb xmm2, xmm4487 pavgb xmm2, xmm4
488 488
489 movdqa xmm5, xmm3489 movdqa xmm5, xmm3
490 pshufb xmm3, xmm7490 pshufb xmm3, xmm7
491 pshufb xmm5, xmm6491 pshufb xmm5, xmm6
492; psubb xmm5, xmm3492; psubb xmm5, xmm3
493; psrlw xmm5, 8493; psrlw xmm5, 8
494 pavgb xmm3, xmm5494 pavgb xmm3, xmm5
495 495
496 packuswb xmm0, xmm1496 packuswb xmm0, xmm1
497 packuswb xmm2, xmm3497 packuswb xmm2, xmm3
498 pavgb xmm0, xmm2498 pavgb xmm0, xmm2
499 499
500 ; write pDst500 ; write pDst
501 movdqa [edi], xmm0501 movdqa [edi], xmm0
502 502
503 ; next SMB503 ; next SMB
504 lea esi, [esi+32]504 lea esi, [esi+32]
505 lea edi, [edi+16]505 lea edi, [edi+16]
506 506
507 dec eax507 dec eax
508 jg near .xloops508 jg near .xloops
509 509
510 ; next line510 ; next line
511 lea esi, [esi+2*ecx] ; next end of lines511 lea esi, [esi+2*ecx] ; next end of lines
512 lea esi, [esi+2*ebx] ; reset to base 0 [- 2 * iDstWidth]512 lea esi, [esi+2*ebx] ; reset to base 0 [- 2 * iDstWidth]
513 lea edi, [edi+edx]513 lea edi, [edi+edx]
514 lea edi, [edi+ebx] ; reset to base 0 [- iDstWidth]514 lea edi, [edi+ebx] ; reset to base 0 [- iDstWidth]
515 515
516 dec ebp516 dec ebp
517 jg near .yloops517 jg near .yloops
518 518
519 pop ebp519 pop ebp
520 pop edi520 pop edi
521 pop esi521 pop esi
522 pop edx522 pop edx
523 pop ebx523 pop ebx
524 ret524 ret
525 525
526;***********************************************************************526;***********************************************************************
527; void DyadicBilinearDownsamplerWidthx16_ssse3( unsigned char* pDst, const int iDstStride,527; void DyadicBilinearDownsamplerWidthx16_ssse3( unsigned char* pDst, const int iDstStride,
528; unsigned char* pSrc, const int iSrcStride,528; unsigned char* pSrc, const int iSrcStride,
529; const int iSrcWidth, const int iSrcHeight );529; const int iSrcWidth, const int iSrcHeight );
530;***********************************************************************530;***********************************************************************
531WELS_EXTERN DyadicBilinearDownsamplerWidthx16_ssse3531WELS_EXTERN DyadicBilinearDownsamplerWidthx16_ssse3
532 push ebx532 push ebx
533 push edx533 push edx
534 push esi534 push esi
535 push edi535 push edi
536 push ebp536 push ebp
537 537
538 mov edi, [esp+24] ; pDst538 mov edi, [esp+24] ; pDst
539 mov edx, [esp+28] ; iDstStride539 mov edx, [esp+28] ; iDstStride
540 mov esi, [esp+32] ; pSrc540 mov esi, [esp+32] ; pSrc
541 mov ecx, [esp+36] ; iSrcStride541 mov ecx, [esp+36] ; iSrcStride
542 mov ebp, [esp+44] ; iSrcHeight542 mov ebp, [esp+44] ; iSrcHeight
543 543
544 sar ebp, $01 ; iSrcHeight >> 1544 sar ebp, $01 ; iSrcHeight >> 1
545 movdqa xmm7, [shufb_mask_low] ; mask low545 movdqa xmm7, [shufb_mask_low] ; mask low
546 movdqa xmm6, [shufb_mask_high] ; mask high546 movdqa xmm6, [shufb_mask_high] ; mask high
547 547
548.yloops:548.yloops:
549 mov eax, [esp+40] ; iSrcWidth549 mov eax, [esp+40] ; iSrcWidth
550 sar eax, $01 ; iSrcWidth >> 1550 sar eax, $01 ; iSrcWidth >> 1
551 mov ebx, eax ; iDstWidth restored at ebx551 mov ebx, eax ; iDstWidth restored at ebx
552 sar eax, $03 ; (iSrcWidth >> 1) / 8 ; loop count = num_of_mb552 sar eax, $03 ; (iSrcWidth >> 1) / 8 ; loop count = num_of_mb
553 neg ebx ; - (iSrcWidth >> 1)553 neg ebx ; - (iSrcWidth >> 1)
554 ; each loop = source bandwidth: 16 bytes554 ; each loop = source bandwidth: 16 bytes
555.xloops:555.xloops:
556 ; horizonal loop: x16 bytes by source556 ; horizonal loop: x16 bytes by source
557 ; mem hi<- ->lo557 ; mem hi<- ->lo
558 ;1st line pSrc: xmm0: h H g G f F e E d D c C b B a A558 ;1st line pSrc: xmm0: h H g G f F e E d D c C b B a A
559 ;2nd line pSrc: xmm1: p P o O n N m M l L k K j J i I559 ;2nd line pSrc: xmm1: p P o O n N m M l L k K j J i I
560 ;=> target:560 ;=> target:
561 ;: H G F E D C B A, P O N M L K J I561 ;: H G F E D C B A, P O N M L K J I
562 ;: h g f e d c b a, p o n m l k j i562 ;: h g f e d c b a, p o n m l k j i
563 563
564 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;564 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
565 movdqa xmm0, [esi] ; 1st_src_line565 movdqa xmm0, [esi] ; 1st_src_line
566 movdqa xmm1, [esi+ecx] ; 2nd_src_line566 movdqa xmm1, [esi+ecx] ; 2nd_src_line
567 567
568 ; packing & avg568 ; packing & avg
569 movdqa xmm2, xmm0 ; h H g G f F e E d D c C b B a A569 movdqa xmm2, xmm0 ; h H g G f F e E d D c C b B a A
570 pshufb xmm0, xmm7 ; 0 H 0 G 0 F 0 E 0 D 0 C 0 B 0 A570 pshufb xmm0, xmm7 ; 0 H 0 G 0 F 0 E 0 D 0 C 0 B 0 A
571 pshufb xmm2, xmm6 ; 0 h 0 g 0 f 0 e 0 d 0 c 0 b 0 a571 pshufb xmm2, xmm6 ; 0 h 0 g 0 f 0 e 0 d 0 c 0 b 0 a
572 ; another implementation for xmm2 high bits572 ; another implementation for xmm2 high bits
573; psubb xmm2, xmm0 ; h 0 g 0 f 0 e 0 d 0 c 0 b 0 a 0573; psubb xmm2, xmm0 ; h 0 g 0 f 0 e 0 d 0 c 0 b 0 a 0
574; psrlw xmm2, 8 ; 0 h 0 g 0 f 0 e 0 d 0 c 0 b 0 a574; psrlw xmm2, 8 ; 0 h 0 g 0 f 0 e 0 d 0 c 0 b 0 a
575 pavgb xmm0, xmm2575 pavgb xmm0, xmm2
576 576
577 movdqa xmm3, xmm1577 movdqa xmm3, xmm1
578 pshufb xmm1, xmm7578 pshufb xmm1, xmm7
579 pshufb xmm3, xmm6579 pshufb xmm3, xmm6
580; psubb xmm3, xmm1580; psubb xmm3, xmm1
581; psrlw xmm3, 8581; psrlw xmm3, 8
582 pavgb xmm1, xmm3582 pavgb xmm1, xmm3
583 583
584 pavgb xmm0, xmm1584 pavgb xmm0, xmm1
585 packuswb xmm0, xmm1585 packuswb xmm0, xmm1
586 586
587 ; write pDst587 ; write pDst
588 movq [edi], xmm0588 movq [edi], xmm0
589 589
590 ; next SMB590 ; next SMB
591 lea esi, [esi+16]591 lea esi, [esi+16]
592 lea edi, [edi+8]592 lea edi, [edi+8]
593 593
594 dec eax594 dec eax
595 jg near .xloops595 jg near .xloops
596 596
597 ; next line597 ; next line
598 lea esi, [esi+2*ecx] ; next end of lines598 lea esi, [esi+2*ecx] ; next end of lines
599 lea esi, [esi+2*ebx] ; reset to base 0 [- 2 * iDstWidth]599 lea esi, [esi+2*ebx] ; reset to base 0 [- 2 * iDstWidth]
600 lea edi, [edi+edx]600 lea edi, [edi+edx]
601 lea edi, [edi+ebx] ; reset to base 0 [- iDstWidth]601 lea edi, [edi+ebx] ; reset to base 0 [- iDstWidth]
602 602
603 dec ebp603 dec ebp
604 jg near .yloops604 jg near .yloops
605 605
606 pop ebp606 pop ebp
607 pop edi607 pop edi
608 pop esi608 pop esi
609 pop edx609 pop edx
610 pop ebx610 pop ebx
611 ret611 ret
612 612
613; got about 65% improvement over DyadicBilinearDownsamplerWidthx32_sse613; got about 65% improvement over DyadicBilinearDownsamplerWidthx32_sse
614;***********************************************************************614;***********************************************************************
615; void DyadicBilinearDownsamplerWidthx32_sse4( unsigned char* pDst, const int iDstStride,615; void DyadicBilinearDownsamplerWidthx32_sse4( unsigned char* pDst, const int iDstStride,
616; unsigned char* pSrc, const int iSrcStride,616; unsigned char* pSrc, const int iSrcStride,
617; const int iSrcWidth, const int iSrcHeight );617; const int iSrcWidth, const int iSrcHeight );
618;***********************************************************************618;***********************************************************************
619WELS_EXTERN DyadicBilinearDownsamplerWidthx32_sse4619WELS_EXTERN DyadicBilinearDownsamplerWidthx32_sse4
620 push ebx620 push ebx
621 push edx621 push edx
622 push esi622 push esi
623 push edi623 push edi
624 push ebp624 push ebp
625 625
626 mov edi, [esp+24] ; pDst626 mov edi, [esp+24] ; pDst
627 mov edx, [esp+28] ; iDstStride627 mov edx, [esp+28] ; iDstStride
628 mov esi, [esp+32] ; pSrc628 mov esi, [esp+32] ; pSrc
629 mov ecx, [esp+36] ; iSrcStride629 mov ecx, [esp+36] ; iSrcStride
630 mov ebp, [esp+44] ; iSrcHeight630 mov ebp, [esp+44] ; iSrcHeight
631 631
632 sar ebp, $01 ; iSrcHeight >> 1632 sar ebp, $01 ; iSrcHeight >> 1
633 633
634 movdqa xmm7, [shufb_mask_low] ; mask low634 movdqa xmm7, [shufb_mask_low] ; mask low
635 movdqa xmm6, [shufb_mask_high] ; mask high635 movdqa xmm6, [shufb_mask_high] ; mask high
636 636
637.yloops:637.yloops:
638 mov eax, [esp+40] ; iSrcWidth638 mov eax, [esp+40] ; iSrcWidth
639 sar eax, $01 ; iSrcWidth >> 1639 sar eax, $01 ; iSrcWidth >> 1
640 mov ebx, eax ; iDstWidth restored at ebx640 mov ebx, eax ; iDstWidth restored at ebx
641 sar eax, $04 ; (iSrcWidth >> 1) / 16 ; loop count = num_of_mb641 sar eax, $04 ; (iSrcWidth >> 1) / 16 ; loop count = num_of_mb
642 neg ebx ; - (iSrcWidth >> 1)642 neg ebx ; - (iSrcWidth >> 1)
643 ; each loop = source bandwidth: 32 bytes643 ; each loop = source bandwidth: 32 bytes
644.xloops:644.xloops:
645 ; 1st part horizonal loop: x16 bytes645 ; 1st part horizonal loop: x16 bytes
646 ; mem hi<- ->lo646 ; mem hi<- ->lo
647 ;1st Line Src: xmm0: h H g G f F e E d D c C b B a A647 ;1st Line Src: xmm0: h H g G f F e E d D c C b B a A
648 ; xmm1: p P o O n N m M l L k K j J i I648 ; xmm1: p P o O n N m M l L k K j J i I
649 ;2nd Line Src: xmm2: h H g G f F e E d D c C b B a A649 ;2nd Line Src: xmm2: h H g G f F e E d D c C b B a A
650 ; xmm3: p P o O n N m M l L k K j J i I650 ; xmm3: p P o O n N m M l L k K j J i I
651 ;=> target:651 ;=> target:
652 ;: P O N M L K J I H G F E D C B A652 ;: P O N M L K J I H G F E D C B A
653 ;: p o n m l k j i h g f e d c b a653 ;: p o n m l k j i h g f e d c b a
654 ;: P .. A654 ;: P .. A
655 ;: p .. a655 ;: p .. a
656 656
657 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;657 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
658 movntdqa xmm0, [esi] ; 1st_src_line658 movntdqa xmm0, [esi] ; 1st_src_line
659 movntdqa xmm1, [esi+16] ; 1st_src_line + 16659 movntdqa xmm1, [esi+16] ; 1st_src_line + 16
660 movntdqa xmm2, [esi+ecx] ; 2nd_src_line660 movntdqa xmm2, [esi+ecx] ; 2nd_src_line
661 movntdqa xmm3, [esi+ecx+16] ; 2nd_src_line + 16661 movntdqa xmm3, [esi+ecx+16] ; 2nd_src_line + 16
662 662
663 ; packing & avg663 ; packing & avg
664 movdqa xmm4, xmm0 ; h H g G f F e E d D c C b B a A664 movdqa xmm4, xmm0 ; h H g G f F e E d D c C b B a A
665 pshufb xmm0, xmm7 ; 0 H 0 G 0 F 0 E 0 D 0 C 0 B 0 A665 pshufb xmm0, xmm7 ; 0 H 0 G 0 F 0 E 0 D 0 C 0 B 0 A
666 pshufb xmm4, xmm6 ; 0 h 0 g 0 f 0 e 0 d 0 c 0 b 0 a666 pshufb xmm4, xmm6 ; 0 h 0 g 0 f 0 e 0 d 0 c 0 b 0 a
667; psubb xmm4, xmm0 ; h 0 g 0 f 0 e 0 d 0 c 0 b 0 a 0667; psubb xmm4, xmm0 ; h 0 g 0 f 0 e 0 d 0 c 0 b 0 a 0
668; psrlw xmm4, 8 ; 0 h 0 g 0 f 0 e 0 d 0 c 0 b 0 a668; psrlw xmm4, 8 ; 0 h 0 g 0 f 0 e 0 d 0 c 0 b 0 a
669 pavgb xmm0, xmm4669 pavgb xmm0, xmm4
670 670
671 movdqa xmm5, xmm1671 movdqa xmm5, xmm1
672 pshufb xmm1, xmm7672 pshufb xmm1, xmm7
673 pshufb xmm5, xmm6673 pshufb xmm5, xmm6
674; psubb xmm5, xmm1674; psubb xmm5, xmm1
675; psrlw xmm5, 8675; psrlw xmm5, 8
676 pavgb xmm1, xmm5676 pavgb xmm1, xmm5
677 677
678 movdqa xmm4, xmm2678 movdqa xmm4, xmm2
679 pshufb xmm2, xmm7679 pshufb xmm2, xmm7
680 pshufb xmm4, xmm6680 pshufb xmm4, xmm6
681; psubb xmm4, xmm2681; psubb xmm4, xmm2
682; psrlw xmm4, 8682; psrlw xmm4, 8
683 pavgb xmm2, xmm4683 pavgb xmm2, xmm4
684 684
685 movdqa xmm5, xmm3685 movdqa xmm5, xmm3
686 pshufb xmm3, xmm7686 pshufb xmm3, xmm7
687 pshufb xmm5, xmm6687 pshufb xmm5, xmm6
688; psubb xmm5, xmm3688; psubb xmm5, xmm3
689; psrlw xmm5, 8689; psrlw xmm5, 8
690 pavgb xmm3, xmm5690 pavgb xmm3, xmm5
691 691
692 packuswb xmm0, xmm1692 packuswb xmm0, xmm1
693 packuswb xmm2, xmm3693 packuswb xmm2, xmm3
694 pavgb xmm0, xmm2694 pavgb xmm0, xmm2
695 695
696 ; write pDst696 ; write pDst
697 movdqa [edi], xmm0697 movdqa [edi], xmm0
698 698
699 ; next SMB699 ; next SMB
700 lea esi, [esi+32]700 lea esi, [esi+32]
701 lea edi, [edi+16]701 lea edi, [edi+16]
702 702
703 dec eax703 dec eax
704 jg near .xloops704 jg near .xloops
705 705
706 ; next line706 ; next line
707 lea esi, [esi+2*ecx] ; next end of lines707 lea esi, [esi+2*ecx] ; next end of lines
708 lea esi, [esi+2*ebx] ; reset to base 0 [- 2 * iDstWidth]708 lea esi, [esi+2*ebx] ; reset to base 0 [- 2 * iDstWidth]
709 lea edi, [edi+edx]709 lea edi, [edi+edx]
710 lea edi, [edi+ebx] ; reset to base 0 [- iDstWidth]710 lea edi, [edi+ebx] ; reset to base 0 [- iDstWidth]
711 711
712 dec ebp712 dec ebp
713 jg near .yloops713 jg near .yloops
714 714
715 pop ebp715 pop ebp
716 pop edi716 pop edi
717 pop esi717 pop esi
718 pop edx718 pop edx
719 pop ebx719 pop ebx
720 ret720 ret
721 721
722;***********************************************************************722;***********************************************************************
723; void DyadicBilinearDownsamplerWidthx16_sse4( unsigned char* pDst, const int iDstStride,723; void DyadicBilinearDownsamplerWidthx16_sse4( unsigned char* pDst, const int iDstStride,
724; unsigned char* pSrc, const int iSrcStride,724; unsigned char* pSrc, const int iSrcStride,
725; const int iSrcWidth, const int iSrcHeight );725; const int iSrcWidth, const int iSrcHeight );
726;***********************************************************************726;***********************************************************************
727WELS_EXTERN DyadicBilinearDownsamplerWidthx16_sse4727WELS_EXTERN DyadicBilinearDownsamplerWidthx16_sse4
728 push ebx728 push ebx
729 push edx729 push edx
730 push esi730 push esi
731 push edi731 push edi
732 push ebp732 push ebp
733 733
734 mov edi, [esp+24] ; pDst734 mov edi, [esp+24] ; pDst
735 mov edx, [esp+28] ; iDstStride735 mov edx, [esp+28] ; iDstStride
736 mov esi, [esp+32] ; pSrc736 mov esi, [esp+32] ; pSrc
737 mov ecx, [esp+36] ; iSrcStride737 mov ecx, [esp+36] ; iSrcStride
738 mov ebp, [esp+44] ; iSrcHeight738 mov ebp, [esp+44] ; iSrcHeight
739 739
740 sar ebp, $01 ; iSrcHeight >> 1740 sar ebp, $01 ; iSrcHeight >> 1
741 movdqa xmm7, [shufb_mask_low] ; mask low741 movdqa xmm7, [shufb_mask_low] ; mask low
742 movdqa xmm6, [shufb_mask_high] ; mask high742 movdqa xmm6, [shufb_mask_high] ; mask high
743 743
744.yloops:744.yloops:
745 mov eax, [esp+40] ; iSrcWidth745 mov eax, [esp+40] ; iSrcWidth
746 sar eax, $01 ; iSrcWidth >> 1746 sar eax, $01 ; iSrcWidth >> 1
747 mov ebx, eax ; iDstWidth restored at ebx747 mov ebx, eax ; iDstWidth restored at ebx
748 sar eax, $03 ; (iSrcWidth >> 1) / 8 ; loop count = num_of_mb748 sar eax, $03 ; (iSrcWidth >> 1) / 8 ; loop count = num_of_mb
749 neg ebx ; - (iSrcWidth >> 1)749 neg ebx ; - (iSrcWidth >> 1)
750 ; each loop = source bandwidth: 16 bytes750 ; each loop = source bandwidth: 16 bytes
751.xloops:751.xloops:
752 ; horizonal loop: x16 bytes by source752 ; horizonal loop: x16 bytes by source
753 ; mem hi<- ->lo753 ; mem hi<- ->lo
754 ;1st line pSrc: xmm0: h H g G f F e E d D c C b B a A754 ;1st line pSrc: xmm0: h H g G f F e E d D c C b B a A
755 ;2nd line pSrc: xmm1: p P o O n N m M l L k K j J i I755 ;2nd line pSrc: xmm1: p P o O n N m M l L k K j J i I
756 ;=> target:756 ;=> target:
757 ;: H G F E D C B A, P O N M L K J I757 ;: H G F E D C B A, P O N M L K J I
758 ;: h g f e d c b a, p o n m l k j i758 ;: h g f e d c b a, p o n m l k j i
759 759
760 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;760 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
761 movntdqa xmm0, [esi] ; 1st_src_line761 movntdqa xmm0, [esi] ; 1st_src_line
762 movntdqa xmm1, [esi+ecx] ; 2nd_src_line762 movntdqa xmm1, [esi+ecx] ; 2nd_src_line
763 763
764 ; packing & avg764 ; packing & avg
765 movdqa xmm2, xmm0 ; h H g G f F e E d D c C b B a A765 movdqa xmm2, xmm0 ; h H g G f F e E d D c C b B a A
766 pshufb xmm0, xmm7 ; 0 H 0 G 0 F 0 E 0 D 0 C 0 B 0 A766 pshufb xmm0, xmm7 ; 0 H 0 G 0 F 0 E 0 D 0 C 0 B 0 A
767 pshufb xmm2, xmm6 ; 0 h 0 g 0 f 0 e 0 d 0 c 0 b 0 a767 pshufb xmm2, xmm6 ; 0 h 0 g 0 f 0 e 0 d 0 c 0 b 0 a
768; psubb xmm2, xmm0 ; h 0 g 0 f 0 e 0 d 0 c 0 b 0 a 0768; psubb xmm2, xmm0 ; h 0 g 0 f 0 e 0 d 0 c 0 b 0 a 0
769; psrlw xmm2, 8 ; 0 h 0 g 0 f 0 e 0 d 0 c 0 b 0 a769; psrlw xmm2, 8 ; 0 h 0 g 0 f 0 e 0 d 0 c 0 b 0 a
770 pavgb xmm0, xmm2770 pavgb xmm0, xmm2
771 771
772 movdqa xmm3, xmm1772 movdqa xmm3, xmm1
773 pshufb xmm1, xmm7773 pshufb xmm1, xmm7
774 pshufb xmm3, xmm6774 pshufb xmm3, xmm6
775; psubb xmm3, xmm1775; psubb xmm3, xmm1
776; psrlw xmm3, 8776; psrlw xmm3, 8
777 pavgb xmm1, xmm3777 pavgb xmm1, xmm3
778 778
779 pavgb xmm0, xmm1779 pavgb xmm0, xmm1
780 packuswb xmm0, xmm1780 packuswb xmm0, xmm1
781 781
782 ; write pDst782 ; write pDst
783 movq [edi], xmm0783 movq [edi], xmm0
784 784
785 ; next SMB785 ; next SMB
786 lea esi, [esi+16]786 lea esi, [esi+16]
787 lea edi, [edi+8]787 lea edi, [edi+8]
788 788
789 dec eax789 dec eax
790 jg near .xloops790 jg near .xloops
791 791
792 ; next line792 ; next line
793 lea esi, [esi+2*ecx] ; next end of lines793 lea esi, [esi+2*ecx] ; next end of lines
794 lea esi, [esi+2*ebx] ; reset to base 0 [- 2 * iDstWidth]794 lea esi, [esi+2*ebx] ; reset to base 0 [- 2 * iDstWidth]
795 lea edi, [edi+edx]795 lea edi, [edi+edx]
796 lea edi, [edi+ebx] ; reset to base 0 [- iDstWidth]796 lea edi, [edi+ebx] ; reset to base 0 [- iDstWidth]
797 797
798 dec ebp798 dec ebp
799 jg near .yloops799 jg near .yloops
800 800
801 pop ebp801 pop ebp
802 pop edi802 pop edi
803 pop esi803 pop esi
804 pop edx804 pop edx
805 pop ebx805 pop ebx
806 ret806 ret
807 807
808 808
809 809
@@ -811,395 +811,395 @@ WELS_EXTERN DyadicBilinearDownsamplerWidthx16_sse4 · 1 unmodified line
811 811
812;**************************************************************************************************************812;**************************************************************************************************************
813;int GeneralBilinearAccurateDownsampler_sse2( unsigned char* pDst, const int iDstStride, const int iDstWidth, const int iDstHeight,813;int GeneralBilinearAccurateDownsampler_sse2( unsigned char* pDst, const int iDstStride, const int iDstWidth, const int iDstHeight,
814; unsigned char* pSrc, const int iSrcStride, const int iSrcWidth, const int iSrcHeight,814; unsigned char* pSrc, const int iSrcStride, const int iSrcWidth, const int iSrcHeight,
815; unsigned int uiScaleX, unsigned int uiScaleY );815; unsigned int uiScaleX, unsigned int uiScaleY );
816;{816;{
817;**************************************************************************************************************817;**************************************************************************************************************
818 818
819WELS_EXTERN GeneralBilinearAccurateDownsampler_sse2819WELS_EXTERN GeneralBilinearAccurateDownsampler_sse2
820 push ebp820 push ebp
821 push esi821 push esi
822 push edi822 push edi
823 push ebx823 push ebx
824%define pushsize 16824%define pushsize 16
825%define localsize 28825%define localsize 28
826%define pDstData esp + pushsize + localsize + 4826%define pDstData esp + pushsize + localsize + 4
827%define dwDstStride esp + pushsize + localsize + 8827%define dwDstStride esp + pushsize + localsize + 8
828%define dwDstWidth esp + pushsize + localsize + 12828%define dwDstWidth esp + pushsize + localsize + 12
829%define dwDstHeight esp + pushsize + localsize + 16829%define dwDstHeight esp + pushsize + localsize + 16
830%define pSrcData esp + pushsize + localsize + 20830%define pSrcData esp + pushsize + localsize + 20
831%define dwSrcStride esp + pushsize + localsize + 24831%define dwSrcStride esp + pushsize + localsize + 24
832%define dwSrcWidth esp + pushsize + localsize + 28832%define dwSrcWidth esp + pushsize + localsize + 28
833%define dwSrcHeight esp + pushsize + localsize + 32833%define dwSrcHeight esp + pushsize + localsize + 32
834%define scale esp + 0834%define scale esp + 0
835%define uiScaleX esp + pushsize + localsize + 36835%define uiScaleX esp + pushsize + localsize + 36
836%define uiScaleY esp + pushsize + localsize + 40836%define uiScaleY esp + pushsize + localsize + 40
837%define tmpHeight esp + 12837%define tmpHeight esp + 12
838%define yInverse esp + 16838%define yInverse esp + 16
839%define xInverse esp + 20839%define xInverse esp + 20
840%define dstStep esp + 24840%define dstStep esp + 24
841 sub esp, localsize841 sub esp, localsize
842 842
843 pxor xmm0, xmm0843 pxor xmm0, xmm0
844 mov edx, 32767844 mov edx, 32767
845 mov eax, [uiScaleX]845 mov eax, [uiScaleX]
846 and eax, 32767846 and eax, 32767
847 mov ebx, eax847 mov ebx, eax
848 neg ebx848 neg ebx
849 and ebx, 32767849 and ebx, 32767
850 movd xmm1, eax ; uinc(uiScaleX mod 32767)850 movd xmm1, eax ; uinc(uiScaleX mod 32767)
851 movd xmm2, ebx ; -uinc851 movd xmm2, ebx ; -uinc
852 psllq xmm1, 32852 psllq xmm1, 32
853 por xmm1, xmm2 ; 0 0 uinc -uinc (dword)853 por xmm1, xmm2 ; 0 0 uinc -uinc (dword)
854 pshufd xmm7, xmm1, 01000100b ; xmm7: uinc -uinc uinc -uinc854 pshufd xmm7, xmm1, 01000100b ; xmm7: uinc -uinc uinc -uinc
855 855
856 mov eax, [uiScaleY]856 mov eax, [uiScaleY]
857 and eax, 32767857 and eax, 32767
858 mov ebx, eax858 mov ebx, eax
859 neg ebx859 neg ebx
860 and ebx, 32767860 and ebx, 32767
861 movd xmm6, eax ; vinc(uiScaleY mod 32767)861 movd xmm6, eax ; vinc(uiScaleY mod 32767)
862 movd xmm2, ebx ; -vinc862 movd xmm2, ebx ; -vinc
863 psllq xmm6, 32863 psllq xmm6, 32
864 por xmm6, xmm2 ; 0 0 vinc -vinc (dword)864 por xmm6, xmm2 ; 0 0 vinc -vinc (dword)
865 pshufd xmm6, xmm6, 01010000b ; xmm6: vinc vinc -vinc -vinc865 pshufd xmm6, xmm6, 01010000b ; xmm6: vinc vinc -vinc -vinc
866 866
867 mov edx, 40003fffh867 mov edx, 40003fffh
868 movd xmm5, edx868 movd xmm5, edx
869 punpcklwd xmm5, xmm0 ; 16384 16383869 punpcklwd xmm5, xmm0 ; 16384 16383
870 pshufd xmm5, xmm5, 01000100b ; xmm5: 16384 16383 16384 16383870 pshufd xmm5, xmm5, 01000100b ; xmm5: 16384 16383 16384 16383
871 871
872 872
873DOWNSAMPLE:873DOWNSAMPLE:
874 874
875 mov eax, [dwDstHeight]875 mov eax, [dwDstHeight]
876 mov edi, [pDstData]876 mov edi, [pDstData]
877 mov edx, [dwDstStride]877 mov edx, [dwDstStride]
878 mov ecx, [dwDstWidth]878 mov ecx, [dwDstWidth]
879 sub edx, ecx879 sub edx, ecx
880 mov [dstStep], edx ; stride - width880 mov [dstStep], edx ; stride - width
881 dec eax881 dec eax
882 mov [tmpHeight], eax882 mov [tmpHeight], eax
883 mov eax, 16384883 mov eax, 16384
884 mov [yInverse], eax884 mov [yInverse], eax
885 885
886 pshufd xmm4, xmm5, 01010000b ; initial v to 16384 16384 16383 16383886 pshufd xmm4, xmm5, 01010000b ; initial v to 16384 16384 16383 16383
887 887
888HEIGHT:888HEIGHT:
889 mov eax, [yInverse]889 mov eax, [yInverse]
890 mov esi, [pSrcData]890 mov esi, [pSrcData]
891 shr eax, 15891 shr eax, 15
892 mul dword [dwSrcStride]892 mul dword [dwSrcStride]
893 add esi, eax ; get current row address893 add esi, eax ; get current row address
894 mov ebp, esi894 mov ebp, esi
895 add ebp, [dwSrcStride]895 add ebp, [dwSrcStride]
896 896
897 mov eax, 16384897 mov eax, 16384
898 mov [xInverse], eax898 mov [xInverse], eax
899 mov ecx, [dwDstWidth]899 mov ecx, [dwDstWidth]
900 dec ecx900 dec ecx
901 901
902 movdqa xmm3, xmm5 ; initial u to 16384 16383 16384 16383902 movdqa xmm3, xmm5 ; initial u to 16384 16383 16384 16383
903 903
904WIDTH:904WIDTH:
905 mov eax, [xInverse]905 mov eax, [xInverse]
906 shr eax, 15906 shr eax, 15
907 907
908 movd xmm1, [esi+eax] ; xxxxxxba908 movd xmm1, [esi+eax] ; xxxxxxba
909 movd xmm2, [ebp+eax] ; xxxxxxdc909 movd xmm2, [ebp+eax] ; xxxxxxdc
910 pxor xmm0, xmm0910 pxor xmm0, xmm0
911 punpcklwd xmm1, xmm2 ; xxxxdcba911 punpcklwd xmm1, xmm2 ; xxxxdcba
912 punpcklbw xmm1, xmm0 ; 0d0c0b0a912 punpcklbw xmm1, xmm0 ; 0d0c0b0a
913 punpcklwd xmm1, xmm0 ; 000d000c000b000a913 punpcklwd xmm1, xmm0 ; 000d000c000b000a
914 914
915 movdqa xmm2, xmm4 ; xmm2: vv(1-v)(1-v) tmpv915 movdqa xmm2, xmm4 ; xmm2: vv(1-v)(1-v) tmpv
916 pmaddwd xmm2, xmm3 ; mul u(1-u)u(1-u) on xmm2916 pmaddwd xmm2, xmm3 ; mul u(1-u)u(1-u) on xmm2
917 movdqa xmm0, xmm2917 movdqa xmm0, xmm2
918 pmuludq xmm2, xmm1918 pmuludq xmm2, xmm1
919 psrlq xmm0, 32919 psrlq xmm0, 32
920 psrlq xmm1, 32920 psrlq xmm1, 32
921 pmuludq xmm0, xmm1921 pmuludq xmm0, xmm1
922 paddq xmm2, xmm0922 paddq xmm2, xmm0
923 pshufd xmm1, xmm2, 00001110b923 pshufd xmm1, xmm2, 00001110b
924 paddq xmm2, xmm1924 paddq xmm2, xmm1
925 psrlq xmm2, 29925 psrlq xmm2, 29
926 926
927 movd eax, xmm2927 movd eax, xmm2
928 inc eax928 inc eax
929 shr eax, 1929 shr eax, 1
930 mov [edi], al930 mov [edi], al
931 inc edi931 inc edi
932 932
933 mov eax, [uiScaleX]933 mov eax, [uiScaleX]
934 add [xInverse], eax934 add [xInverse], eax
935 935
936 paddw xmm3, xmm7 ; inc u936 paddw xmm3, xmm7 ; inc u
937 psllw xmm3, 1937 psllw xmm3, 1
938 psrlw xmm3, 1938 psrlw xmm3, 1
939 939
940 loop WIDTH940 loop WIDTH
941 941
942WIDTH_END:942WIDTH_END:
943 mov eax, [xInverse]943 mov eax, [xInverse]
944 shr eax, 15944 shr eax, 15
945 mov cl, [esi+eax]945 mov cl, [esi+eax]
946 mov [edi], cl946 mov [edi], cl
947 inc edi947 inc edi
948 948
949 mov eax, [uiScaleY]949 mov eax, [uiScaleY]
950 add [yInverse], eax950 add [yInverse], eax
951 add edi, [dstStep]951 add edi, [dstStep]
952 952
953 paddw xmm4, xmm6 ; inc v953 paddw xmm4, xmm6 ; inc v
954 psllw xmm4, 1954 psllw xmm4, 1
955 psrlw xmm4, 1955 psrlw xmm4, 1
956 956
957 dec dword [tmpHeight]957 dec dword [tmpHeight]
958 jg HEIGHT958 jg HEIGHT
959 959
960 960
961LAST_ROW:961LAST_ROW:
962 mov eax, [yInverse]962 mov eax, [yInverse]
963 mov esi, [pSrcData]963 mov esi, [pSrcData]
964 shr eax, 15964 shr eax, 15
965 mul dword [dwSrcStride]965 mul dword [dwSrcStride]
966 add esi, eax ; get current row address966 add esi, eax ; get current row address
967 967
968 mov eax, 16384968 mov eax, 16384
969 mov [xInverse], eax969 mov [xInverse], eax
970 mov ecx, [dwDstWidth]970 mov ecx, [dwDstWidth]
971 971
972LAST_ROW_WIDTH:972LAST_ROW_WIDTH:
973 mov eax, [xInverse]973 mov eax, [xInverse]
974 shr eax, 15974 shr eax, 15
975 975
976 mov al, [esi+eax]976 mov al, [esi+eax]
977 mov [edi], al977 mov [edi], al
978 inc edi978 inc edi
979 979
980 mov eax, [uiScaleX]980 mov eax, [uiScaleX]
981 add [xInverse], eax981 add [xInverse], eax
982 982
983 loop LAST_ROW_WIDTH983 loop LAST_ROW_WIDTH
984 984
985LAST_ROW_END:985LAST_ROW_END:
986 986
987 add esp, localsize987 add esp, localsize
988 pop ebx988 pop ebx
989 pop edi989 pop edi
990 pop esi990 pop esi
991 pop ebp991 pop ebp
992%undef pushsize992%undef pushsize
993%undef localsize993%undef localsize
994%undef pSrcData994%undef pSrcData
995%undef dwSrcWidth995%undef dwSrcWidth
996%undef dwSrcHeight996%undef dwSrcHeight
997%undef dwSrcStride997%undef dwSrcStride
998%undef pDstData998%undef pDstData
999%undef dwDstWidth999%undef dwDstWidth
1000%undef dwDstHeight1000%undef dwDstHeight
1001%undef dwDstStride1001%undef dwDstStride
1002%undef scale1002%undef scale
1003%undef uiScaleX1003%undef uiScaleX
1004%undef uiScaleY1004%undef uiScaleY
1005%undef tmpHeight1005%undef tmpHeight
1006%undef yInverse1006%undef yInverse
1007%undef xInverse1007%undef xInverse
1008%undef dstStep1008%undef dstStep
1009 ret1009 ret
1010 1010
1011 1011
1012 1012
1013 1013
1014;**************************************************************************************************************1014;**************************************************************************************************************
1015;int GeneralBilinearFastDownsampler_sse2( unsigned char* pDst, const int iDstStride, const int iDstWidth, const int iDstHeight,1015;int GeneralBilinearFastDownsampler_sse2( unsigned char* pDst, const int iDstStride, const int iDstWidth, const int iDstHeight,
1016; unsigned char* pSrc, const int iSrcStride, const int iSrcWidth, const int iSrcHeight,1016; unsigned char* pSrc, const int iSrcStride, const int iSrcWidth, const int iSrcHeight,
1017; unsigned int uiScaleX, unsigned int uiScaleY );1017; unsigned int uiScaleX, unsigned int uiScaleY );
1018;{1018;{
1019;**************************************************************************************************************1019;**************************************************************************************************************
1020 1020
1021WELS_EXTERN GeneralBilinearFastDownsampler_sse21021WELS_EXTERN GeneralBilinearFastDownsampler_sse2
1022 push ebp1022 push ebp
1023 push esi1023 push esi
1024 push edi1024 push edi
1025 push ebx1025 push ebx
1026%define pushsize 161026%define pushsize 16
1027%define localsize 281027%define localsize 28
1028%define pDstData esp + pushsize + localsize + 41028%define pDstData esp + pushsize + localsize + 4
1029%define dwDstStride esp + pushsize + localsize + 81029%define dwDstStride esp + pushsize + localsize + 8
1030%define dwDstWidth esp + pushsize + localsize + 121030%define dwDstWidth esp + pushsize + localsize + 12
1031%define dwDstHeight esp + pushsize + localsize + 161031%define dwDstHeight esp + pushsize + localsize + 16
1032%define pSrcData esp + pushsize + localsize + 201032%define pSrcData esp + pushsize + localsize + 20
1033%define dwSrcStride esp + pushsize + localsize + 241033%define dwSrcStride esp + pushsize + localsize + 24
1034%define dwSrcWidth esp + pushsize + localsize + 281034%define dwSrcWidth esp + pushsize + localsize + 28
1035%define dwSrcHeight esp + pushsize + localsize + 321035%define dwSrcHeight esp + pushsize + localsize + 32
1036%define scale esp + 01036%define scale esp + 0
1037%define uiScaleX esp + pushsize + localsize + 361037%define uiScaleX esp + pushsize + localsize + 36
1038%define uiScaleY esp + pushsize + localsize + 401038%define uiScaleY esp + pushsize + localsize + 40
1039%define tmpHeight esp + 121039%define tmpHeight esp + 12
1040%define yInverse esp + 161040%define yInverse esp + 16
1041%define xInverse esp + 201041%define xInverse esp + 20
1042%define dstStep esp + 241042%define dstStep esp + 24
1043 sub esp, localsize1043 sub esp, localsize
1044 1044
1045 pxor xmm0, xmm01045 pxor xmm0, xmm0
1046 mov edx, 655351046 mov edx, 65535
1047 mov eax, [uiScaleX]1047 mov eax, [uiScaleX]
1048 and eax, edx1048 and eax, edx
1049 mov ebx, eax1049 mov ebx, eax
1050 neg ebx1050 neg ebx
1051 and ebx, 655351051 and ebx, 65535
1052 movd xmm1, eax ; uinc(uiScaleX mod 65536)1052 movd xmm1, eax ; uinc(uiScaleX mod 65536)
1053 movd xmm2, ebx ; -uinc1053 movd xmm2, ebx ; -uinc
1054 psllq xmm1, 321054 psllq xmm1, 32
1055 por xmm1, xmm2 ; 0 uinc 0 -uinc1055 por xmm1, xmm2 ; 0 uinc 0 -uinc
1056 pshuflw xmm7, xmm1, 10001000b ; xmm7: uinc -uinc uinc -uinc1056 pshuflw xmm7, xmm1, 10001000b ; xmm7: uinc -uinc uinc -uinc
1057 1057
1058 mov eax, [uiScaleY]1058 mov eax, [uiScaleY]
1059 and eax, 327671059 and eax, 32767
1060 mov ebx, eax1060 mov ebx, eax
1061 neg ebx1061 neg ebx
1062 and ebx, 327671062 and ebx, 32767
1063 movd xmm6, eax ; vinc(uiScaleY mod 32767)1063 movd xmm6, eax ; vinc(uiScaleY mod 32767)
1064 movd xmm2, ebx ; -vinc1064 movd xmm2, ebx ; -vinc
1065 psllq xmm6, 321065 psllq xmm6, 32
1066 por xmm6, xmm2 ; 0 vinc 0 -vinc1066 por xmm6, xmm2 ; 0 vinc 0 -vinc
1067 pshuflw xmm6, xmm6, 10100000b ; xmm6: vinc vinc -vinc -vinc1067 pshuflw xmm6, xmm6, 10100000b ; xmm6: vinc vinc -vinc -vinc
1068 1068
1069 mov edx, 80007fffh ; 32768 327671069 mov edx, 80007fffh ; 32768 32767
1070 movd xmm5, edx1070 movd xmm5, edx
1071 pshuflw xmm5, xmm5, 01000100b ; 32768 32767 32768 327671071 pshuflw xmm5, xmm5, 01000100b ; 32768 32767 32768 32767
1072 mov ebx, 163841072 mov ebx, 16384
1073 1073
1074 1074
1075FAST_DOWNSAMPLE:1075FAST_DOWNSAMPLE:
1076 1076
1077 mov eax, [dwDstHeight]1077 mov eax, [dwDstHeight]
1078 mov edi, [pDstData]1078 mov edi, [pDstData]
1079 mov edx, [dwDstStride]1079 mov edx, [dwDstStride]
1080 mov ecx, [dwDstWidth]1080 mov ecx, [dwDstWidth]
1081 sub edx, ecx1081 sub edx, ecx
1082 mov [dstStep], edx ; stride - width1082 mov [dstStep], edx ; stride - width
1083 dec eax1083 dec eax
1084 mov [tmpHeight], eax1084 mov [tmpHeight], eax
1085 mov eax, 163841085 mov eax, 16384
1086 mov [yInverse], eax1086 mov [yInverse], eax
1087 1087
1088 pshuflw xmm4, xmm5, 01010000b1088 pshuflw xmm4, xmm5, 01010000b
1089 psrlw xmm4, 1 ; initial v to 16384 16384 16383 163831089 psrlw xmm4, 1 ; initial v to 16384 16384 16383 16383
1090 1090
1091FAST_HEIGHT:1091FAST_HEIGHT:
1092 mov eax, [yInverse]1092 mov eax, [yInverse]
1093 mov esi, [pSrcData]1093 mov esi, [pSrcData]
1094 shr eax, 151094 shr eax, 15
1095 mul dword [dwSrcStride]1095 mul dword [dwSrcStride]
1096 add esi, eax ; get current row address1096 add esi, eax ; get current row address
1097 mov ebp, esi1097 mov ebp, esi
1098 add ebp, [dwSrcStride]1098 add ebp, [dwSrcStride]
1099 1099
1100 mov eax, 327681100 mov eax, 32768
1101 mov [xInverse], eax1101 mov [xInverse], eax
1102 mov ecx, [dwDstWidth]1102 mov ecx, [dwDstWidth]
1103 dec ecx1103 dec ecx
1104 1104
1105 movdqa xmm3, xmm5 ; initial u to 32768 32767 32768 327671105 movdqa xmm3, xmm5 ; initial u to 32768 32767 32768 32767
1106 1106
1107FAST_WIDTH:1107FAST_WIDTH:
1108 mov eax, [xInverse]1108 mov eax, [xInverse]
1109 shr eax, 161109 shr eax, 16
1110 1110
1111 movd xmm1, [esi+eax] ; xxxxxxba1111 movd xmm1, [esi+eax] ; xxxxxxba
1112 movd xmm2, [ebp+eax] ; xxxxxxdc1112 movd xmm2, [ebp+eax] ; xxxxxxdc
1113 punpcklwd xmm1, xmm2 ; xxxxdcba1113 punpcklwd xmm1, xmm2 ; xxxxdcba
1114 punpcklbw xmm1, xmm0 ; 0d0c0b0a1114 punpcklbw xmm1, xmm0 ; 0d0c0b0a
1115 1115
1116 movdqa xmm2, xmm4 ; xmm2: vv(1-v)(1-v) tmpv1116 movdqa xmm2, xmm4 ; xmm2: vv(1-v)(1-v) tmpv
1117 pmulhuw xmm2, xmm3 ; mul u(1-u)u(1-u) on xmm21117 pmulhuw xmm2, xmm3 ; mul u(1-u)u(1-u) on xmm2
1118 pmaddwd xmm2, xmm11118 pmaddwd xmm2, xmm1
1119 pshufd xmm1, xmm2, 00000001b1119 pshufd xmm1, xmm2, 00000001b
1120 paddd xmm2, xmm11120 paddd xmm2, xmm1
1121 movd xmm1, ebx1121 movd xmm1, ebx
1122 paddd xmm2, xmm11122 paddd xmm2, xmm1
1123 psrld xmm2, 151123 psrld xmm2, 15
1124 1124
1125 packuswb xmm2, xmm01125 packuswb xmm2, xmm0
1126 movd eax, xmm21126 movd eax, xmm2
1127 mov [edi], al1127 mov [edi], al
1128 inc edi1128 inc edi
1129 1129
1130 mov eax, [uiScaleX]1130 mov eax, [uiScaleX]
1131 add [xInverse], eax1131 add [xInverse], eax
1132 1132
1133 paddw xmm3, xmm7 ; inc u1133 paddw xmm3, xmm7 ; inc u
1134 1134
1135 loop FAST_WIDTH1135 loop FAST_WIDTH
1136 1136
1137FAST_WIDTH_END:1137FAST_WIDTH_END:
1138 mov eax, [xInverse]1138 mov eax, [xInverse]
1139 shr eax, 161139 shr eax, 16
1140 mov cl, [esi+eax]1140 mov cl, [esi+eax]
1141 mov [edi], cl1141 mov [edi], cl
1142 inc edi1142 inc edi
1143 1143
1144 mov eax, [uiScaleY]1144 mov eax, [uiScaleY]
1145 add [yInverse], eax1145 add [yInverse], eax
1146 add edi, [dstStep]1146 add edi, [dstStep]
1147 1147
1148 paddw xmm4, xmm6 ; inc v1148 paddw xmm4, xmm6 ; inc v
1149 psllw xmm4, 11149 psllw xmm4, 1
1150 psrlw xmm4, 11150 psrlw xmm4, 1
1151 1151
1152 dec dword [tmpHeight]1152 dec dword [tmpHeight]
1153 jg FAST_HEIGHT1153 jg FAST_HEIGHT
1154 1154
1155 1155
1156FAST_LAST_ROW:1156FAST_LAST_ROW:
1157 mov eax, [yInverse]1157 mov eax, [yInverse]
1158 mov esi, [pSrcData]1158 mov esi, [pSrcData]
1159 shr eax, 151159 shr eax, 15
1160 mul dword [dwSrcStride]1160 mul dword [dwSrcStride]
1161 add esi, eax ; get current row address1161 add esi, eax ; get current row address
1162 1162
1163 mov eax, 327681163 mov eax, 32768
1164 mov [xInverse], eax1164 mov [xInverse], eax
1165 mov ecx, [dwDstWidth]1165 mov ecx, [dwDstWidth]
1166 1166
1167FAST_LAST_ROW_WIDTH:1167FAST_LAST_ROW_WIDTH:
1168 mov eax, [xInverse]1168 mov eax, [xInverse]
1169 shr eax, 161169 shr eax, 16
1170 1170
1171 mov al, [esi+eax]1171 mov al, [esi+eax]
1172 mov [edi], al1172 mov [edi], al
1173 inc edi1173 inc edi
1174 1174
1175 mov eax, [uiScaleX]1175 mov eax, [uiScaleX]
1176 add [xInverse], eax1176 add [xInverse], eax
1177 1177
1178 loop FAST_LAST_ROW_WIDTH1178 loop FAST_LAST_ROW_WIDTH
1179 1179
1180FAST_LAST_ROW_END:1180FAST_LAST_ROW_END:
1181 1181
1182 add esp, localsize1182 add esp, localsize
1183 pop ebx1183 pop ebx
1184 pop edi1184 pop edi
1185 pop esi1185 pop esi
1186 pop ebp1186 pop ebp
1187%undef pushsize1187%undef pushsize
1188%undef localsize1188%undef localsize
1189%undef pSrcData1189%undef pSrcData
1190%undef dwSrcWidth1190%undef dwSrcWidth
1191%undef dwSrcHeight1191%undef dwSrcHeight
1192%undef dwSrcStride1192%undef dwSrcStride
1193%undef pDstData1193%undef pDstData
1194%undef dwDstWidth1194%undef dwDstWidth
1195%undef dwDstHeight1195%undef dwDstHeight
1196%undef dwDstStride1196%undef dwDstStride
1197%undef scale1197%undef scale
1198%undef uiScaleX1198%undef uiScaleX
1199%undef uiScaleY1199%undef uiScaleY
1200%undef tmpHeight1200%undef tmpHeight
1201%undef yInverse1201%undef yInverse
1202%undef xInverse1202%undef xInverse
1203%undef dstStep1203%undef dstStep
1204 ret1204 ret
1205%endif1205%endif
codec/processing/src/x86/vaa.asm+1518−1518
@@ -48,100 +48,100 @@ · 47 unmodified lines
48; Macros and other preprocessor constants48; Macros and other preprocessor constants
49;***********************************************************************49;***********************************************************************
50%macro SUM_SQR_SSE2 3 ; dst, pSrc, zero50%macro SUM_SQR_SSE2 3 ; dst, pSrc, zero
51 movdqa %1, %251 movdqa %1, %2
52 punpcklbw %1, %352 punpcklbw %1, %3
53 punpckhbw %2, %353 punpckhbw %2, %3
54 pmaddwd %1, %154 pmaddwd %1, %1
55 pmaddwd %2, %255 pmaddwd %2, %2
56 paddd %1, %256 paddd %1, %2
57 pshufd %2, %1, 04Eh ; 01001110 B57 pshufd %2, %1, 04Eh ; 01001110 B
58 paddd %1, %258 paddd %1, %2
59 pshufd %2, %1, 0B1h ; 10110001 B59 pshufd %2, %1, 0B1h ; 10110001 B
60 paddd %1, %260 paddd %1, %2
61%endmacro ; END OF SUM_SQR_SSE261%endmacro ; END OF SUM_SQR_SSE2
62 62
63%macro WELS_SAD_16x2_SSE2 3 ;esi :%1 edi:%2 ebx:%363%macro WELS_SAD_16x2_SSE2 3 ;esi :%1 edi:%2 ebx:%3
64 movdqa xmm1, [%1]64 movdqa xmm1, [%1]
65 movdqa xmm2, [%2]65 movdqa xmm2, [%2]
66 movdqa xmm3, [%1+%3]66 movdqa xmm3, [%1+%3]
67 movdqa xmm4, [%2+%3]67 movdqa xmm4, [%2+%3]
68 psadbw xmm1, xmm268 psadbw xmm1, xmm2
69 psadbw xmm3, xmm469 psadbw xmm3, xmm4
70 paddd xmm6, xmm170 paddd xmm6, xmm1
71 paddd xmm6, xmm371 paddd xmm6, xmm3
72 lea %1, [%1+%3*2]72 lea %1, [%1+%3*2]
73 lea %2, [%2+%3*2]73 lea %2, [%2+%3*2]
74%endmacro74%endmacro
75 75
76; by comparing it outperforms than phaddw(SSSE3) sets76; by comparing it outperforms than phaddw(SSSE3) sets
77%macro SUM_WORD_8x2_SSE2 2 ; dst(pSrc), tmp77%macro SUM_WORD_8x2_SSE2 2 ; dst(pSrc), tmp
78 ; @sum_8x2 begin78 ; @sum_8x2 begin
79 pshufd %2, %1, 04Eh ; 01001110 B79 pshufd %2, %1, 04Eh ; 01001110 B
80 paddw %1, %280 paddw %1, %2
81 pshuflw %2, %1, 04Eh ; 01001110 B81 pshuflw %2, %1, 04Eh ; 01001110 B
82 paddw %1, %282 paddw %1, %2
83 pshuflw %2, %1, 0B1h ; 10110001 B83 pshuflw %2, %1, 0B1h ; 10110001 B
84 paddw %1, %284 paddw %1, %2
85 ; end of @sum_8x285 ; end of @sum_8x2
86%endmacro ; END of SUM_WORD_8x2_SSE286%endmacro ; END of SUM_WORD_8x2_SSE2
87 87
88%macro WELS_SAD_SUM_SQSUM_16x1_SSE2 3 ;esi:%1,edi:%2,ebx:%388%macro WELS_SAD_SUM_SQSUM_16x1_SSE2 3 ;esi:%1,edi:%2,ebx:%3
89 movdqa xmm1, [%1]89 movdqa xmm1, [%1]
90 movdqa xmm2, [%2]90 movdqa xmm2, [%2]
91 movdqa xmm3, xmm191 movdqa xmm3, xmm1
92 psadbw xmm3, xmm292 psadbw xmm3, xmm2
93 paddd xmm6, xmm393 paddd xmm6, xmm3
94 94
95 movdqa xmm3, xmm195 movdqa xmm3, xmm1
96 psadbw xmm3, xmm096 psadbw xmm3, xmm0
97 paddd xmm5, xmm397 paddd xmm5, xmm3
98 98
99 movdqa xmm2, xmm199 movdqa xmm2, xmm1
100 punpcklbw xmm1, xmm0100 punpcklbw xmm1, xmm0
101 punpckhbw xmm2, xmm0101 punpckhbw xmm2, xmm0
102 pmaddwd xmm1, xmm1102 pmaddwd xmm1, xmm1
103 pmaddwd xmm2, xmm2103 pmaddwd xmm2, xmm2
104 paddd xmm4, xmm1104 paddd xmm4, xmm1
105 paddd xmm4, xmm2105 paddd xmm4, xmm2
106 106
107 add %1, %3107 add %1, %3
108 add %2, %3108 add %2, %3
109%endmacro109%endmacro
110 110
111%macro WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 3 ;esi:%1 edi:%2 ebx:%3111%macro WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 3 ;esi:%1 edi:%2 ebx:%3
112 movdqa xmm1, [%1]112 movdqa xmm1, [%1]
113 movdqa xmm2, [%2]113 movdqa xmm2, [%2]
114 movdqa xmm3, xmm1114 movdqa xmm3, xmm1
115 psadbw xmm3, xmm2115 psadbw xmm3, xmm2
116 paddd xmm7, xmm3 ; sad116 paddd xmm7, xmm3 ; sad
117 117
118 movdqa xmm3, xmm1118 movdqa xmm3, xmm1
119 pmaxub xmm3, xmm2119 pmaxub xmm3, xmm2
120 pminub xmm2, xmm1120 pminub xmm2, xmm1
121 psubb xmm3, xmm2 ; diff121 psubb xmm3, xmm2 ; diff
122 122
123 movdqa xmm2, xmm1123 movdqa xmm2, xmm1
124 psadbw xmm2, xmm0124 psadbw xmm2, xmm0
125 paddd xmm6, xmm2 ; sum125 paddd xmm6, xmm2 ; sum
126 126
127 movdqa xmm2, xmm1127 movdqa xmm2, xmm1
128 punpcklbw xmm1, xmm0128 punpcklbw xmm1, xmm0
129 punpckhbw xmm2, xmm0129 punpckhbw xmm2, xmm0
130 pmaddwd xmm1, xmm1130 pmaddwd xmm1, xmm1
131 pmaddwd xmm2, xmm2131 pmaddwd xmm2, xmm2
132 paddd xmm5, xmm1132 paddd xmm5, xmm1
133 paddd xmm5, xmm2 ; sqsum133 paddd xmm5, xmm2 ; sqsum
134 134
135 movdqa xmm1, xmm3135 movdqa xmm1, xmm3
136 punpcklbw xmm1, xmm0136 punpcklbw xmm1, xmm0
137 punpckhbw xmm3, xmm0137 punpckhbw xmm3, xmm0
138 pmaddwd xmm1, xmm1138 pmaddwd xmm1, xmm1
139 pmaddwd xmm3, xmm3139 pmaddwd xmm3, xmm3
140 paddd xmm4, xmm1140 paddd xmm4, xmm1
141 paddd xmm4, xmm3 ; sqdiff141 paddd xmm4, xmm3 ; sqdiff
142 142
143 add %1, %3143 add %1, %3
144 add %2, %3144 add %2, %3
145%endmacro145%endmacro
146 146
147%macro WELS_SAD_SD_MAD_16x1_SSE2 7 ;esi:%5 edi:%6 ebx:%7147%macro WELS_SAD_SD_MAD_16x1_SSE2 7 ;esi:%5 edi:%6 ebx:%7
@@ -149,40 +149,40 @@ · 1 unmodified line
149%define sum_cur_reg %2149%define sum_cur_reg %2
150%define sum_ref_reg %3150%define sum_ref_reg %3
151%define mad_reg %4151%define mad_reg %4
152 movdqa xmm1, [%5]152 movdqa xmm1, [%5]
153 movdqa xmm2, [%6]153 movdqa xmm2, [%6]
154 movdqa xmm3, xmm1154 movdqa xmm3, xmm1
155 psadbw xmm3, xmm0155 psadbw xmm3, xmm0
156 paddd sum_cur_reg, xmm3 ; sum_cur156 paddd sum_cur_reg, xmm3 ; sum_cur
157 movdqa xmm3, xmm2157 movdqa xmm3, xmm2
158 psadbw xmm3, xmm0158 psadbw xmm3, xmm0
159 paddd sum_ref_reg, xmm3 ; sum_ref159 paddd sum_ref_reg, xmm3 ; sum_ref
160 160
161 movdqa xmm3, xmm1161 movdqa xmm3, xmm1
162 pmaxub xmm3, xmm2162 pmaxub xmm3, xmm2
163 pminub xmm2, xmm1163 pminub xmm2, xmm1
164 psubb xmm3, xmm2 ; abs diff164 psubb xmm3, xmm2 ; abs diff
165 pmaxub mad_reg, xmm3 ; max abs diff165 pmaxub mad_reg, xmm3 ; max abs diff
166 166
167 psadbw xmm3, xmm0167 psadbw xmm3, xmm0
168 paddd sad_reg, xmm3 ; sad168 paddd sad_reg, xmm3 ; sad
169 169
170 add %5, %7170 add %5, %7
171 add %6, %7171 add %6, %7
172%endmacro172%endmacro
173 173
174 174
175%macro WELS_MAX_REG_SSE2 1 ; xmm1, xmm2, xmm3 can be used175%macro WELS_MAX_REG_SSE2 1 ; xmm1, xmm2, xmm3 can be used
176%define max_reg %1176%define max_reg %1
177 movdqa xmm1, max_reg177 movdqa xmm1, max_reg
178 psrldq xmm1, 4178 psrldq xmm1, 4
179 pmaxub max_reg, xmm1179 pmaxub max_reg, xmm1
180 movdqa xmm1, max_reg180 movdqa xmm1, max_reg
181 psrldq xmm1, 2181 psrldq xmm1, 2
182 pmaxub max_reg, xmm1182 pmaxub max_reg, xmm1
183 movdqa xmm1, max_reg183 movdqa xmm1, max_reg
184 psrldq xmm1, 1184 psrldq xmm1, 1
185 pmaxub max_reg, xmm1185 pmaxub max_reg, xmm1
186%endmacro186%endmacro
187 187
188%macro WELS_SAD_BGD_SQDIFF_16x1_SSE2 7 ;esi:%5 edi:%6 ebx:%7188%macro WELS_SAD_BGD_SQDIFF_16x1_SSE2 7 ;esi:%5 edi:%6 ebx:%7
@@ -190,50 +190,50 @@ · 1 unmodified line
190%define sum_reg %2190%define sum_reg %2
191%define mad_reg %3191%define mad_reg %3
192%define sqdiff_reg %4192%define sqdiff_reg %4
193 movdqa xmm1, [%5]193 movdqa xmm1, [%5]
194 movdqa xmm2, xmm1194 movdqa xmm2, xmm1
195 movdqa xmm3, xmm1195 movdqa xmm3, xmm1
196 punpcklbw xmm2, xmm0196 punpcklbw xmm2, xmm0
197 punpckhbw xmm3, xmm0197 punpckhbw xmm3, xmm0
198 pmaddwd xmm2, xmm2198 pmaddwd xmm2, xmm2
199 pmaddwd xmm3, xmm3199 pmaddwd xmm3, xmm3
200 paddd xmm2, xmm3200 paddd xmm2, xmm3
201 movdqa xmm3, xmm2201 movdqa xmm3, xmm2
202 psllq xmm2, 32202 psllq xmm2, 32
203 psrlq xmm3, 32203 psrlq xmm3, 32
204 psllq xmm3, 32204 psllq xmm3, 32
205 paddd xmm2, xmm3205 paddd xmm2, xmm3
206 paddd sad_reg, xmm2 ; sqsum206 paddd sad_reg, xmm2 ; sqsum
207 207
208 movdqa xmm2, [%6]208 movdqa xmm2, [%6]
209 movdqa xmm3, xmm1209 movdqa xmm3, xmm1
210 psadbw xmm3, xmm0210 psadbw xmm3, xmm0
211 paddd sum_reg, xmm3 ; sum_cur211 paddd sum_reg, xmm3 ; sum_cur
212 movdqa xmm3, xmm2212 movdqa xmm3, xmm2
213 psadbw xmm3, xmm0213 psadbw xmm3, xmm0
214 pslldq xmm3, 4214 pslldq xmm3, 4
215 paddd sum_reg, xmm3 ; sum_ref215 paddd sum_reg, xmm3 ; sum_ref
216 216
217 movdqa xmm3, xmm1217 movdqa xmm3, xmm1
218 pmaxub xmm3, xmm2218 pmaxub xmm3, xmm2
219 pminub xmm2, xmm1219 pminub xmm2, xmm1
220 psubb xmm3, xmm2 ; abs diff220 psubb xmm3, xmm2 ; abs diff
221 pmaxub mad_reg, xmm3 ; max abs diff221 pmaxub mad_reg, xmm3 ; max abs diff
222 222
223 movdqa xmm1, xmm3223 movdqa xmm1, xmm3
224 psadbw xmm3, xmm0224 psadbw xmm3, xmm0
225 paddd sad_reg, xmm3 ; sad225 paddd sad_reg, xmm3 ; sad
226 226
227 movdqa xmm3, xmm1227 movdqa xmm3, xmm1
228 punpcklbw xmm1, xmm0228 punpcklbw xmm1, xmm0
229 punpckhbw xmm3, xmm0229 punpckhbw xmm3, xmm0
230 pmaddwd xmm1, xmm1230 pmaddwd xmm1, xmm1
231 pmaddwd xmm3, xmm3231 pmaddwd xmm3, xmm3
232 paddd sqdiff_reg, xmm1232 paddd sqdiff_reg, xmm1
233 paddd sqdiff_reg, xmm3 ; sqdiff233 paddd sqdiff_reg, xmm3 ; sqdiff
234 234
235 add %5, %7235 add %5, %7
236 add %6, %7236 add %6, %7
237%endmacro237%endmacro
238 238
239 239
@@ -249,99 +249,99 @@ SECTION .text · 9 unmodified lines
249; void SampleVariance16x16_sse2( uint8_t * y_ref, int32_t y_ref_stride, uint8_t * y_src, int32_t y_src_stride,SMotionTextureUnit* pMotionTexture );249; void SampleVariance16x16_sse2( uint8_t * y_ref, int32_t y_ref_stride, uint8_t * y_src, int32_t y_src_stride,SMotionTextureUnit* pMotionTexture );
250;***********************************************************************250;***********************************************************************
251WELS_EXTERN SampleVariance16x16_sse2251WELS_EXTERN SampleVariance16x16_sse2
252 push esi252 push esi
253 push edi253 push edi
254 push ebx254 push ebx
255 255
256 sub esp, 16256 sub esp, 16
257 %define SUM [esp]257 %define SUM [esp]
258 %define SUM_CUR [esp+4]258 %define SUM_CUR [esp+4]
259 %define SQR [esp+8]259 %define SQR [esp+8]
260 %define SQR_CUR [esp+12]260 %define SQR_CUR [esp+12]
261 %define PUSH_SIZE 28 ; 12 + 16261 %define PUSH_SIZE 28 ; 12 + 16
262 262
263 mov edi, [esp+PUSH_SIZE+4] ; y_ref263 mov edi, [esp+PUSH_SIZE+4] ; y_ref
264 mov edx, [esp+PUSH_SIZE+8] ; y_ref_stride264 mov edx, [esp+PUSH_SIZE+8] ; y_ref_stride
265 mov esi, [esp+PUSH_SIZE+12] ; y_src265 mov esi, [esp+PUSH_SIZE+12] ; y_src
266 mov eax, [esp+PUSH_SIZE+16] ; y_src_stride266 mov eax, [esp+PUSH_SIZE+16] ; y_src_stride
267 mov ecx, 010h ; height = 16267 mov ecx, 010h ; height = 16
268 268
269 pxor xmm7, xmm7269 pxor xmm7, xmm7
270 movdqu SUM, xmm7270 movdqu SUM, xmm7
271 271
272.hloops:272.hloops:
273 movdqa xmm0, [edi] ; y_ref273 movdqa xmm0, [edi] ; y_ref
274 movdqa xmm1, [esi] ; y_src274 movdqa xmm1, [esi] ; y_src
275 movdqa xmm2, xmm0 ; store first for future process275 movdqa xmm2, xmm0 ; store first for future process
276 movdqa xmm3, xmm1276 movdqa xmm3, xmm1
277 ; sum += diff;277 ; sum += diff;
278 movdqa xmm4, xmm0278 movdqa xmm4, xmm0
279 psadbw xmm4, xmm1 ; 2 parts, [0,..,15], [64,..,79]279 psadbw xmm4, xmm1 ; 2 parts, [0,..,15], [64,..,79]
280 ; to be continued for sum280 ; to be continued for sum
281 pshufd xmm5, xmm4, 0C6h ; 11000110 B281 pshufd xmm5, xmm4, 0C6h ; 11000110 B
282 paddw xmm4, xmm5282 paddw xmm4, xmm5
283 movd ebx, xmm4283 movd ebx, xmm4
284 add SUM, ebx284 add SUM, ebx
285 285
286 ; sqr += diff * diff;286 ; sqr += diff * diff;
287 pmaxub xmm0, xmm1287 pmaxub xmm0, xmm1
288 pminub xmm1, xmm2288 pminub xmm1, xmm2
289 psubb xmm0, xmm1 ; diff289 psubb xmm0, xmm1 ; diff
290 SUM_SQR_SSE2 xmm1, xmm0, xmm7 ; dst, pSrc, zero290 SUM_SQR_SSE2 xmm1, xmm0, xmm7 ; dst, pSrc, zero
291 movd ebx, xmm1291 movd ebx, xmm1
292 add SQR, ebx292 add SQR, ebx
293 293
294 ; sum_cur += y_src[x];294 ; sum_cur += y_src[x];
295 movdqa xmm0, xmm3 ; cur_orig295 movdqa xmm0, xmm3 ; cur_orig
296 movdqa xmm1, xmm0296 movdqa xmm1, xmm0
297 punpcklbw xmm0, xmm7297 punpcklbw xmm0, xmm7
298 punpckhbw xmm1, xmm7298 punpckhbw xmm1, xmm7
299 paddw xmm0, xmm1 ; 8x2299 paddw xmm0, xmm1 ; 8x2
300 SUM_WORD_8x2_SSE2 xmm0, xmm1300 SUM_WORD_8x2_SSE2 xmm0, xmm1
301 movd ebx, xmm0301 movd ebx, xmm0
302 and ebx, 0ffffh302 and ebx, 0ffffh
303 add SUM_CUR, ebx303 add SUM_CUR, ebx
304 304
305 ; sqr_cur += y_src[x] * y_src[x];305 ; sqr_cur += y_src[x] * y_src[x];
306 SUM_SQR_SSE2 xmm0, xmm3, xmm7 ; dst, pSrc, zero306 SUM_SQR_SSE2 xmm0, xmm3, xmm7 ; dst, pSrc, zero
307 movd ebx, xmm0307 movd ebx, xmm0
308 add SQR_CUR, ebx308 add SQR_CUR, ebx
309 309
310 lea edi, [edi+edx]310 lea edi, [edi+edx]
311 lea esi, [esi+eax]311 lea esi, [esi+eax]
312 dec ecx312 dec ecx
313 jnz near .hloops313 jnz near .hloops
314 314
315 mov ebx, 0315 mov ebx, 0
316 mov bx, word SUM316 mov bx, word SUM
317 sar ebx, 8317 sar ebx, 8
318 imul ebx, ebx318 imul ebx, ebx
319 mov ecx, SQR319 mov ecx, SQR
320 sar ecx, 8320 sar ecx, 8
321 sub ecx, ebx321 sub ecx, ebx
322 mov edi, [esp+PUSH_SIZE+20] ; pMotionTexture322 mov edi, [esp+PUSH_SIZE+20] ; pMotionTexture
323 mov [edi], cx ; to store uiMotionIndex323 mov [edi], cx ; to store uiMotionIndex
324 mov ebx, 0324 mov ebx, 0
325 mov bx, word SUM_CUR325 mov bx, word SUM_CUR
326 sar ebx, 8326 sar ebx, 8
327 imul ebx, ebx327 imul ebx, ebx
328 mov ecx, SQR_CUR328 mov ecx, SQR_CUR
329 sar ecx, 8329 sar ecx, 8
330 sub ecx, ebx330 sub ecx, ebx
331 mov [edi+2], cx ; to store uiTextureIndex331 mov [edi+2], cx ; to store uiTextureIndex
332 332
333 %undef SUM333 %undef SUM
334 %undef SUM_CUR334 %undef SUM_CUR
335 %undef SQR335 %undef SQR
336 %undef SQR_CUR336 %undef SQR_CUR
337 %undef PUSH_SIZE337 %undef PUSH_SIZE
338 338
339 add esp, 16339 add esp, 16
340 pop ebx340 pop ebx
341 pop edi341 pop edi
342 pop esi342 pop esi
343 343
344 ret344 ret
345 345
346 346
347 347
@@ -360,67 +360,67 @@ WELS_EXTERN VAACalcSad_sse2 · 12 unmodified lines
360%define psadframe esp + pushsize + 24360%define psadframe esp + pushsize + 24
361%define psad8x8 esp + pushsize + 28361%define psad8x8 esp + pushsize + 28
362%define pushsize 12362%define pushsize 12
363 push esi363 push esi
364 push edi364 push edi
365 push ebx365 push ebx
366 mov esi, [cur_data]366 mov esi, [cur_data]
367 mov edi, [ref_data]367 mov edi, [ref_data]
368 mov ebx, [iPicStride]368 mov ebx, [iPicStride]
369 mov edx, [psad8x8]369 mov edx, [psad8x8]
370 mov eax, ebx370 mov eax, ebx
371 371
372 shr dword [iPicWidth], 4 ; iPicWidth/16372 shr dword [iPicWidth], 4 ; iPicWidth/16
373 shr dword [iPicHeight], 4 ; iPicHeight/16373 shr dword [iPicHeight], 4 ; iPicHeight/16
374 shl eax, 4 ; iPicStride*16374 shl eax, 4 ; iPicStride*16
375 pxor xmm0, xmm0375 pxor xmm0, xmm0
376 pxor xmm7, xmm7 ; iFrameSad376 pxor xmm7, xmm7 ; iFrameSad
377height_loop:377height_loop:
378 mov ecx, dword [iPicWidth]378 mov ecx, dword [iPicWidth]
379 push esi379 push esi
380 push edi380 push edi
381width_loop:381width_loop:
382 pxor xmm6, xmm6 ;382 pxor xmm6, xmm6 ;
383 WELS_SAD_16x2_SSE2 esi,edi,ebx383 WELS_SAD_16x2_SSE2 esi,edi,ebx
384 WELS_SAD_16x2_SSE2 esi,edi,ebx384 WELS_SAD_16x2_SSE2 esi,edi,ebx
385 WELS_SAD_16x2_SSE2 esi,edi,ebx385 WELS_SAD_16x2_SSE2 esi,edi,ebx
386 WELS_SAD_16x2_SSE2 esi,edi,ebx386 WELS_SAD_16x2_SSE2 esi,edi,ebx
387 paddd xmm7, xmm6387 paddd xmm7, xmm6
388 movd [edx], xmm6388 movd [edx], xmm6
389 psrldq xmm6, 8389 psrldq xmm6, 8
390 movd [edx+4], xmm6390 movd [edx+4], xmm6
391 391
392 pxor xmm6, xmm6392 pxor xmm6, xmm6
393 WELS_SAD_16x2_SSE2 esi,edi,ebx393 WELS_SAD_16x2_SSE2 esi,edi,ebx
394 WELS_SAD_16x2_SSE2 esi,edi,ebx394 WELS_SAD_16x2_SSE2 esi,edi,ebx
395 WELS_SAD_16x2_SSE2 esi,edi,ebx395 WELS_SAD_16x2_SSE2 esi,edi,ebx
396 WELS_SAD_16x2_SSE2 esi,edi,ebx396 WELS_SAD_16x2_SSE2 esi,edi,ebx
397 paddd xmm7, xmm6397 paddd xmm7, xmm6
398 movd [edx+8], xmm6398 movd [edx+8], xmm6
399 psrldq xmm6, 8399 psrldq xmm6, 8
400 movd [edx+12], xmm6400 movd [edx+12], xmm6
401 401
402 add edx, 16402 add edx, 16
403 sub esi, eax403 sub esi, eax
404 sub edi, eax404 sub edi, eax
405 add esi, 16405 add esi, 16
406 add edi, 16406 add edi, 16
407 407
408 dec ecx408 dec ecx
409 jnz width_loop409 jnz width_loop
410 410
411 pop edi411 pop edi
412 pop esi412 pop esi
413 add esi, eax413 add esi, eax
414 add edi, eax414 add edi, eax
415 415
416 dec dword [iPicHeight]416 dec dword [iPicHeight]
417 jnz height_loop417 jnz height_loop
418 418
419 mov edx, [psadframe]419 mov edx, [psadframe]
420 movdqa xmm5, xmm7420 movdqa xmm5, xmm7
421 psrldq xmm7, 8421 psrldq xmm7, 8
422 paddd xmm7, xmm5422 paddd xmm7, xmm5
423 movd [edx], xmm7423 movd [edx], xmm7
424 424
425%undef cur_data425%undef cur_data
426%undef ref_data426%undef ref_data
@@ -430,10 +430,10 @@ width_loop: · 3 unmodified lines
430%undef psadframe430%undef psadframe
431%undef psad8x8431%undef psad8x8
432%undef pushsize432%undef pushsize
433 pop ebx433 pop ebx
434 pop edi434 pop edi
435 pop esi435 pop esi
436 ret436 ret
437 437
438%else ;64-bit438%else ;64-bit
439 439
@@ -441,98 +441,98 @@ width_loop: · 1 unmodified line
441; void SampleVariance16x16_sse2( uint8_t * y_ref, int32_t y_ref_stride, uint8_t * y_src, int32_t y_src_stride,SMotionTextureUnit* pMotionTexture );441; void SampleVariance16x16_sse2( uint8_t * y_ref, int32_t y_ref_stride, uint8_t * y_src, int32_t y_src_stride,SMotionTextureUnit* pMotionTexture );
442;***********************************************************************442;***********************************************************************
443WELS_EXTERN SampleVariance16x16_sse2443WELS_EXTERN SampleVariance16x16_sse2
444 %define SUM r10;[esp]444 %define SUM r10;[esp]
445 %define SUM_CUR r11;[esp+4]445 %define SUM_CUR r11;[esp+4]
446 %define SQR r13;[esp+8]446 %define SQR r13;[esp+8]
447 %define SQR_CUR r15;[esp+12]447 %define SQR_CUR r15;[esp+12]
448 448
449 push r12449 push r12
450 push r13450 push r13
451 push r14451 push r14
452 push r15452 push r15
453 %assign push_num 4453 %assign push_num 4
454 LOAD_5_PARA454 LOAD_5_PARA
455 PUSH_XMM 8455 PUSH_XMM 8
456 SIGN_EXTENSION r1,r1d456 SIGN_EXTENSION r1,r1d
457 SIGN_EXTENSION r3,r3d457 SIGN_EXTENSION r3,r3d
458 458
459 mov r12,010h459 mov r12,010h
460 pxor xmm7, xmm7460 pxor xmm7, xmm7
461 movq SUM, xmm7461 movq SUM, xmm7
462 movq SUM_CUR,xmm7462 movq SUM_CUR,xmm7
463 movq SQR,xmm7463 movq SQR,xmm7
464 movq SQR_CUR,xmm7464 movq SQR_CUR,xmm7
465 465
466.hloops:466.hloops:
467 mov r14,0467 mov r14,0
468 movdqa xmm0, [r0] ; y_ref468 movdqa xmm0, [r0] ; y_ref
469 movdqa xmm1, [r2] ; y_src469 movdqa xmm1, [r2] ; y_src
470 movdqa xmm2, xmm0 ; store first for future process470 movdqa xmm2, xmm0 ; store first for future process
471 movdqa xmm3, xmm1471 movdqa xmm3, xmm1
472 ; sum += diff;472 ; sum += diff;
473 movdqa xmm4, xmm0473 movdqa xmm4, xmm0
474 psadbw xmm4, xmm1 ; 2 parts, [0,..,15], [64,..,79]474 psadbw xmm4, xmm1 ; 2 parts, [0,..,15], [64,..,79]
475 ; to be continued for sum475 ; to be continued for sum
476 pshufd xmm5, xmm4, 0C6h ; 11000110 B476 pshufd xmm5, xmm4, 0C6h ; 11000110 B
477 paddw xmm4, xmm5477 paddw xmm4, xmm5
478 movd r14d, xmm4478 movd r14d, xmm4
479 add SUM, r14479 add SUM, r14
480 480
481 ; sqr += diff * diff;481 ; sqr += diff * diff;
482 pmaxub xmm0, xmm1482 pmaxub xmm0, xmm1
483 pminub xmm1, xmm2483 pminub xmm1, xmm2
484 psubb xmm0, xmm1 ; diff484 psubb xmm0, xmm1 ; diff
485 SUM_SQR_SSE2 xmm1, xmm0, xmm7 ; dst, pSrc, zero485 SUM_SQR_SSE2 xmm1, xmm0, xmm7 ; dst, pSrc, zero
486 movd r14d, xmm1486 movd r14d, xmm1
487 add SQR, r14487 add SQR, r14
488 488
489 ; sum_cur += y_src[x];489 ; sum_cur += y_src[x];
490 movdqa xmm0, xmm3 ; cur_orig490 movdqa xmm0, xmm3 ; cur_orig
491 movdqa xmm1, xmm0491 movdqa xmm1, xmm0
492 punpcklbw xmm0, xmm7492 punpcklbw xmm0, xmm7
493 punpckhbw xmm1, xmm7493 punpckhbw xmm1, xmm7
494 paddw xmm0, xmm1 ; 8x2494 paddw xmm0, xmm1 ; 8x2
495 SUM_WORD_8x2_SSE2 xmm0, xmm1495 SUM_WORD_8x2_SSE2 xmm0, xmm1
496 movd r14d, xmm0496 movd r14d, xmm0
497 and r14, 0ffffh497 and r14, 0ffffh
498 add SUM_CUR, r14498 add SUM_CUR, r14
499 499
500 ; sqr_cur += y_src[x] * y_src[x];500 ; sqr_cur += y_src[x] * y_src[x];
501 SUM_SQR_SSE2 xmm0, xmm3, xmm7 ; dst, pSrc, zero501 SUM_SQR_SSE2 xmm0, xmm3, xmm7 ; dst, pSrc, zero
502 movd r14d, xmm0502 movd r14d, xmm0
503 add SQR_CUR, r14503 add SQR_CUR, r14
504 504
505 lea r0, [r0+r1]505 lea r0, [r0+r1]
506 lea r2, [r2+r3]506 lea r2, [r2+r3]
507 dec r12507 dec r12
508 jnz near .hloops508 jnz near .hloops
509 509
510 mov r0, SUM510 mov r0, SUM
511 sar r0, 8511 sar r0, 8
512 imul r0, r0512 imul r0, r0
513 mov r1, SQR513 mov r1, SQR
514 sar r1, 8514 sar r1, 8
515 sub r1, r0515 sub r1, r0
516 mov [r4], r1w ; to store uiMotionIndex516 mov [r4], r1w ; to store uiMotionIndex
517 mov r0, SUM_CUR517 mov r0, SUM_CUR
518 sar r0, 8518 sar r0, 8
519 imul r0, r0519 imul r0, r0
520 mov r1, SQR_CUR520 mov r1, SQR_CUR
521 sar r1, 8521 sar r1, 8
522 sub r1, r0522 sub r1, r0
523 mov [r4+2], r1w ; to store uiTextureIndex523 mov [r4+2], r1w ; to store uiTextureIndex
524 524
525 POP_XMM525 POP_XMM
526 LOAD_5_PARA_POP526 LOAD_5_PARA_POP
527 pop r15527 pop r15
528 pop r14528 pop r14
529 pop r13529 pop r13
530 pop r12530 pop r12
531 531
532 532
533 %assign push_num 0533 %assign push_num 0
534 534
535 ret535 ret
536 536
537 537
538;*************************************************************************************************************538;*************************************************************************************************************
@@ -550,69 +550,69 @@ WELS_EXTERN VAACalcSad_sse2 · 11 unmodified lines
550%define psadframe r5550%define psadframe r5
551%define psad8x8 r6551%define psad8x8 r6
552 552
553 push r12553 push r12
554 push r13554 push r13
555 %assign push_num 2555 %assign push_num 2
556 LOAD_7_PARA556 LOAD_7_PARA
557 PUSH_XMM 8557 PUSH_XMM 8
558 SIGN_EXTENSION r2,r2d558 SIGN_EXTENSION r2,r2d
559 SIGN_EXTENSION r3,r3d559 SIGN_EXTENSION r3,r3d
560 SIGN_EXTENSION r4,r4d560 SIGN_EXTENSION r4,r4d
561 561
562 mov r12,r4562 mov r12,r4
563 shr r2, 4 ; iPicWidth/16563 shr r2, 4 ; iPicWidth/16
564 shr r3, 4 ; iPicHeight/16564 shr r3, 4 ; iPicHeight/16
565 565
566 shl r12, 4 ; iPicStride*16566 shl r12, 4 ; iPicStride*16
567 pxor xmm0, xmm0567 pxor xmm0, xmm0
568 pxor xmm7, xmm7 ; iFrameSad568 pxor xmm7, xmm7 ; iFrameSad
569height_loop:569height_loop:
570 mov r13, r2570 mov r13, r2
571 push r0571 push r0
572 push r1572 push r1
573width_loop:573width_loop:
574 pxor xmm6, xmm6574 pxor xmm6, xmm6
575 WELS_SAD_16x2_SSE2 r0,r1,r4575 WELS_SAD_16x2_SSE2 r0,r1,r4
576 WELS_SAD_16x2_SSE2 r0,r1,r4576 WELS_SAD_16x2_SSE2 r0,r1,r4
577 WELS_SAD_16x2_SSE2 r0,r1,r4577 WELS_SAD_16x2_SSE2 r0,r1,r4
578 WELS_SAD_16x2_SSE2 r0,r1,r4578 WELS_SAD_16x2_SSE2 r0,r1,r4
579 paddd xmm7, xmm6579 paddd xmm7, xmm6
580 movd [r6], xmm6580 movd [r6], xmm6
581 psrldq xmm6, 8581 psrldq xmm6, 8
582 movd [r6+4], xmm6582 movd [r6+4], xmm6
583 583
584 pxor xmm6, xmm6584 pxor xmm6, xmm6
585 WELS_SAD_16x2_SSE2 r0,r1,r4585 WELS_SAD_16x2_SSE2 r0,r1,r4
586 WELS_SAD_16x2_SSE2 r0,r1,r4586 WELS_SAD_16x2_SSE2 r0,r1,r4
587 WELS_SAD_16x2_SSE2 r0,r1,r4587 WELS_SAD_16x2_SSE2 r0,r1,r4
588 WELS_SAD_16x2_SSE2 r0,r1,r4588 WELS_SAD_16x2_SSE2 r0,r1,r4
589 paddd xmm7, xmm6589 paddd xmm7, xmm6
590 movd [r6+8], xmm6590 movd [r6+8], xmm6
591 psrldq xmm6, 8591 psrldq xmm6, 8
592 movd [r6+12], xmm6592 movd [r6+12], xmm6
593 593
594 add r6, 16594 add r6, 16
595 sub r0, r12595 sub r0, r12
596 sub r1, r12596 sub r1, r12
597 add r0, 16597 add r0, 16
598 add r1, 16598 add r1, 16
599 599
600 dec r13600 dec r13
601 jnz width_loop601 jnz width_loop
602 602
603 pop r1603 pop r1
604 pop r0604 pop r0
605 add r0, r12605 add r0, r12
606 add r1, r12606 add r1, r12
607 607
608 dec r3608 dec r3
609 jnz height_loop609 jnz height_loop
610 610
611 ;mov r13, [psadframe]611 ;mov r13, [psadframe]
612 movdqa xmm5, xmm7612 movdqa xmm5, xmm7
613 psrldq xmm7, 8613 psrldq xmm7, 8
614 paddd xmm7, xmm5614 paddd xmm7, xmm5
615 movd [psadframe], xmm7615 movd [psadframe], xmm7
616 616
617%undef cur_data617%undef cur_data
618%undef ref_data618%undef ref_data
@@ -622,12 +622,12 @@ width_loop: · 3 unmodified lines
622%undef psadframe622%undef psadframe
623%undef psad8x8623%undef psad8x8
624%undef pushsize624%undef pushsize
625 POP_XMM625 POP_XMM
626 LOAD_7_PARA_POP626 LOAD_7_PARA_POP
627 pop r13627 pop r13
628 pop r12628 pop r12
629 %assign push_num 0629 %assign push_num 0
630 ret630 ret
631 631
632%endif632%endif
633 633
@@ -653,103 +653,103 @@ WELS_EXTERN VAACalcSadVar_sse2 · 19 unmodified lines
653%define tmp_esi esp + 0653%define tmp_esi esp + 0
654%define tmp_edi esp + 4654%define tmp_edi esp + 4
655%define pushsize 16655%define pushsize 16
656 push ebp656 push ebp
657 push esi657 push esi
658 push edi658 push edi
659 push ebx659 push ebx
660 sub esp, localsize660 sub esp, localsize
661 mov esi, [cur_data]661 mov esi, [cur_data]
662 mov edi, [ref_data]662 mov edi, [ref_data]
663 mov ebx, [iPicStride]663 mov ebx, [iPicStride]
664 mov edx, [psad8x8]664 mov edx, [psad8x8]
665 mov eax, ebx665 mov eax, ebx
666 666
667 shr dword [iPicWidth], 4 ; iPicWidth/16667 shr dword [iPicWidth], 4 ; iPicWidth/16
668 shr dword [iPicHeight], 4 ; iPicHeight/16668 shr dword [iPicHeight], 4 ; iPicHeight/16
669 shl eax, 4 ; iPicStride*16669 shl eax, 4 ; iPicStride*16
670 pxor xmm0, xmm0670 pxor xmm0, xmm0
671 pxor xmm7, xmm7 ; iFrameSad671 pxor xmm7, xmm7 ; iFrameSad
672var_height_loop:672var_height_loop:
673 mov ecx, dword [iPicWidth]673 mov ecx, dword [iPicWidth]
674 mov [tmp_esi], esi674 mov [tmp_esi], esi
675 mov [tmp_edi], edi675 mov [tmp_edi], edi
676var_width_loop:676var_width_loop:
677 pxor xmm6, xmm6 ; hiQuad_loQuad pSad8x8677 pxor xmm6, xmm6 ; hiQuad_loQuad pSad8x8
678 pxor xmm5, xmm5 ; pSum16x16678 pxor xmm5, xmm5 ; pSum16x16
679 pxor xmm4, xmm4 ; sqsum_16x16679 pxor xmm4, xmm4 ; sqsum_16x16
680 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx680 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
681 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx681 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
682 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx682 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
683 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx683 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
684 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx684 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
685 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx685 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
686 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx686 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
687 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx687 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
688 paddd xmm7, xmm6688 paddd xmm7, xmm6
689 movd [edx], xmm6689 movd [edx], xmm6
690 psrldq xmm6, 8690 psrldq xmm6, 8
691 movd [edx+4], xmm6691 movd [edx+4], xmm6
692 692
693 pxor xmm6, xmm6693 pxor xmm6, xmm6
694 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx694 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
695 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx695 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
696 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx696 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
697 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx697 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
698 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx698 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
699 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx699 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
700 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx700 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
701 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx701 WELS_SAD_SUM_SQSUM_16x1_SSE2 esi,edi,ebx
702 paddd xmm7, xmm6702 paddd xmm7, xmm6
703 movd [edx+8], xmm6703 movd [edx+8], xmm6
704 psrldq xmm6, 8704 psrldq xmm6, 8
705 movd [edx+12], xmm6705 movd [edx+12], xmm6
706 706
707 mov ebp, [psum16x16]707 mov ebp, [psum16x16]
708 movdqa xmm1, xmm5708 movdqa xmm1, xmm5
709 psrldq xmm1, 8709 psrldq xmm1, 8
710 paddd xmm5, xmm1710 paddd xmm5, xmm1
711 movd [ebp], xmm5711 movd [ebp], xmm5
712 add dword [psum16x16], 4712 add dword [psum16x16], 4
713 713
714 movdqa xmm5, xmm4714 movdqa xmm5, xmm4
715 psrldq xmm5, 8715 psrldq xmm5, 8
716 paddd xmm4, xmm5716 paddd xmm4, xmm5
717 movdqa xmm3, xmm4717 movdqa xmm3, xmm4
718 psrldq xmm3, 4718 psrldq xmm3, 4
719 paddd xmm4, xmm3719 paddd xmm4, xmm3
720 720
721 mov ebp, [psqsum16x16]721 mov ebp, [psqsum16x16]
722 movd [ebp], xmm4722 movd [ebp], xmm4
723 add dword [psqsum16x16], 4723 add dword [psqsum16x16], 4
724 724
725 add edx, 16725 add edx, 16
726 sub esi, eax726 sub esi, eax
727 sub edi, eax727 sub edi, eax
728 add esi, 16728 add esi, 16
729 add edi, 16729 add edi, 16
730 730
731 dec ecx731 dec ecx
732 jnz var_width_loop732 jnz var_width_loop
733 733
734 mov esi, [tmp_esi]734 mov esi, [tmp_esi]
735 mov edi, [tmp_edi]735 mov edi, [tmp_edi]
736 add esi, eax736 add esi, eax
737 add edi, eax737 add edi, eax
738 738
739 dec dword [iPicHeight]739 dec dword [iPicHeight]
740 jnz var_height_loop740 jnz var_height_loop
741 741
742 mov edx, [psadframe]742 mov edx, [psadframe]
743 movdqa xmm5, xmm7743 movdqa xmm5, xmm7
744 psrldq xmm7, 8744 psrldq xmm7, 8
745 paddd xmm7, xmm5745 paddd xmm7, xmm5
746 movd [edx], xmm7746 movd [edx], xmm7
747 747
748 add esp, localsize748 add esp, localsize
749 pop ebx749 pop ebx
750 pop edi750 pop edi
751 pop esi751 pop esi
752 pop ebp752 pop ebp
753%undef cur_data753%undef cur_data
754%undef ref_data754%undef ref_data
755%undef iPicWidth755%undef iPicWidth
@@ -763,7 +763,7 @@ var_width_loop: · 7 unmodified lines
763%undef tmp_edi763%undef tmp_edi
764%undef pushsize764%undef pushsize
765%undef localsize765%undef localsize
766 ret766 ret
767 767
768%else ;64-bit768%else ;64-bit
769 769
@@ -784,112 +784,112 @@ WELS_EXTERN VAACalcSadVar_sse2 · 14 unmodified lines
784%define psum16x16 arg8784%define psum16x16 arg8
785%define psqsum16x16 arg9785%define psqsum16x16 arg9
786 786
787 push r12787 push r12
788 push r13788 push r13
789 push r14789 push r14
790 push r15790 push r15
791 %assign push_num 4791 %assign push_num 4
792 PUSH_XMM 8792 PUSH_XMM 8
793 793
794%ifdef WIN64794%ifdef WIN64
795 mov r4, arg5 ;iPicStride795 mov r4, arg5 ;iPicStride
796 mov r5, arg6 ;psad8x8796 mov r5, arg6 ;psad8x8
797%endif797%endif
798 mov r14,arg7798 mov r14,arg7
799 SIGN_EXTENSION r2,r2d799 SIGN_EXTENSION r2,r2d
800 SIGN_EXTENSION r3,r3d800 SIGN_EXTENSION r3,r3d
801 SIGN_EXTENSION r4,r4d801 SIGN_EXTENSION r4,r4d
802 802
803 mov r13,r4803 mov r13,r4
804 shr r2,4804 shr r2,4
805 shr r3,4805 shr r3,4
806 806
807 shl r13,4 ; iPicStride*16807 shl r13,4 ; iPicStride*16
808 pxor xmm0, xmm0808 pxor xmm0, xmm0
809 pxor xmm7, xmm7 ; iFrameSad809 pxor xmm7, xmm7 ; iFrameSad
810var_height_loop:810var_height_loop:
811 push r2811 push r2
812 %assign push_num push_num+1812 %assign push_num push_num+1
813 mov r11, r0813 mov r11, r0
814 mov r12, r1814 mov r12, r1
815var_width_loop:815var_width_loop:
816 pxor xmm6, xmm6 ; hiQuad_loQuad pSad8x8816 pxor xmm6, xmm6 ; hiQuad_loQuad pSad8x8
817 pxor xmm5, xmm5 ; pSum16x16817 pxor xmm5, xmm5 ; pSum16x16
818 pxor xmm4, xmm4 ; sqsum_16x16818 pxor xmm4, xmm4 ; sqsum_16x16
819 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4819 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
820 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4820 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
821 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4821 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
822 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4822 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
823 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4823 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
824 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4824 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
825 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4825 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
826 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4826 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
827 paddd xmm7, xmm6827 paddd xmm7, xmm6
828 movd [r14], xmm6828 movd [r14], xmm6
829 psrldq xmm6, 8829 psrldq xmm6, 8
830 movd [r14+4], xmm6830 movd [r14+4], xmm6
831 831
832 pxor xmm6, xmm6832 pxor xmm6, xmm6
833 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4833 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
834 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4834 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
835 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4835 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
836 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4836 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
837 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4837 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
838 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4838 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
839 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4839 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
840 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4840 WELS_SAD_SUM_SQSUM_16x1_SSE2 r0,r1,r4
841 paddd xmm7, xmm6841 paddd xmm7, xmm6
842 movd [r14+8], xmm6842 movd [r14+8], xmm6
843 psrldq xmm6, 8843 psrldq xmm6, 8
844 movd [r14+12], xmm6844 movd [r14+12], xmm6
845 845
846 mov r15, psum16x16846 mov r15, psum16x16
847 movdqa xmm1, xmm5847 movdqa xmm1, xmm5
848 psrldq xmm1, 8848 psrldq xmm1, 8
849 paddd xmm5, xmm1849 paddd xmm5, xmm1
850 movd [r15], xmm5850 movd [r15], xmm5
851 add dword psum16x16, 4851 add dword psum16x16, 4
852 852
853 movdqa xmm5, xmm4853 movdqa xmm5, xmm4
854 psrldq xmm5, 8854 psrldq xmm5, 8
855 paddd xmm4, xmm5855 paddd xmm4, xmm5
856 movdqa xmm3, xmm4856 movdqa xmm3, xmm4
857 psrldq xmm3, 4857 psrldq xmm3, 4
858 paddd xmm4, xmm3858 paddd xmm4, xmm3
859 859
860 mov r15, psqsum16x16860 mov r15, psqsum16x16
861 movd [r15], xmm4861 movd [r15], xmm4
862 add dword psqsum16x16, 4862 add dword psqsum16x16, 4
863 863
864 add r14,16864 add r14,16
865 sub r0, r13865 sub r0, r13
866 sub r1, r13866 sub r1, r13
867 add r0, 16867 add r0, 16
868 add r1, 16868 add r1, 16
869 869
870 dec r2870 dec r2
871 jnz var_width_loop871 jnz var_width_loop
872 872
873 pop r2873 pop r2
874 %assign push_num push_num-1874 %assign push_num push_num-1
875 mov r0, r11875 mov r0, r11
876 mov r1, r12876 mov r1, r12
877 add r0, r13877 add r0, r13
878 add r1, r13878 add r1, r13
879 dec r3879 dec r3
880 jnz var_height_loop880 jnz var_height_loop
881 881
882 mov r15, psadframe882 mov r15, psadframe
883 movdqa xmm5, xmm7883 movdqa xmm5, xmm7
884 psrldq xmm7, 8884 psrldq xmm7, 8
885 paddd xmm7, xmm5885 paddd xmm7, xmm5
886 movd [r15], xmm7886 movd [r15], xmm7
887 887
888 POP_XMM888 POP_XMM
889 pop r15889 pop r15
890 pop r14890 pop r14
891 pop r13891 pop r13
892 pop r12892 pop r12
893%assign push_num 0893%assign push_num 0
894%undef cur_data894%undef cur_data
895%undef ref_data895%undef ref_data
@@ -904,7 +904,7 @@ var_width_loop: · 8 unmodified lines
904%undef tmp_edi904%undef tmp_edi
905%undef pushsize905%undef pushsize
906%undef localsize906%undef localsize
907 ret907 ret
908 908
909%endif909%endif
910 910
@@ -932,118 +932,118 @@ WELS_EXTERN VAACalcSadSsd_sse2 · 21 unmodified lines
932%define tmp_edi esp + 4932%define tmp_edi esp + 4
933%define tmp_sadframe esp + 8933%define tmp_sadframe esp + 8
934%define pushsize 16934%define pushsize 16
935 push ebp935 push ebp
936 push esi936 push esi
937 push edi937 push edi
938 push ebx938 push ebx
939 sub esp, localsize939 sub esp, localsize
940 940
941 mov ecx, [iPicWidth]941 mov ecx, [iPicWidth]
942 mov ecx, [iPicHeight]942 mov ecx, [iPicHeight]
943 mov esi, [cur_data]943 mov esi, [cur_data]
944 mov edi, [ref_data]944 mov edi, [ref_data]
945 mov ebx, [iPicStride]945 mov ebx, [iPicStride]
946 mov edx, [psad8x8]946 mov edx, [psad8x8]
947 mov eax, ebx947 mov eax, ebx
948 948
949 shr dword [iPicWidth], 4 ; iPicWidth/16949 shr dword [iPicWidth], 4 ; iPicWidth/16
950 shr dword [iPicHeight], 4 ; iPicHeight/16950 shr dword [iPicHeight], 4 ; iPicHeight/16
951 shl eax, 4 ; iPicStride*16951 shl eax, 4 ; iPicStride*16
952 mov ecx, [iPicWidth]952 mov ecx, [iPicWidth]
953 mov ecx, [iPicHeight]953 mov ecx, [iPicHeight]
954 pxor xmm0, xmm0954 pxor xmm0, xmm0
955 movd [tmp_sadframe], xmm0955 movd [tmp_sadframe], xmm0
956sqdiff_height_loop:956sqdiff_height_loop:
957 mov ecx, dword [iPicWidth]957 mov ecx, dword [iPicWidth]
958 mov [tmp_esi], esi958 mov [tmp_esi], esi
959 mov [tmp_edi], edi959 mov [tmp_edi], edi
960sqdiff_width_loop:960sqdiff_width_loop:
961 pxor xmm7, xmm7 ; hiQuad_loQuad pSad8x8961 pxor xmm7, xmm7 ; hiQuad_loQuad pSad8x8
962 pxor xmm6, xmm6 ; pSum16x16962 pxor xmm6, xmm6 ; pSum16x16
963 pxor xmm5, xmm5 ; sqsum_16x16 four dword963 pxor xmm5, xmm5 ; sqsum_16x16 four dword
964 pxor xmm4, xmm4 ; sqdiff_16x16 four Dword964 pxor xmm4, xmm4 ; sqdiff_16x16 four Dword
965 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx965 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
966 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx966 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
967 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx967 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
968 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx968 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
969 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx969 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
970 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx970 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
971 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx971 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
972 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx972 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
973 movdqa xmm1, xmm7973 movdqa xmm1, xmm7
974 movd [edx], xmm7974 movd [edx], xmm7
975 psrldq xmm7, 8975 psrldq xmm7, 8
976 paddd xmm1, xmm7976 paddd xmm1, xmm7
977 movd [edx+4], xmm7977 movd [edx+4], xmm7
978 movd ebp, xmm1978 movd ebp, xmm1
979 add [tmp_sadframe], ebp979 add [tmp_sadframe], ebp
980 980
981 pxor xmm7, xmm7981 pxor xmm7, xmm7
982 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx982 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
983 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx983 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
984 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx984 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
985 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx985 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
986 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx986 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
987 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx987 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
988 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx988 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
989 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx989 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 esi,edi,ebx
990 movdqa xmm1, xmm7990 movdqa xmm1, xmm7
991 movd [edx+8], xmm7991 movd [edx+8], xmm7
992 psrldq xmm7, 8992 psrldq xmm7, 8
993 paddd xmm1, xmm7993 paddd xmm1, xmm7
994 movd [edx+12], xmm7994 movd [edx+12], xmm7
995 movd ebp, xmm1995 movd ebp, xmm1
996 add [tmp_sadframe], ebp996 add [tmp_sadframe], ebp
997 997
998 mov ebp, [psum16x16]998 mov ebp, [psum16x16]
999 movdqa xmm1, xmm6999 movdqa xmm1, xmm6
1000 psrldq xmm1, 81000 psrldq xmm1, 8
1001 paddd xmm6, xmm11001 paddd xmm6, xmm1
1002 movd [ebp], xmm61002 movd [ebp], xmm6
1003 add dword [psum16x16], 41003 add dword [psum16x16], 4
1004 1004
1005 mov ebp, [psqsum16x16]1005 mov ebp, [psqsum16x16]
1006 pshufd xmm6, xmm5, 14 ;000011101006 pshufd xmm6, xmm5, 14 ;00001110
1007 paddd xmm6, xmm51007 paddd xmm6, xmm5
1008 pshufd xmm5, xmm6, 1 ;000000011008 pshufd xmm5, xmm6, 1 ;00000001
1009 paddd xmm5, xmm61009 paddd xmm5, xmm6
1010 movd [ebp], xmm51010 movd [ebp], xmm5
1011 add dword [psqsum16x16], 41011 add dword [psqsum16x16], 4
1012 1012
1013 mov ebp, [psqdiff16x16]1013 mov ebp, [psqdiff16x16]
1014 pshufd xmm5, xmm4, 14 ; 000011101014 pshufd xmm5, xmm4, 14 ; 00001110
1015 paddd xmm5, xmm41015 paddd xmm5, xmm4
1016 pshufd xmm4, xmm5, 1 ; 000000011016 pshufd xmm4, xmm5, 1 ; 00000001
1017 paddd xmm4, xmm51017 paddd xmm4, xmm5
1018 movd [ebp], xmm41018 movd [ebp], xmm4
1019 add dword [psqdiff16x16], 41019 add dword [psqdiff16x16], 4
1020 1020
1021 add edx, 161021 add edx, 16
1022 sub esi, eax1022 sub esi, eax
1023 sub edi, eax1023 sub edi, eax
1024 add esi, 161024 add esi, 16
1025 add edi, 161025 add edi, 16
1026 1026
1027 dec ecx1027 dec ecx
1028 jnz sqdiff_width_loop1028 jnz sqdiff_width_loop
1029 1029
1030 mov esi, [tmp_esi]1030 mov esi, [tmp_esi]
1031 mov edi, [tmp_edi]1031 mov edi, [tmp_edi]
1032 add esi, eax1032 add esi, eax
1033 add edi, eax1033 add edi, eax
1034 1034
1035 dec dword [iPicHeight]1035 dec dword [iPicHeight]
1036 jnz sqdiff_height_loop1036 jnz sqdiff_height_loop
1037 1037
1038 mov ebx, [tmp_sadframe]1038 mov ebx, [tmp_sadframe]
1039 mov eax, [psadframe]1039 mov eax, [psadframe]
1040 mov [eax], ebx1040 mov [eax], ebx
1041 1041
1042 add esp, localsize1042 add esp, localsize
1043 pop ebx1043 pop ebx
1044 pop edi1044 pop edi
1045 pop esi1045 pop esi
1046 pop ebp1046 pop ebp
1047%undef cur_data1047%undef cur_data
1048%undef ref_data1048%undef ref_data
1049%undef iPicWidth1049%undef iPicWidth
@@ -1059,7 +1059,7 @@ sqdiff_width_loop: · 9 unmodified lines
1059%undef tmp_sadframe1059%undef tmp_sadframe
1060%undef pushsize1060%undef pushsize
1061%undef localsize1061%undef localsize
1062 ret1062 ret
1063 1063
1064%else1064%else
1065 1065
@@ -1083,128 +1083,128 @@ WELS_EXTERN VAACalcSadSsd_sse2 · 17 unmodified lines
1083%define psqsum16x16 arg9;1083%define psqsum16x16 arg9;
1084%define psqdiff16x16 arg101084%define psqdiff16x16 arg10
1085 1085
1086 push r121086 push r12
1087 push r131087 push r13
1088 push r141088 push r14
1089 push r151089 push r15
1090 %assign push_num 41090 %assign push_num 4
1091 PUSH_XMM 101091 PUSH_XMM 10
1092 1092
1093%ifdef WIN641093%ifdef WIN64
1094 mov r4,arg51094 mov r4,arg5
1095%endif1095%endif
1096 mov r14,arg71096 mov r14,arg7
1097 SIGN_EXTENSION r2,r2d1097 SIGN_EXTENSION r2,r2d
1098 SIGN_EXTENSION r3,r3d1098 SIGN_EXTENSION r3,r3d
1099 SIGN_EXTENSION r4,r4d1099 SIGN_EXTENSION r4,r4d
1100 1100
1101 mov r13,r41101 mov r13,r4
1102 shr r2,4 ; iPicWidth/161102 shr r2,4 ; iPicWidth/16
1103 shr r3,4 ; iPicHeight/161103 shr r3,4 ; iPicHeight/16
1104 shl r13,4 ; iPicStride*161104 shl r13,4 ; iPicStride*16
1105 pxor xmm0, xmm01105 pxor xmm0, xmm0
1106 pxor xmm8, xmm8 ;framesad1106 pxor xmm8, xmm8 ;framesad
1107 pxor xmm9, xmm91107 pxor xmm9, xmm9
1108sqdiff_height_loop:1108sqdiff_height_loop:
1109 ;mov ecx, dword [iPicWidth]1109 ;mov ecx, dword [iPicWidth]
1110 ;mov r14,r21110 ;mov r14,r2
1111 push r21111 push r2
1112 %assign push_num push_num +11112 %assign push_num push_num +1
1113 mov r10, r01113 mov r10, r0
1114 mov r11, r11114 mov r11, r1
1115sqdiff_width_loop:1115sqdiff_width_loop:
1116 pxor xmm7, xmm7 ; hiQuad_loQuad pSad8x81116 pxor xmm7, xmm7 ; hiQuad_loQuad pSad8x8
1117 pxor xmm6, xmm6 ; pSum16x161117 pxor xmm6, xmm6 ; pSum16x16
1118 pxor xmm5, xmm5 ; sqsum_16x16 four dword1118 pxor xmm5, xmm5 ; sqsum_16x16 four dword
1119 pxor xmm4, xmm4 ; sqdiff_16x16 four Dword1119 pxor xmm4, xmm4 ; sqdiff_16x16 four Dword
1120 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r41120 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1121 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r41121 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1122 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r41122 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1123 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r41123 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1124 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r41124 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1125 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r41125 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1126 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r41126 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1127 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r41127 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1128 movdqa xmm1, xmm71128 movdqa xmm1, xmm7
1129 movd [r14], xmm71129 movd [r14], xmm7
1130 psrldq xmm7, 81130 psrldq xmm7, 8
1131 paddd xmm1, xmm71131 paddd xmm1, xmm7
1132 movd [r14+4], xmm71132 movd [r14+4], xmm7
1133 movd r15d, xmm11133 movd r15d, xmm1
1134 movd xmm9, r15d1134 movd xmm9, r15d
1135 paddd xmm8,xmm91135 paddd xmm8,xmm9
1136 1136
1137 1137
1138 pxor xmm7, xmm71138 pxor xmm7, xmm7
1139 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r41139 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1140 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r41140 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1141 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r41141 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1142 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r41142 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1143 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r41143 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1144 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r41144 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1145 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r41145 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1146 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r41146 WELS_SAD_SUM_SQSUM_SQDIFF_16x1_SSE2 r0,r1,r4
1147 movdqa xmm1, xmm71147 movdqa xmm1, xmm7
1148 movd [r14+8], xmm71148 movd [r14+8], xmm7
1149 psrldq xmm7, 81149 psrldq xmm7, 8
1150 paddd xmm1, xmm71150 paddd xmm1, xmm7
1151 movd [r14+12], xmm71151 movd [r14+12], xmm7
1152 movd r15d, xmm11152 movd r15d, xmm1
1153 movd xmm9, r15d1153 movd xmm9, r15d
1154 paddd xmm8,xmm91154 paddd xmm8,xmm9
1155 1155
1156 mov r15, psum16x161156 mov r15, psum16x16
1157 movdqa xmm1, xmm61157 movdqa xmm1, xmm6
1158 psrldq xmm1, 81158 psrldq xmm1, 8
1159 paddd xmm6, xmm11159 paddd xmm6, xmm1
1160 movd [r15], xmm61160 movd [r15], xmm6
1161 add dword psum16x16, 41161 add dword psum16x16, 4
1162 1162
1163 mov r15, psqsum16x161163 mov r15, psqsum16x16
1164 pshufd xmm6, xmm5, 14 ;000011101164 pshufd xmm6, xmm5, 14 ;00001110
1165 paddd xmm6, xmm51165 paddd xmm6, xmm5
1166 pshufd xmm5, xmm6, 1 ;000000011166 pshufd xmm5, xmm6, 1 ;00000001
1167 paddd xmm5, xmm61167 paddd xmm5, xmm6
1168 movd [r15], xmm51168 movd [r15], xmm5
1169 add dword psqsum16x16, 41169 add dword psqsum16x16, 4
1170 1170
1171 mov r15, psqdiff16x161171 mov r15, psqdiff16x16
1172 pshufd xmm5, xmm4, 14 ; 000011101172 pshufd xmm5, xmm4, 14 ; 00001110
1173 paddd xmm5, xmm41173 paddd xmm5, xmm4
1174 pshufd xmm4, xmm5, 1 ; 000000011174 pshufd xmm4, xmm5, 1 ; 00000001
1175 paddd xmm4, xmm51175 paddd xmm4, xmm5
1176 movd [r15], xmm41176 movd [r15], xmm4
1177 add dword psqdiff16x16, 41177 add dword psqdiff16x16, 4
1178 1178
1179 add r14,161179 add r14,16
1180 sub r0, r131180 sub r0, r13
1181 sub r1, r131181 sub r1, r13
1182 add r0, 161182 add r0, 16
1183 add r1, 161183 add r1, 16
1184 1184
1185 dec r21185 dec r2
1186 jnz sqdiff_width_loop1186 jnz sqdiff_width_loop
1187 1187
1188 pop r21188 pop r2
1189 %assign push_num push_num -11189 %assign push_num push_num -1
1190 1190
1191 mov r0, r101191 mov r0, r10
1192 mov r1, r111192 mov r1, r11
1193 add r0, r131193 add r0, r13
1194 add r1, r131194 add r1, r13
1195 1195
1196 dec r31196 dec r3
1197 jnz sqdiff_height_loop1197 jnz sqdiff_height_loop
1198 1198
1199 mov r13, psadframe1199 mov r13, psadframe
1200 movd [r13], xmm81200 movd [r13], xmm8
1201 1201
1202 POP_XMM1202 POP_XMM
1203 pop r151203 pop r15
1204 pop r141204 pop r14
1205 pop r131205 pop r13
1206 pop r121206 pop r12
1207 %assign push_num 01207 %assign push_num 0
1208 1208
1209%undef cur_data1209%undef cur_data
1210%undef ref_data1210%undef ref_data
@@ -1221,7 +1221,7 @@ sqdiff_width_loop: · 10 unmodified lines
1221%undef tmp_sadframe1221%undef tmp_sadframe
1222%undef pushsize1222%undef pushsize
1223%undef localsize1223%undef localsize
1224 ret1224 ret
1225 1225
1226 1226
1227 1227
@@ -1249,145 +1249,145 @@ WELS_EXTERN VAACalcSadBgd_sse2 · 21 unmodified lines
1249%define tmp_edi esp + 41249%define tmp_edi esp + 4
1250%define tmp_ecx esp + 81250%define tmp_ecx esp + 8
1251%define pushsize 161251%define pushsize 16
1252 push ebp1252 push ebp
1253 push esi1253 push esi
1254 push edi1254 push edi
1255 push ebx1255 push ebx
1256 sub esp, localsize1256 sub esp, localsize
1257 mov esi, [cur_data]1257 mov esi, [cur_data]
1258 mov edi, [ref_data]1258 mov edi, [ref_data]
1259 mov ebx, [iPicStride]1259 mov ebx, [iPicStride]
1260 mov eax, ebx1260 mov eax, ebx
1261 1261
1262 shr dword [iPicWidth], 4 ; iPicWidth/161262 shr dword [iPicWidth], 4 ; iPicWidth/16
1263 shr dword [iPicHeight], 4 ; iPicHeight/161263 shr dword [iPicHeight], 4 ; iPicHeight/16
1264 shl eax, 4 ; iPicStride*161264 shl eax, 4 ; iPicStride*16
1265 xor ebp, ebp1265 xor ebp, ebp
1266 pxor xmm0, xmm01266 pxor xmm0, xmm0
1267bgd_height_loop:1267bgd_height_loop:
1268 mov ecx, dword [iPicWidth]1268 mov ecx, dword [iPicWidth]
1269 mov [tmp_esi], esi1269 mov [tmp_esi], esi
1270 mov [tmp_edi], edi1270 mov [tmp_edi], edi
1271bgd_width_loop:1271bgd_width_loop:
1272 pxor xmm7, xmm7 ; pSad8x81272 pxor xmm7, xmm7 ; pSad8x8
1273 pxor xmm6, xmm6 ; sum_cur_8x81273 pxor xmm6, xmm6 ; sum_cur_8x8
1274 pxor xmm5, xmm5 ; sum_ref_8x81274 pxor xmm5, xmm5 ; sum_ref_8x8
1275 pxor xmm4, xmm4 ; pMad8x81275 pxor xmm4, xmm4 ; pMad8x8
1276 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx1276 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1277 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx1277 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1278 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx1278 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1279 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx1279 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1280 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx1280 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1281 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx1281 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1282 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx1282 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1283 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx1283 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1284 1284
1285 1285
1286 mov edx, [p_mad8x8]1286 mov edx, [p_mad8x8]
1287 WELS_MAX_REG_SSE2 xmm41287 WELS_MAX_REG_SSE2 xmm4
1288 1288
1289 ;movdqa xmm1, xmm41289 ;movdqa xmm1, xmm4
1290 ;punpcklbw xmm1, xmm01290 ;punpcklbw xmm1, xmm0
1291 ;punpcklwd xmm1, xmm01291 ;punpcklwd xmm1, xmm0
1292 ;movd [edx], xmm11292 ;movd [edx], xmm1
1293 ;punpckhbw xmm4, xmm01293 ;punpckhbw xmm4, xmm0
1294 ;punpcklwd xmm4, xmm01294 ;punpcklwd xmm4, xmm0
1295 ;movd [edx+4], xmm41295 ;movd [edx+4], xmm4
1296 ;add edx, 81296 ;add edx, 8
1297 ;mov [p_mad8x8], edx1297 ;mov [p_mad8x8], edx
1298 mov [tmp_ecx], ecx1298 mov [tmp_ecx], ecx
1299 movhlps xmm1, xmm41299 movhlps xmm1, xmm4
1300 movd ecx, xmm41300 movd ecx, xmm4
1301 mov [edx], cl1301 mov [edx], cl
1302 movd ecx, xmm11302 movd ecx, xmm1
1303 mov [edx+1],cl1303 mov [edx+1],cl
1304 add edx, 21304 add edx, 2
1305 mov [p_mad8x8], edx1305 mov [p_mad8x8], edx
1306 1306
1307 1307
1308 pslldq xmm7, 41308 pslldq xmm7, 4
1309 pslldq xmm6, 41309 pslldq xmm6, 4
1310 pslldq xmm5, 41310 pslldq xmm5, 4
1311 1311
1312 1312
1313 pxor xmm4, xmm4 ; pMad8x81313 pxor xmm4, xmm4 ; pMad8x8
1314 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx1314 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1315 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx1315 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1316 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx1316 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1317 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx1317 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1318 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx1318 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1319 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx1319 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1320 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx1320 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1321 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx1321 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,esi ,edi, ebx
1322 1322
1323 mov edx, [p_mad8x8]1323 mov edx, [p_mad8x8]
1324 WELS_MAX_REG_SSE2 xmm41324 WELS_MAX_REG_SSE2 xmm4
1325 1325
1326 ;movdqa xmm1, xmm41326 ;movdqa xmm1, xmm4
1327 ;punpcklbw xmm1, xmm01327 ;punpcklbw xmm1, xmm0
1328 ;punpcklwd xmm1, xmm01328 ;punpcklwd xmm1, xmm0
1329 ;movd [edx], xmm11329 ;movd [edx], xmm1
1330 ;punpckhbw xmm4, xmm01330 ;punpckhbw xmm4, xmm0
1331 ;punpcklwd xmm4, xmm01331 ;punpcklwd xmm4, xmm0
1332 ;movd [edx+4], xmm41332 ;movd [edx+4], xmm4
1333 ;add edx, 81333 ;add edx, 8
1334 ;mov [p_mad8x8], edx1334 ;mov [p_mad8x8], edx
1335 movhlps xmm1, xmm41335 movhlps xmm1, xmm4
1336 movd ecx, xmm41336 movd ecx, xmm4
1337 mov [edx], cl1337 mov [edx], cl
1338 movd ecx, xmm11338 movd ecx, xmm1
1339 mov [edx+1],cl1339 mov [edx+1],cl
1340 add edx, 21340 add edx, 2
1341 mov [p_mad8x8], edx1341 mov [p_mad8x8], edx
1342 1342
1343 ; data in xmm7, xmm6, xmm5: D1 D3 D0 D21343 ; data in xmm7, xmm6, xmm5: D1 D3 D0 D2
1344 1344
1345 mov edx, [psad8x8]1345 mov edx, [psad8x8]
1346 pshufd xmm1, xmm7, 10001101b ; D3 D2 D1 D01346 pshufd xmm1, xmm7, 10001101b ; D3 D2 D1 D0
1347 movdqa [edx], xmm11347 movdqa [edx], xmm1
1348 add edx, 161348 add edx, 16
1349 mov [psad8x8], edx ; sad8x81349 mov [psad8x8], edx ; sad8x8
1350 1350
1351 paddd xmm1, xmm7 ; D1+3 D3+2 D0+1 D2+01351 paddd xmm1, xmm7 ; D1+3 D3+2 D0+1 D2+0
1352 pshufd xmm2, xmm1, 00000011b1352 pshufd xmm2, xmm1, 00000011b
1353 paddd xmm1, xmm21353 paddd xmm1, xmm2
1354 movd edx, xmm11354 movd edx, xmm1
1355 add ebp, edx ; sad frame1355 add ebp, edx ; sad frame
1356 1356
1357 mov edx, [p_sd8x8]1357 mov edx, [p_sd8x8]
1358 psubd xmm6, xmm51358 psubd xmm6, xmm5
1359 pshufd xmm1, xmm6, 10001101b1359 pshufd xmm1, xmm6, 10001101b
1360 movdqa [edx], xmm11360 movdqa [edx], xmm1
1361 add edx, 161361 add edx, 16
1362 mov [p_sd8x8], edx1362 mov [p_sd8x8], edx
1363 1363
1364 1364
1365 add edx, 161365 add edx, 16
1366 sub esi, eax1366 sub esi, eax
1367 sub edi, eax1367 sub edi, eax
1368 add esi, 161368 add esi, 16
1369 add edi, 161369 add edi, 16
1370 1370
1371 mov ecx, [tmp_ecx]1371 mov ecx, [tmp_ecx]
1372 dec ecx1372 dec ecx
1373 jnz bgd_width_loop1373 jnz bgd_width_loop
1374 1374
1375 mov esi, [tmp_esi]1375 mov esi, [tmp_esi]
1376 mov edi, [tmp_edi]1376 mov edi, [tmp_edi]
1377 add esi, eax1377 add esi, eax
1378 add edi, eax1378 add edi, eax
1379 1379
1380 dec dword [iPicHeight]1380 dec dword [iPicHeight]
1381 jnz bgd_height_loop1381 jnz bgd_height_loop
1382 1382
1383 mov edx, [psadframe]1383 mov edx, [psadframe]
1384 mov [edx], ebp1384 mov [edx], ebp
1385 1385
1386 add esp, localsize1386 add esp, localsize
1387 pop ebx1387 pop ebx
1388 pop edi1388 pop edi
1389 pop esi1389 pop esi
1390 pop ebp1390 pop ebp
1391%undef cur_data1391%undef cur_data
1392%undef ref_data1392%undef ref_data
1393%undef iPicWidth1393%undef iPicWidth
@@ -1401,7 +1401,7 @@ bgd_width_loop: · 7 unmodified lines
1401%undef tmp_edi1401%undef tmp_edi
1402%undef pushsize1402%undef pushsize
1403%undef localsize1403%undef localsize
1404 ret1404 ret
1405 1405
1406 1406
1407 1407
@@ -1431,190 +1431,190 @@ WELS_EXTERN VAACalcSadSsdBgd_sse2 · 23 unmodified lines
1431%define tmp_sadframe esp + 81431%define tmp_sadframe esp + 8
1432%define tmp_ecx esp + 121432%define tmp_ecx esp + 12
1433%define pushsize 161433%define pushsize 16
1434 push ebp1434 push ebp
1435 push esi1435 push esi
1436 push edi1436 push edi
1437 push ebx1437 push ebx
1438 sub esp, localsize1438 sub esp, localsize
1439 mov esi, [cur_data]1439 mov esi, [cur_data]
1440 mov edi, [ref_data]1440 mov edi, [ref_data]
1441 mov ebx, [iPicStride]1441 mov ebx, [iPicStride]
1442 mov eax, ebx1442 mov eax, ebx
1443 1443
1444 shr dword [iPicWidth], 4 ; iPicWidth/161444 shr dword [iPicWidth], 4 ; iPicWidth/16
1445 shr dword [iPicHeight], 4 ; iPicHeight/161445 shr dword [iPicHeight], 4 ; iPicHeight/16
1446 shl eax, 4 ; iPicStride*161446 shl eax, 4 ; iPicStride*16
1447 pxor xmm0, xmm01447 pxor xmm0, xmm0
1448 movd [tmp_sadframe], xmm01448 movd [tmp_sadframe], xmm0
1449sqdiff_bgd_height_loop:1449sqdiff_bgd_height_loop:
1450 mov ecx, dword [iPicWidth]1450 mov ecx, dword [iPicWidth]
1451 mov [tmp_esi], esi1451 mov [tmp_esi], esi
1452 mov [tmp_edi], edi1452 mov [tmp_edi], edi
1453sqdiff_bgd_width_loop:1453sqdiff_bgd_width_loop:
1454 pxor xmm7, xmm7 ; pSad8x8 interleaves sqsum16x16: sqsum1 sad1 sqsum0 sad01454 pxor xmm7, xmm7 ; pSad8x8 interleaves sqsum16x16: sqsum1 sad1 sqsum0 sad0
1455 pxor xmm6, xmm6 ; sum_8x8 interleaves cur and pRef in Dword, Sref1 Scur1 Sref0 Scur01455 pxor xmm6, xmm6 ; sum_8x8 interleaves cur and pRef in Dword, Sref1 Scur1 Sref0 Scur0
1456 pxor xmm5, xmm5 ; pMad8x81456 pxor xmm5, xmm5 ; pMad8x8
1457 pxor xmm4, xmm4 ; sqdiff_16x16 four Dword1457 pxor xmm4, xmm4 ; sqdiff_16x16 four Dword
1458 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx1458 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1459 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx1459 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1460 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx1460 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1461 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx1461 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1462 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx1462 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1463 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx1463 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1464 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx1464 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1465 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx1465 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1466 1466
1467 mov edx, [psad8x8]1467 mov edx, [psad8x8]
1468 movdqa xmm2, xmm71468 movdqa xmm2, xmm7
1469 pshufd xmm1, xmm2, 00001110b1469 pshufd xmm1, xmm2, 00001110b
1470 movd [edx], xmm21470 movd [edx], xmm2
1471 movd [edx+4], xmm11471 movd [edx+4], xmm1
1472 add edx, 81472 add edx, 8
1473 mov [psad8x8], edx ; sad8x81473 mov [psad8x8], edx ; sad8x8
1474 1474
1475 paddd xmm1, xmm21475 paddd xmm1, xmm2
1476 movd edx, xmm11476 movd edx, xmm1
1477 add [tmp_sadframe], edx ; iFrameSad1477 add [tmp_sadframe], edx ; iFrameSad
1478 1478
1479 mov edx, [psum16x16]1479 mov edx, [psum16x16]
1480 movdqa xmm1, xmm61480 movdqa xmm1, xmm6
1481 pshufd xmm2, xmm1, 00001110b1481 pshufd xmm2, xmm1, 00001110b
1482 paddd xmm1, xmm21482 paddd xmm1, xmm2
1483 movd [edx], xmm1 ; sum1483 movd [edx], xmm1 ; sum
1484 1484
1485 mov edx, [p_sd8x8]1485 mov edx, [p_sd8x8]
1486 pshufd xmm1, xmm6, 11110101b ; Sref1 Sref1 Sref0 Sref01486 pshufd xmm1, xmm6, 11110101b ; Sref1 Sref1 Sref0 Sref0
1487 psubd xmm6, xmm1 ; 00 diff1 00 diff01487 psubd xmm6, xmm1 ; 00 diff1 00 diff0
1488 pshufd xmm1, xmm6, 00001000b ; xx xx diff1 diff01488 pshufd xmm1, xmm6, 00001000b ; xx xx diff1 diff0
1489 movq [edx], xmm11489 movq [edx], xmm1
1490 add edx, 81490 add edx, 8
1491 mov [p_sd8x8], edx1491 mov [p_sd8x8], edx
1492 1492
1493 mov edx, [p_mad8x8]1493 mov edx, [p_mad8x8]
1494 WELS_MAX_REG_SSE2 xmm51494 WELS_MAX_REG_SSE2 xmm5
1495 ;movdqa xmm1, xmm51495 ;movdqa xmm1, xmm5
1496 ;punpcklbw xmm1, xmm01496 ;punpcklbw xmm1, xmm0
1497 ;punpcklwd xmm1, xmm01497 ;punpcklwd xmm1, xmm0
1498 ;movd [edx], xmm11498 ;movd [edx], xmm1
1499 ;punpckhbw xmm5, xmm01499 ;punpckhbw xmm5, xmm0
1500 ;punpcklwd xmm5, xmm01500 ;punpcklwd xmm5, xmm0
1501 ;movd [edx+4], xmm51501 ;movd [edx+4], xmm5
1502 ;add edx, 81502 ;add edx, 8
1503 ;mov [p_mad8x8], edx1503 ;mov [p_mad8x8], edx
1504 mov [tmp_ecx], ecx1504 mov [tmp_ecx], ecx
1505 movhlps xmm1, xmm51505 movhlps xmm1, xmm5
1506 movd ecx, xmm51506 movd ecx, xmm5
1507 mov [edx], cl1507 mov [edx], cl
1508 movd ecx, xmm11508 movd ecx, xmm1
1509 mov [edx+1],cl1509 mov [edx+1],cl
1510 add edx, 21510 add edx, 2
1511 mov [p_mad8x8], edx1511 mov [p_mad8x8], edx
1512 1512
1513 psrlq xmm7, 321513 psrlq xmm7, 32
1514 psllq xmm7, 32 ; clear sad1514 psllq xmm7, 32 ; clear sad
1515 pxor xmm6, xmm6 ; sum_8x8 interleaves cur and pRef in Dword, Sref1 Scur1 Sref0 Scur01515 pxor xmm6, xmm6 ; sum_8x8 interleaves cur and pRef in Dword, Sref1 Scur1 Sref0 Scur0
1516 pxor xmm5, xmm5 ; pMad8x81516 pxor xmm5, xmm5 ; pMad8x8
1517 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx1517 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1518 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx1518 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1519 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx1519 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1520 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx1520 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1521 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx1521 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1522 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx1522 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1523 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx1523 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1524 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx1524 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, esi , edi , ebx
1525 1525
1526 mov edx, [psad8x8]1526 mov edx, [psad8x8]
1527 movdqa xmm2, xmm71527 movdqa xmm2, xmm7
1528 pshufd xmm1, xmm2, 00001110b1528 pshufd xmm1, xmm2, 00001110b
1529 movd [edx], xmm21529 movd [edx], xmm2
1530 movd [edx+4], xmm11530 movd [edx+4], xmm1
1531 add edx, 81531 add edx, 8
1532 mov [psad8x8], edx ; sad8x81532 mov [psad8x8], edx ; sad8x8
1533 1533
1534 paddd xmm1, xmm21534 paddd xmm1, xmm2
1535 movd edx, xmm11535 movd edx, xmm1
1536 add [tmp_sadframe], edx ; iFrameSad1536 add [tmp_sadframe], edx ; iFrameSad
1537 1537
1538 mov edx, [psum16x16]1538 mov edx, [psum16x16]
1539 movdqa xmm1, xmm61539 movdqa xmm1, xmm6
1540 pshufd xmm2, xmm1, 00001110b1540 pshufd xmm2, xmm1, 00001110b
1541 paddd xmm1, xmm21541 paddd xmm1, xmm2
1542 movd ebp, xmm1 ; sum1542 movd ebp, xmm1 ; sum
1543 add [edx], ebp1543 add [edx], ebp
1544 add edx, 41544 add edx, 4
1545 mov [psum16x16], edx1545 mov [psum16x16], edx
1546 1546
1547 mov edx, [psqsum16x16]1547 mov edx, [psqsum16x16]
1548 psrlq xmm7, 321548 psrlq xmm7, 32
1549 pshufd xmm2, xmm7, 00001110b1549 pshufd xmm2, xmm7, 00001110b
1550 paddd xmm2, xmm71550 paddd xmm2, xmm7
1551 movd [edx], xmm2 ; sqsum1551 movd [edx], xmm2 ; sqsum
1552 add edx, 41552 add edx, 4
1553 mov [psqsum16x16], edx1553 mov [psqsum16x16], edx
1554 1554
1555 mov edx, [p_sd8x8]1555 mov edx, [p_sd8x8]
1556 pshufd xmm1, xmm6, 11110101b ; Sref1 Sref1 Sref0 Sref01556 pshufd xmm1, xmm6, 11110101b ; Sref1 Sref1 Sref0 Sref0
1557 psubd xmm6, xmm1 ; 00 diff1 00 diff01557 psubd xmm6, xmm1 ; 00 diff1 00 diff0
1558 pshufd xmm1, xmm6, 00001000b ; xx xx diff1 diff01558 pshufd xmm1, xmm6, 00001000b ; xx xx diff1 diff0
1559 movq [edx], xmm11559 movq [edx], xmm1
1560 add edx, 81560 add edx, 8
1561 mov [p_sd8x8], edx1561 mov [p_sd8x8], edx
1562 1562
1563 mov edx, [p_mad8x8]1563 mov edx, [p_mad8x8]
1564 WELS_MAX_REG_SSE2 xmm51564 WELS_MAX_REG_SSE2 xmm5
1565 ;movdqa xmm1, xmm51565 ;movdqa xmm1, xmm5
1566 ;punpcklbw xmm1, xmm01566 ;punpcklbw xmm1, xmm0
1567 ;punpcklwd xmm1, xmm01567 ;punpcklwd xmm1, xmm0
1568 ;movd [edx], xmm11568 ;movd [edx], xmm1
1569 ;punpckhbw xmm5, xmm01569 ;punpckhbw xmm5, xmm0
1570 ;punpcklwd xmm5, xmm01570 ;punpcklwd xmm5, xmm0
1571 ;movd [edx+4], xmm51571 ;movd [edx+4], xmm5
1572 ;add edx, 81572 ;add edx, 8
1573 ;mov [p_mad8x8], edx1573 ;mov [p_mad8x8], edx
1574 movhlps xmm1, xmm51574 movhlps xmm1, xmm5
1575 movd ecx, xmm51575 movd ecx, xmm5
1576 mov [edx], cl1576 mov [edx], cl
1577 movd ecx, xmm11577 movd ecx, xmm1
1578 mov [edx+1],cl1578 mov [edx+1],cl
1579 add edx, 21579 add edx, 2
1580 mov [p_mad8x8], edx1580 mov [p_mad8x8], edx
1581 1581
1582 mov edx, [psqdiff16x16]1582 mov edx, [psqdiff16x16]
1583 pshufd xmm1, xmm4, 00001110b1583 pshufd xmm1, xmm4, 00001110b
1584 paddd xmm4, xmm11584 paddd xmm4, xmm1
1585 pshufd xmm1, xmm4, 00000001b1585 pshufd xmm1, xmm4, 00000001b
1586 paddd xmm4, xmm11586 paddd xmm4, xmm1
1587 movd [edx], xmm41587 movd [edx], xmm4
1588 add edx, 41588 add edx, 4
1589 mov [psqdiff16x16], edx1589 mov [psqdiff16x16], edx
1590 1590
1591 add edx, 161591 add edx, 16
1592 sub esi, eax1592 sub esi, eax
1593 sub edi, eax1593 sub edi, eax
1594 add esi, 161594 add esi, 16
1595 add edi, 161595 add edi, 16
1596 1596
1597 mov ecx, [tmp_ecx]1597 mov ecx, [tmp_ecx]
1598 dec ecx1598 dec ecx
1599 jnz sqdiff_bgd_width_loop1599 jnz sqdiff_bgd_width_loop
1600 1600
1601 mov esi, [tmp_esi]1601 mov esi, [tmp_esi]
1602 mov edi, [tmp_edi]1602 mov edi, [tmp_edi]
1603 add esi, eax1603 add esi, eax
1604 add edi, eax1604 add edi, eax
1605 1605
1606 dec dword [iPicHeight]1606 dec dword [iPicHeight]
1607 jnz sqdiff_bgd_height_loop1607 jnz sqdiff_bgd_height_loop
1608 1608
1609 mov edx, [psadframe]1609 mov edx, [psadframe]
1610 mov ebp, [tmp_sadframe]1610 mov ebp, [tmp_sadframe]
1611 mov [edx], ebp1611 mov [edx], ebp
1612 1612
1613 add esp, localsize1613 add esp, localsize
1614 pop ebx1614 pop ebx
1615 pop edi1615 pop edi
1616 pop esi1616 pop esi
1617 pop ebp1617 pop ebp
1618%undef cur_data1618%undef cur_data
1619%undef ref_data1619%undef ref_data
1620%undef iPicWidth1620%undef iPicWidth
@@ -1631,7 +1631,7 @@ sqdiff_bgd_width_loop: · 10 unmodified lines
1631%undef tmp_edi1631%undef tmp_edi
1632%undef pushsize1632%undef pushsize
1633%undef localsize1633%undef localsize
1634 ret1634 ret
1635%else1635%else
1636 1636
1637;*************************************************************************************************************1637;*************************************************************************************************************
@@ -1651,142 +1651,142 @@ WELS_EXTERN VAACalcSadBgd_sse2 · 13 unmodified lines
1651%define p_sd8x8 arg8;1651%define p_sd8x8 arg8;
1652%define p_mad8x8 arg9;1652%define p_mad8x8 arg9;
1653 1653
1654 push r121654 push r12
1655 push r131655 push r13
1656 push r141656 push r14
1657 push r151657 push r15
1658%assign push_num 41658%assign push_num 4
1659 PUSH_XMM 101659 PUSH_XMM 10
1660%ifdef WIN641660%ifdef WIN64
1661 mov r4,arg51661 mov r4,arg5
1662 ; mov r5,arg61662 ; mov r5,arg6
1663%endif1663%endif
1664 mov r14,arg71664 mov r14,arg7
1665 SIGN_EXTENSION r2,r2d1665 SIGN_EXTENSION r2,r2d
1666 SIGN_EXTENSION r3,r3d1666 SIGN_EXTENSION r3,r3d
1667 SIGN_EXTENSION r4,r4d1667 SIGN_EXTENSION r4,r4d
1668 1668
1669 1669
1670 mov r13,r41670 mov r13,r4
1671 mov r15,r01671 mov r15,r0
1672 shr r2,41672 shr r2,4
1673 shr r3,41673 shr r3,4
1674 shl r13,41674 shl r13,4
1675 pxor xmm0, xmm01675 pxor xmm0, xmm0
1676 pxor xmm8, xmm81676 pxor xmm8, xmm8
1677 pxor xmm9, xmm91677 pxor xmm9, xmm9
1678bgd_height_loop:1678bgd_height_loop:
1679 ;mov ecx, dword [iPicWidth]1679 ;mov ecx, dword [iPicWidth]
1680 push r21680 push r2
1681 %assign push_num push_num+11681 %assign push_num push_num+1
1682 mov r10, r151682 mov r10, r15
1683 mov r11, r11683 mov r11, r1
1684bgd_width_loop:1684bgd_width_loop:
1685 pxor xmm7, xmm7 ; pSad8x81685 pxor xmm7, xmm7 ; pSad8x8
1686 pxor xmm6, xmm6 ; sum_cur_8x81686 pxor xmm6, xmm6 ; sum_cur_8x8
1687 pxor xmm5, xmm5 ; sum_ref_8x81687 pxor xmm5, xmm5 ; sum_ref_8x8
1688 pxor xmm4, xmm4 ; pMad8x81688 pxor xmm4, xmm4 ; pMad8x8
1689 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r41689 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1690 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r41690 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1691 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r41691 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1692 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r41692 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1693 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r41693 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1694 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r41694 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1695 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r41695 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1696 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r41696 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1697 1697
1698 1698
1699 mov r14, p_mad8x81699 mov r14, p_mad8x8
1700 WELS_MAX_REG_SSE2 xmm41700 WELS_MAX_REG_SSE2 xmm4
1701 1701
1702 ;mov [tmp_ecx], ecx1702 ;mov [tmp_ecx], ecx
1703 movhlps xmm1, xmm41703 movhlps xmm1, xmm4
1704 movd r0d, xmm41704 movd r0d, xmm4
1705 1705
1706 1706
1707 mov [r14], r0b1707 mov [r14], r0b
1708 movd r0d, xmm11708 movd r0d, xmm1
1709 mov [r14+1],r0b1709 mov [r14+1],r0b
1710 add r14, 21710 add r14, 2
1711 ;mov p_mad8x8, r141711 ;mov p_mad8x8, r14
1712 1712
1713 1713
1714 pslldq xmm7, 41714 pslldq xmm7, 4
1715 pslldq xmm6, 41715 pslldq xmm6, 4
1716 pslldq xmm5, 41716 pslldq xmm5, 4
1717 1717
1718 1718
1719 pxor xmm4, xmm4 ; pMad8x81719 pxor xmm4, xmm4 ; pMad8x8
1720 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r41720 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1721 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r41721 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1722 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r41722 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1723 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r41723 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1724 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r41724 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1725 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r41725 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1726 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r41726 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1727 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r41727 WELS_SAD_SD_MAD_16x1_SSE2 xmm7, xmm6, xmm5, xmm4 ,r15 ,r1, r4
1728 1728
1729 ;mov r14, [p_mad8x8]1729 ;mov r14, [p_mad8x8]
1730 WELS_MAX_REG_SSE2 xmm41730 WELS_MAX_REG_SSE2 xmm4
1731 1731
1732 movhlps xmm1, xmm41732 movhlps xmm1, xmm4
1733 movd r0d, xmm41733 movd r0d, xmm4
1734 mov [r14], r0b1734 mov [r14], r0b
1735 movd r0d, xmm11735 movd r0d, xmm1
1736 mov [r14+1],r0b1736 mov [r14+1],r0b
1737 add r14, 21737 add r14, 2
1738 mov p_mad8x8, r141738 mov p_mad8x8, r14
1739 1739
1740 ; data in xmm7, xmm6, xmm5: D1 D3 D0 D21740 ; data in xmm7, xmm6, xmm5: D1 D3 D0 D2
1741 1741
1742 mov r14, psad8x81742 mov r14, psad8x8
1743 pshufd xmm1, xmm7, 10001101b ; D3 D2 D1 D01743 pshufd xmm1, xmm7, 10001101b ; D3 D2 D1 D0
1744 movdqa [r14], xmm11744 movdqa [r14], xmm1
1745 add r14, 161745 add r14, 16
1746 mov psad8x8, r14 ; sad8x81746 mov psad8x8, r14 ; sad8x8
1747 1747
1748 paddd xmm1, xmm7 ; D1+3 D3+2 D0+1 D2+01748 paddd xmm1, xmm7 ; D1+3 D3+2 D0+1 D2+0
1749 pshufd xmm2, xmm1, 00000011b1749 pshufd xmm2, xmm1, 00000011b
1750 paddd xmm1, xmm21750 paddd xmm1, xmm2
1751 movd r14d, xmm11751 movd r14d, xmm1
1752 movd xmm9, r14d1752 movd xmm9, r14d
1753 paddd xmm8, xmm9 ; sad frame1753 paddd xmm8, xmm9 ; sad frame
1754 1754
1755 mov r14, p_sd8x81755 mov r14, p_sd8x8
1756 psubd xmm6, xmm51756 psubd xmm6, xmm5
1757 pshufd xmm1, xmm6, 10001101b1757 pshufd xmm1, xmm6, 10001101b
1758 movdqa [r14], xmm11758 movdqa [r14], xmm1
1759 add r14, 161759 add r14, 16
1760 mov p_sd8x8, r141760 mov p_sd8x8, r14
1761 1761
1762 1762
1763 ;add edx, 161763 ;add edx, 16
1764 sub r15, r131764 sub r15, r13
1765 sub r1, r131765 sub r1, r13
1766 add r15, 161766 add r15, 16
1767 add r1, 161767 add r1, 16
1768 1768
1769 1769
1770 dec r21770 dec r2
1771 jnz bgd_width_loop1771 jnz bgd_width_loop
1772 pop r21772 pop r2
1773%assign push_num push_num-11773%assign push_num push_num-1
1774 mov r15, r101774 mov r15, r10
1775 mov r1, r111775 mov r1, r11
1776 add r15, r131776 add r15, r13
1777 add r1, r131777 add r1, r13
1778 1778
1779 dec r31779 dec r3
1780 jnz bgd_height_loop1780 jnz bgd_height_loop
1781 1781
1782 mov r13, psadframe1782 mov r13, psadframe
1783 movd [r13], xmm81783 movd [r13], xmm8
1784 1784
1785 POP_XMM1785 POP_XMM
1786 pop r151786 pop r15
1787 pop r141787 pop r14
1788 pop r131788 pop r13
1789 pop r121789 pop r12
1790%assign push_num 01790%assign push_num 0
1791%undef cur_data1791%undef cur_data
1792%undef ref_data1792%undef ref_data
@@ -1801,7 +1801,7 @@ bgd_width_loop: · 8 unmodified lines
1801%undef tmp_edi1801%undef tmp_edi
1802%undef pushsize1802%undef pushsize
1803%undef localsize1803%undef localsize
1804 ret1804 ret
1805 1805
1806 1806
1807 1807
@@ -1826,189 +1826,189 @@ WELS_EXTERN VAACalcSadSsdBgd_sse2 · 18 unmodified lines
1826%define p_sd8x8 arg111826%define p_sd8x8 arg11
1827%define p_mad8x8 arg121827%define p_mad8x8 arg12
1828 1828
1829 push r121829 push r12
1830 push r131830 push r13
1831 push r141831 push r14
1832 push r151832 push r15
1833%assign push_num 41833%assign push_num 4
1834 PUSH_XMM 101834 PUSH_XMM 10
1835%ifdef WIN641835%ifdef WIN64
1836 mov r4,arg51836 mov r4,arg5
1837 ;mov r5,arg61837 ;mov r5,arg6
1838%endif1838%endif
1839 SIGN_EXTENSION r2,r2d1839 SIGN_EXTENSION r2,r2d
1840 SIGN_EXTENSION r3,r3d1840 SIGN_EXTENSION r3,r3d
1841 SIGN_EXTENSION r4,r4d1841 SIGN_EXTENSION r4,r4d
1842 1842
1843 mov r13,r41843 mov r13,r4
1844 shr r2, 4 ; iPicWidth/161844 shr r2, 4 ; iPicWidth/16
1845 shr r3, 4 ; iPicHeight/161845 shr r3, 4 ; iPicHeight/16
1846 shl r13, 4 ; iPicStride*161846 shl r13, 4 ; iPicStride*16
1847 pxor xmm0, xmm01847 pxor xmm0, xmm0
1848 pxor xmm8, xmm81848 pxor xmm8, xmm8
1849 pxor xmm9, xmm91849 pxor xmm9, xmm9
1850 1850
1851 1851
1852sqdiff_bgd_height_loop:1852sqdiff_bgd_height_loop:
1853 mov r10, r01853 mov r10, r0
1854 mov r11, r11854 mov r11, r1
1855 push r21855 push r2
1856%assign push_num push_num+11856%assign push_num push_num+1
1857sqdiff_bgd_width_loop:1857sqdiff_bgd_width_loop:
1858 1858
1859 pxor xmm7, xmm7 ; pSad8x8 interleaves sqsum16x16: sqsum1 sad1 sqsum0 sad01859 pxor xmm7, xmm7 ; pSad8x8 interleaves sqsum16x16: sqsum1 sad1 sqsum0 sad0
1860 pxor xmm6, xmm6 ; sum_8x8 interleaves cur and pRef in Dword, Sref1 Scur1 Sref0 Scur01860 pxor xmm6, xmm6 ; sum_8x8 interleaves cur and pRef in Dword, Sref1 Scur1 Sref0 Scur0
1861 pxor xmm5, xmm5 ; pMad8x81861 pxor xmm5, xmm5 ; pMad8x8
1862 pxor xmm4, xmm4 ; sqdiff_16x16 four Dword1862 pxor xmm4, xmm4 ; sqdiff_16x16 four Dword
1863 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r41863 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1864 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r41864 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1865 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r41865 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1866 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r41866 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1867 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r41867 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1868 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r41868 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1869 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r41869 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1870 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r41870 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1871 1871
1872 mov r14, psad8x81872 mov r14, psad8x8
1873 movdqa xmm2, xmm71873 movdqa xmm2, xmm7
1874 pshufd xmm1, xmm2, 00001110b1874 pshufd xmm1, xmm2, 00001110b
1875 movd [r14], xmm21875 movd [r14], xmm2
1876 movd [r14+4], xmm11876 movd [r14+4], xmm1
1877 add r14, 81877 add r14, 8
1878 mov psad8x8, r14 ; sad8x81878 mov psad8x8, r14 ; sad8x8
1879 1879
1880 paddd xmm1, xmm21880 paddd xmm1, xmm2
1881 movd r14d, xmm11881 movd r14d, xmm1
1882 movd xmm9,r14d1882 movd xmm9,r14d
1883 paddd xmm8, xmm9 ; iFrameSad1883 paddd xmm8, xmm9 ; iFrameSad
1884 1884
1885 mov r14, psum16x161885 mov r14, psum16x16
1886 movdqa xmm1, xmm61886 movdqa xmm1, xmm6
1887 pshufd xmm2, xmm1, 00001110b1887 pshufd xmm2, xmm1, 00001110b
1888 paddd xmm1, xmm21888 paddd xmm1, xmm2
1889 movd [r14], xmm1 ; sum1889 movd [r14], xmm1 ; sum
1890 1890
1891 mov r14, p_sd8x81891 mov r14, p_sd8x8
1892 pshufd xmm1, xmm6, 11110101b ; Sref1 Sref1 Sref0 Sref01892 pshufd xmm1, xmm6, 11110101b ; Sref1 Sref1 Sref0 Sref0
1893 psubd xmm6, xmm1 ; 00 diff1 00 diff01893 psubd xmm6, xmm1 ; 00 diff1 00 diff0
1894 pshufd xmm1, xmm6, 00001000b ; xx xx diff1 diff01894 pshufd xmm1, xmm6, 00001000b ; xx xx diff1 diff0
1895 movq [r14], xmm11895 movq [r14], xmm1
1896 add r14, 81896 add r14, 8
1897 mov p_sd8x8, r141897 mov p_sd8x8, r14
1898 1898
1899 mov r14, p_mad8x81899 mov r14, p_mad8x8
1900 WELS_MAX_REG_SSE2 xmm51900 WELS_MAX_REG_SSE2 xmm5
1901 1901
1902 movhlps xmm1, xmm51902 movhlps xmm1, xmm5
1903 push r01903 push r0
1904 movd r0d, xmm51904 movd r0d, xmm5
1905 mov [r14], r0b1905 mov [r14], r0b
1906 movd r0d, xmm11906 movd r0d, xmm1
1907 mov [r14+1],r0b1907 mov [r14+1],r0b
1908 pop r01908 pop r0
1909 add r14, 21909 add r14, 2
1910 mov p_mad8x8, r141910 mov p_mad8x8, r14
1911 1911
1912 psrlq xmm7, 321912 psrlq xmm7, 32
1913 psllq xmm7, 32 ; clear sad1913 psllq xmm7, 32 ; clear sad
1914 pxor xmm6, xmm6 ; sum_8x8 interleaves cur and pRef in Dword, Sref1 Scur1 Sref0 Scur01914 pxor xmm6, xmm6 ; sum_8x8 interleaves cur and pRef in Dword, Sref1 Scur1 Sref0 Scur0
1915 pxor xmm5, xmm5 ; pMad8x81915 pxor xmm5, xmm5 ; pMad8x8
1916 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r41916 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1917 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r41917 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1918 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r41918 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1919 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r41919 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1920 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r41920 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1921 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r41921 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1922 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r41922 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1923 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r41923 WELS_SAD_BGD_SQDIFF_16x1_SSE2 xmm7, xmm6, xmm5, xmm4, r0 , r1 , r4
1924 1924
1925 mov r14, psad8x81925 mov r14, psad8x8
1926 movdqa xmm2, xmm71926 movdqa xmm2, xmm7
1927 pshufd xmm1, xmm2, 00001110b1927 pshufd xmm1, xmm2, 00001110b
1928 movd [r14], xmm21928 movd [r14], xmm2
1929 movd [r14+4], xmm11929 movd [r14+4], xmm1
1930 add r14, 81930 add r14, 8
1931 mov psad8x8, r14 ; sad8x81931 mov psad8x8, r14 ; sad8x8
1932 1932
1933 paddd xmm1, xmm21933 paddd xmm1, xmm2
1934 movd r14d, xmm11934 movd r14d, xmm1
1935 movd xmm9, r14d1935 movd xmm9, r14d
1936 paddd xmm8, xmm9 ; iFrameSad1936 paddd xmm8, xmm9 ; iFrameSad
1937 1937
1938 mov r14, psum16x161938 mov r14, psum16x16
1939 movdqa xmm1, xmm61939 movdqa xmm1, xmm6
1940 pshufd xmm2, xmm1, 00001110b1940 pshufd xmm2, xmm1, 00001110b
1941 paddd xmm1, xmm21941 paddd xmm1, xmm2
1942 movd r15d, xmm1 ; sum1942 movd r15d, xmm1 ; sum
1943 add [r14], r15d1943 add [r14], r15d
1944 add r14, 41944 add r14, 4
1945 mov psum16x16, r141945 mov psum16x16, r14
1946 1946
1947 mov r14, psqsum16x161947 mov r14, psqsum16x16
1948 psrlq xmm7, 321948 psrlq xmm7, 32
1949 pshufd xmm2, xmm7, 00001110b1949 pshufd xmm2, xmm7, 00001110b
1950 paddd xmm2, xmm71950 paddd xmm2, xmm7
1951 movd [r14], xmm2 ; sqsum1951 movd [r14], xmm2 ; sqsum
1952 add r14, 41952 add r14, 4
1953 mov psqsum16x16, r141953 mov psqsum16x16, r14
1954 1954
1955 mov r14, p_sd8x81955 mov r14, p_sd8x8
1956 pshufd xmm1, xmm6, 11110101b ; Sref1 Sref1 Sref0 Sref01956 pshufd xmm1, xmm6, 11110101b ; Sref1 Sref1 Sref0 Sref0
1957 psubd xmm6, xmm1 ; 00 diff1 00 diff01957 psubd xmm6, xmm1 ; 00 diff1 00 diff0
1958 pshufd xmm1, xmm6, 00001000b ; xx xx diff1 diff01958 pshufd xmm1, xmm6, 00001000b ; xx xx diff1 diff0
1959 movq [r14], xmm11959 movq [r14], xmm1
1960 add r14, 81960 add r14, 8
1961 mov p_sd8x8, r141961 mov p_sd8x8, r14
1962 1962
1963 mov r14, p_mad8x81963 mov r14, p_mad8x8
1964 WELS_MAX_REG_SSE2 xmm51964 WELS_MAX_REG_SSE2 xmm5
1965 1965
1966 1966
1967 movhlps xmm1, xmm51967 movhlps xmm1, xmm5
1968 push r01968 push r0
1969 movd r0d, xmm51969 movd r0d, xmm5
1970 mov [r14], r0b1970 mov [r14], r0b
1971 movd r0d, xmm11971 movd r0d, xmm1
1972 mov [r14+1],r0b1972 mov [r14+1],r0b
1973 pop r01973 pop r0
1974 add r14, 21974 add r14, 2
1975 mov p_mad8x8, r141975 mov p_mad8x8, r14
1976 1976
1977 mov r14, psqdiff16x161977 mov r14, psqdiff16x16
1978 pshufd xmm1, xmm4, 00001110b1978 pshufd xmm1, xmm4, 00001110b
1979 paddd xmm4, xmm11979 paddd xmm4, xmm1
1980 pshufd xmm1, xmm4, 00000001b1980 pshufd xmm1, xmm4, 00000001b
1981 paddd xmm4, xmm11981 paddd xmm4, xmm1
1982 movd [r14], xmm41982 movd [r14], xmm4
1983 add r14, 41983 add r14, 4
1984 mov psqdiff16x16, r141984 mov psqdiff16x16, r14
1985 1985
1986 add r14, 161986 add r14, 16
1987 sub r0, r131987 sub r0, r13
1988 sub r1, r131988 sub r1, r13
1989 add r0, 161989 add r0, 16
1990 add r1, 161990 add r1, 16
1991 1991
1992 dec r21992 dec r2
1993 jnz sqdiff_bgd_width_loop1993 jnz sqdiff_bgd_width_loop
1994 pop r21994 pop r2
1995 %assign push_num push_num-11995 %assign push_num push_num-1
1996 mov r0, r101996 mov r0, r10
1997 mov r1, r111997 mov r1, r11
1998 add r0, r131998 add r0, r13
1999 add r1, r131999 add r1, r13
2000 2000
2001 dec r32001 dec r3
2002 jnz sqdiff_bgd_height_loop2002 jnz sqdiff_bgd_height_loop
2003 2003
2004 mov r14, psadframe2004 mov r14, psadframe
2005 movd [r14], xmm82005 movd [r14], xmm8
2006 2006
2007 POP_XMM2007 POP_XMM
2008 pop r152008 pop r15
2009 pop r142009 pop r14
2010 pop r132010 pop r13
2011 pop r122011 pop r12
2012%assign push_num 02012%assign push_num 0
2013%undef cur_data2013%undef cur_data
2014%undef ref_data2014%undef ref_data
@@ -2026,5 +2026,5 @@ sqdiff_bgd_width_loop: · 11 unmodified lines
2026%undef tmp_edi2026%undef tmp_edi
2027%undef pushsize2027%undef pushsize
2028%undef localsize2028%undef localsize
2029 ret2029 ret
2030%endif2030%endif

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t