Publishing 2019 R1 content
[platform/upstream/dldt.git] / inference-engine / thirdparty / mkl-dnn / src / cpu / gemm / s8x8s32 / jit_avx512_core_u8_copy_sum_an_kern.cpp
1 /*******************************************************************************
2 * Copyright 2018 Intel Corporation
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *     http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 *******************************************************************************/
16
17 #include "jit_generator.hpp"
18 #include "common.hpp"
19
20 namespace mkldnn {
21 namespace impl {
22 namespace cpu {
23
24 jit_avx512_core_u8_copy_sum_an_kern::jit_avx512_core_u8_copy_sum_an_kern(): jit_generator(nullptr, GEMM_CODE_SIZE)
25 {
26
27 #ifndef _WIN32
28 #define M       rdi
29 #define N       rsi
30 #define A       rdx
31 #define LDA     rcx
32 #define ALPHA   r8
33 #define B       r9
34
35 #define I       rax
36 #define A1      r10
37 #define A2      r8
38 #define LDA3    r11
39
40 #define ARG_BIAS        24+stacksize+rsp
41
42 #else
43
44 #define M       rcx
45 #define N       rdx
46 #define A       r8
47 #define LDA     r9
48 #define ALPHA   rax
49 #define B       rdi
50
51 #define I       rax
52 #define A1      rsi
53 #define A2      r10
54 #define LDA3    r11
55
56 #define ARG_ALPHA       40+stacksize+rsp
57 #define ARG_B           48+stacksize+rsp
58 #define ARG_BIAS        72+stacksize+rsp
59
60 #endif
61
62 inLocalLabel();
63 {
64
65 Xbyak::Label l1024;
66 Xbyak::Label l1090;
67 Xbyak::Label l10d4;
68 Xbyak::Label l10fc;
69 Xbyak::Label l111a;
70 Xbyak::Label l1124;
71 Xbyak::Label l113c;
72 Xbyak::Label l11d4;
73 Xbyak::Label l1234;
74 Xbyak::Label l1278;
75 Xbyak::Label l129c;
76 Xbyak::Label l12bc;
77 Xbyak::Label l20;
78 Xbyak::Label l2a0;
79 Xbyak::Label l3c0;
80 Xbyak::Label l438;
81 Xbyak::Label l480;
82 Xbyak::Label l48c;
83 Xbyak::Label l4c8;
84 Xbyak::Label l5c;
85 Xbyak::Label l6a8;
86 Xbyak::Label l7b4;
87 Xbyak::Label l850;
88 Xbyak::Label l89c;
89 Xbyak::Label l8a8;
90 Xbyak::Label l8d0;
91 Xbyak::Label l9d0;
92 Xbyak::Label la64;
93 Xbyak::Label lab8;
94 Xbyak::Label lae8;
95 Xbyak::Label laf4;
96 Xbyak::Label lb14;
97 Xbyak::Label lc30;
98 Xbyak::Label lcc8;
99 Xbyak::Label ld1c;
100 Xbyak::Label ld54;
101 Xbyak::Label ld78;
102 Xbyak::Label ld84;
103 Xbyak::Label ld9c;
104 Xbyak::Label le58;
105 Xbyak::Label lebc;
106 Xbyak::Label lef8;
107 Xbyak::Label lf1c;
108 Xbyak::Label lf3c;
109 Xbyak::Label lf48;
110 Xbyak::Label lf60;
111
112         preamble();
113         auto stacksize = get_size_of_abi_save_regs();
114 #ifdef _WIN32
115         mov(ALPHA, ptr[ARG_ALPHA]);
116         mov(B, ptr[ARG_B]);
117 #endif
118
119         mov(M, qword[M]);
120         mov(N, qword[N]);
121         mov(LDA, qword[LDA]);
122         lea(LDA3, ptr[LDA+LDA*2]);
123         sub(A, -128);
124         sub(B, -128);
125         cmp(N, 0x30);
126         jl(l480, T_NEAR);
127         align(4);
128
129 L(l20);
130         mov(A1, A);
131         add(A, 0x30);
132         vxorps(ymm8, ymm8, ymm8);
133         vxorps(ymm9, ymm9, ymm9);
134         vxorps(ymm10, ymm10, ymm10);
135         vxorps(ymm11, ymm11, ymm11);
136         vxorps(ymm12, ymm12, ymm12);
137         vxorps(ymm13, ymm13, ymm13);
138         vxorps(ymm14, ymm14, ymm14);
139         vxorps(ymm15, ymm15, ymm15);
140         mov(I, M);
141         sar(I, 0x2);
142         jle(l2a0, T_NEAR);
143         align(4);
144
145 L(l5c);
146         vmovdqu(xmm0, xword[A1-0x80]);
147         vmovdqu(xmm1, xword[A1+LDA*1-0x80]);
148         vmovdqu(xmm2, xword[A1+LDA*2-0x80]);
149         vmovdqu(xmm3, xword[A1+LDA3*1-0x80]);
150         vpunpcklbw(xmm4, xmm0, xmm1);
151         vpunpckhbw(xmm5, xmm0, xmm1);
152         vpunpcklbw(xmm6, xmm2, xmm3);
153         vpunpckhbw(xmm7, xmm2, xmm3);
154         vpunpcklwd(xmm0, xmm4, xmm6);
155         vpunpckhwd(xmm1, xmm4, xmm6);
156         vpunpcklwd(xmm2, xmm5, xmm7);
157         vpunpckhwd(xmm3, xmm5, xmm7);
158         vpmovsxbw(ymm5, xmm0);
159         vmovhlps(xmm6, xmm0, xmm0);
160         vpmovsxbw(ymm6, xmm6);
161         vphaddw(ymm5, ymm5, ymm6);
162         vpmovsxbw(ymm6, xmm1);
163         vmovhlps(xmm7, xmm1, xmm1);
164         vpmovsxbw(ymm7, xmm7);
165         vphaddw(ymm6, ymm6, ymm7);
166         vphaddw(ymm5, ymm5, ymm6);
167         vpmovsxwd(ymm5, xmm5);
168         vpaddd(ymm8, ymm8, ymm5);
169         vmovdqu(xword[B-0x80], xmm0);
170         vmovdqu(xword[B-0x70], xmm1);
171         vpmovsxbw(ymm5, xmm2);
172         vmovhlps(xmm6, xmm2, xmm2);
173         vpmovsxbw(ymm6, xmm6);
174         vphaddw(ymm5, ymm5, ymm6);
175         vpmovsxbw(ymm6, xmm3);
176         vmovhlps(xmm7, xmm3, xmm3);
177         vpmovsxbw(ymm7, xmm7);
178         vphaddw(ymm6, ymm6, ymm7);
179         vphaddw(ymm5, ymm5, ymm6);
180         vpmovsxwd(ymm5, xmm5);
181         vpaddd(ymm9, ymm9, ymm5);
182         vmovdqu(xword[B-0x60], xmm2);
183         vmovdqu(xword[B-0x50], xmm3);
184         vmovdqu(xmm0, xword[A1-0x70]);
185         vmovdqu(xmm1, xword[A1+LDA*1-0x70]);
186         vmovdqu(xmm2, xword[A1+LDA*2-0x70]);
187         vmovdqu(xmm3, xword[A1+LDA3*1-0x70]);
188         vpunpcklbw(xmm4, xmm0, xmm1);
189         vpunpckhbw(xmm5, xmm0, xmm1);
190         vpunpcklbw(xmm6, xmm2, xmm3);
191         vpunpckhbw(xmm7, xmm2, xmm3);
192         vpunpcklwd(xmm0, xmm4, xmm6);
193         vpunpckhwd(xmm1, xmm4, xmm6);
194         vpunpcklwd(xmm2, xmm5, xmm7);
195         vpunpckhwd(xmm3, xmm5, xmm7);
196         vpmovsxbw(ymm5, xmm0);
197         vmovhlps(xmm6, xmm0, xmm0);
198         vpmovsxbw(ymm6, xmm6);
199         vphaddw(ymm5, ymm5, ymm6);
200         vpmovsxbw(ymm6, xmm1);
201         vmovhlps(xmm7, xmm1, xmm1);
202         vpmovsxbw(ymm7, xmm7);
203         vphaddw(ymm6, ymm6, ymm7);
204         vphaddw(ymm5, ymm5, ymm6);
205         vpmovsxwd(ymm5, xmm5);
206         vpaddd(ymm10, ymm10, ymm5);
207         vmovdqu(xword[B-0x40], xmm0);
208         vmovdqu(xword[B-0x30], xmm1);
209         vpmovsxbw(ymm5, xmm2);
210         vmovhlps(xmm6, xmm2, xmm2);
211         vpmovsxbw(ymm6, xmm6);
212         vphaddw(ymm5, ymm5, ymm6);
213         vpmovsxbw(ymm6, xmm3);
214         vmovhlps(xmm7, xmm3, xmm3);
215         vpmovsxbw(ymm7, xmm7);
216         vphaddw(ymm6, ymm6, ymm7);
217         vphaddw(ymm5, ymm5, ymm6);
218         vpmovsxwd(ymm5, xmm5);
219         vpaddd(ymm11, ymm11, ymm5);
220         vmovdqu(xword[B-0x20], xmm2);
221         vmovdqu(xword[B-0x10], xmm3);
222         vmovdqu(xmm0, xword[A1-0x60]);
223         vmovdqu(xmm1, xword[A1+LDA*1-0x60]);
224         vmovdqu(xmm2, xword[A1+LDA*2-0x60]);
225         vmovdqu(xmm3, xword[A1+LDA3*1-0x60]);
226         lea(A1, ptr[A1+LDA*4]);
227         vpunpcklbw(xmm4, xmm0, xmm1);
228         vpunpckhbw(xmm5, xmm0, xmm1);
229         vpunpcklbw(xmm6, xmm2, xmm3);
230         vpunpckhbw(xmm7, xmm2, xmm3);
231         vpunpcklwd(xmm0, xmm4, xmm6);
232         vpunpckhwd(xmm1, xmm4, xmm6);
233         vpunpcklwd(xmm2, xmm5, xmm7);
234         vpunpckhwd(xmm3, xmm5, xmm7);
235         vpmovsxbw(ymm5, xmm0);
236         vmovhlps(xmm6, xmm0, xmm0);
237         vpmovsxbw(ymm6, xmm6);
238         vphaddw(ymm5, ymm5, ymm6);
239         vpmovsxbw(ymm6, xmm1);
240         vmovhlps(xmm7, xmm1, xmm1);
241         vpmovsxbw(ymm7, xmm7);
242         vphaddw(ymm6, ymm6, ymm7);
243         vphaddw(ymm5, ymm5, ymm6);
244         vpmovsxwd(ymm5, xmm5);
245         vpaddd(ymm12, ymm12, ymm5);
246         vmovdqu(xword[B], xmm0);
247         vmovdqu(xword[B+0x10], xmm1);
248         vpmovsxbw(ymm5, xmm2);
249         vmovhlps(xmm6, xmm2, xmm2);
250         vpmovsxbw(ymm6, xmm6);
251         vphaddw(ymm5, ymm5, ymm6);
252         vpmovsxbw(ymm6, xmm3);
253         vmovhlps(xmm7, xmm3, xmm3);
254         vpmovsxbw(ymm7, xmm7);
255         vphaddw(ymm6, ymm6, ymm7);
256         vphaddw(ymm5, ymm5, ymm6);
257         vpmovsxwd(ymm5, xmm5);
258         vpaddd(ymm13, ymm13, ymm5);
259         vmovdqu(xword[B+0x20], xmm2);
260         vmovdqu(xword[B+0x30], xmm3);
261         sub(B, -192);
262         dec(I);
263         jg(l5c, T_NEAR);
264         align(4);
265
266 L(l2a0);
267         test(M, 0x2);
268         jle(l3c0, T_NEAR);
269         vmovdqu(xmm0, xword[A1-0x80]);
270         vmovdqu(xmm1, xword[A1-0x70]);
271         vmovdqu(xmm2, xword[A1-0x60]);
272         add(A1, LDA);
273         vmovdqu(xmm6, xword[A1-0x80]);
274         vmovdqu(xmm4, xword[A1-0x70]);
275         vmovdqu(xmm5, xword[A1-0x60]);
276         add(A1, LDA);
277         vpunpcklbw(xmm3, xmm0, xmm6);
278         vpunpckhbw(xmm0, xmm0, xmm6);
279         vpmovsxbw(ymm7, xmm3);
280         vmovhlps(xmm6, xmm3, xmm3);
281         vpmovsxbw(ymm6, xmm6);
282         vphaddw(ymm7, ymm7, ymm6);
283         vpmovsxwd(ymm7, xmm7);
284         vpaddd(ymm8, ymm8, ymm7);
285         vmovdqu(xword[B-0x80], xmm3);
286         vpmovsxbw(ymm7, xmm0);
287         vmovhlps(xmm6, xmm0, xmm0);
288         vpmovsxbw(ymm6, xmm6);
289         vphaddw(ymm7, ymm7, ymm6);
290         vpmovsxwd(ymm7, xmm7);
291         vpaddd(ymm9, ymm9, ymm7);
292         vmovdqu(xword[B-0x70], xmm0);
293         vpunpcklbw(xmm3, xmm1, xmm4);
294         vpunpckhbw(xmm0, xmm1, xmm4);
295         vpmovsxbw(ymm7, xmm3);
296         vmovhlps(xmm6, xmm3, xmm3);
297         vpmovsxbw(ymm6, xmm6);
298         vphaddw(ymm7, ymm7, ymm6);
299         vpmovsxwd(ymm7, xmm7);
300         vpaddd(ymm10, ymm10, ymm7);
301         vmovdqu(xword[B-0x60], xmm3);
302         vpmovsxbw(ymm7, xmm0);
303         vmovhlps(xmm6, xmm0, xmm0);
304         vpmovsxbw(ymm6, xmm6);
305         vphaddw(ymm7, ymm7, ymm6);
306         vpmovsxwd(ymm7, xmm7);
307         vpaddd(ymm11, ymm11, ymm7);
308         vmovdqu(xword[B-0x50], xmm0);
309         vpunpcklbw(xmm3, xmm2, xmm5);
310         vpunpckhbw(xmm0, xmm2, xmm5);
311         vpmovsxbw(ymm7, xmm3);
312         vmovhlps(xmm6, xmm3, xmm3);
313         vpmovsxbw(ymm6, xmm6);
314         vphaddw(ymm7, ymm7, ymm6);
315         vpmovsxwd(ymm7, xmm7);
316         vpaddd(ymm12, ymm12, ymm7);
317         vmovdqu(xword[B-0x40], xmm3);
318         vpmovsxbw(ymm7, xmm0);
319         vmovhlps(xmm6, xmm0, xmm0);
320         vpmovsxbw(ymm6, xmm6);
321         vphaddw(ymm7, ymm7, ymm6);
322         vpmovsxwd(ymm7, xmm7);
323         vpaddd(ymm13, ymm13, ymm7);
324         vmovdqu(xword[B-0x30], xmm0);
325         sub(B, -96);
326         align(4);
327
328 L(l3c0);
329         test(M, 0x1);
330         jle(l438, T_NEAR);
331         vmovdqu(xmm0, xword[A1-0x80]);
332         vmovdqu(xmm1, xword[A1-0x70]);
333         vmovdqu(xmm2, xword[A1-0x60]);
334         add(A1, LDA);
335         vpmovsxbd(ymm7, xmm0);
336         vpaddd(ymm8, ymm8, ymm7);
337         vmovhlps(xmm7, xmm0, xmm0);
338         vpmovsxbd(ymm7, xmm7);
339         vpaddd(ymm9, ymm9, ymm7);
340         vmovdqu(xword[B-0x80], xmm0);
341         vpmovsxbd(ymm7, xmm1);
342         vpaddd(ymm10, ymm10, ymm7);
343         vmovhlps(xmm7, xmm1, xmm1);
344         vpmovsxbd(ymm7, xmm7);
345         vpaddd(ymm11, ymm11, ymm7);
346         vmovdqu(xword[B-0x70], xmm1);
347         vpmovsxbd(ymm7, xmm2);
348         vpaddd(ymm12, ymm12, ymm7);
349         vmovhlps(xmm7, xmm2, xmm2);
350         vpmovsxbd(ymm7, xmm7);
351         vpaddd(ymm13, ymm13, ymm7);
352         vmovdqu(xword[B-0x60], xmm2);
353         sub(B, -48);
354         align(4);
355
356 L(l438);
357         mov(A1, qword[ARG_BIAS]);
358         vmovdqu(yword[A1], ymm8);
359         vmovdqu(yword[A1+0x20], ymm9);
360         vmovdqu(yword[A1+0x40], ymm10);
361         vmovdqu(yword[A1+0x60], ymm11);
362         vmovdqu(yword[A1+0x80], ymm12);
363         vmovdqu(yword[A1+0xa0], ymm13);
364         add(qword[ARG_BIAS], 0xc0);
365         sub(N, 0x30);
366         cmp(N, 0x30);
367         jge(l20, T_NEAR);
368         vzeroupper();
369         align(4);
370
371 L(l480);
372         cmp(N, 0x20);
373         jl(l89c, T_NEAR);
374         align(4);
375
376 L(l48c);
377         mov(A1, A);
378         add(A, 0x20);
379         pxor(xmm8, xmm8);
380         pxor(xmm9, xmm9);
381         pxor(xmm10, xmm10);
382         pxor(xmm11, xmm11);
383         pxor(xmm12, xmm12);
384         pxor(xmm13, xmm13);
385         pxor(xmm14, xmm14);
386         pxor(xmm15, xmm15);
387         mov(I, M);
388         sar(I, 0x2);
389         jle(l6a8, T_NEAR);
390         align(4);
391
392 L(l4c8);
393         movdqu(xmm0, xword[A1-0x80]);
394         movdqu(xmm1, xword[A1+LDA*1-0x80]);
395         movdqu(xmm2, xword[A1+LDA*2-0x80]);
396         movdqu(xmm3, xword[A1+LDA3*1-0x80]);
397         movdqa(xmm4, xmm0);
398         punpcklbw(xmm0, xmm1);
399         punpckhbw(xmm4, xmm1);
400         movdqa(xmm5, xmm2);
401         punpcklbw(xmm2, xmm3);
402         punpckhbw(xmm5, xmm3);
403         movdqa(xmm1, xmm0);
404         punpcklwd(xmm0, xmm2);
405         punpckhwd(xmm1, xmm2);
406         movdqa(xmm2, xmm4);
407         punpcklwd(xmm4, xmm5);
408         punpckhwd(xmm2, xmm5);
409         pmovsxbw(xmm5, xmm0);
410         movhlps(xmm6, xmm0);
411         pmovsxbw(xmm6, xmm6);
412         phaddw(xmm5, xmm6);
413         phaddw(xmm5, xmm5);
414         pmovsxwd(xmm5, xmm5);
415         paddd(xmm8, xmm5);
416         movdqu(xword[B-0x80], xmm0);
417         pmovsxbw(xmm5, xmm1);
418         movhlps(xmm6, xmm1);
419         pmovsxbw(xmm6, xmm6);
420         phaddw(xmm5, xmm6);
421         phaddw(xmm5, xmm5);
422         pmovsxwd(xmm5, xmm5);
423         paddd(xmm9, xmm5);
424         movdqu(xword[B-0x70], xmm1);
425         pmovsxbw(xmm5, xmm4);
426         movhlps(xmm6, xmm4);
427         pmovsxbw(xmm6, xmm6);
428         phaddw(xmm5, xmm6);
429         phaddw(xmm5, xmm5);
430         pmovsxwd(xmm5, xmm5);
431         paddd(xmm10, xmm5);
432         movdqu(xword[B-0x60], xmm4);
433         pmovsxbw(xmm5, xmm2);
434         movhlps(xmm6, xmm2);
435         pmovsxbw(xmm6, xmm6);
436         phaddw(xmm5, xmm6);
437         phaddw(xmm5, xmm5);
438         pmovsxwd(xmm5, xmm5);
439         paddd(xmm11, xmm5);
440         movdqu(xword[B-0x50], xmm2);
441         movdqu(xmm0, xword[A1-0x70]);
442         movdqu(xmm1, xword[A1+LDA*1-0x70]);
443         movdqu(xmm2, xword[A1+LDA*2-0x70]);
444         movdqu(xmm3, xword[A1+LDA3*1-0x70]);
445         lea(A1, ptr[A1+LDA*4]);
446         movdqa(xmm4, xmm0);
447         punpcklbw(xmm0, xmm1);
448         punpckhbw(xmm4, xmm1);
449         movdqa(xmm5, xmm2);
450         punpcklbw(xmm2, xmm3);
451         punpckhbw(xmm5, xmm3);
452         movdqa(xmm1, xmm0);
453         punpcklwd(xmm0, xmm2);
454         punpckhwd(xmm1, xmm2);
455         movdqa(xmm2, xmm4);
456         punpcklwd(xmm4, xmm5);
457         punpckhwd(xmm2, xmm5);
458         pmovsxbw(xmm5, xmm0);
459         movhlps(xmm6, xmm0);
460         pmovsxbw(xmm6, xmm6);
461         phaddw(xmm5, xmm6);
462         phaddw(xmm5, xmm5);
463         pmovsxwd(xmm5, xmm5);
464         paddd(xmm12, xmm5);
465         movdqu(xword[B-0x40], xmm0);
466         pmovsxbw(xmm5, xmm1);
467         movhlps(xmm6, xmm1);
468         pmovsxbw(xmm6, xmm6);
469         phaddw(xmm5, xmm6);
470         phaddw(xmm5, xmm5);
471         pmovsxwd(xmm5, xmm5);
472         paddd(xmm13, xmm5);
473         movdqu(xword[B-0x30], xmm1);
474         pmovsxbw(xmm5, xmm4);
475         movhlps(xmm6, xmm4);
476         pmovsxbw(xmm6, xmm6);
477         phaddw(xmm5, xmm6);
478         phaddw(xmm5, xmm5);
479         pmovsxwd(xmm5, xmm5);
480         paddd(xmm14, xmm5);
481         movdqu(xword[B-0x20], xmm4);
482         pmovsxbw(xmm5, xmm2);
483         movhlps(xmm6, xmm2);
484         pmovsxbw(xmm6, xmm6);
485         phaddw(xmm5, xmm6);
486         phaddw(xmm5, xmm5);
487         pmovsxwd(xmm5, xmm5);
488         paddd(xmm15, xmm5);
489         movdqu(xword[B-0x10], xmm2);
490         sub(B, -128);
491         dec(I);
492         jg(l4c8, T_NEAR);
493         align(4);
494
495 L(l6a8);
496         test(M, 0x2);
497         jle(l7b4, T_NEAR);
498         movdqu(xmm0, xword[A1-0x80]);
499         movdqu(xmm1, xword[A1-0x70]);
500         add(A1, LDA);
501         movdqu(xmm2, xword[A1-0x80]);
502         movdqu(xmm3, xword[A1-0x70]);
503         add(A1, LDA);
504         movdqa(xmm4, xmm0);
505         punpcklbw(xmm0, xmm2);
506         punpckhbw(xmm4, xmm2);
507         pmovsxbw(xmm5, xmm0);
508         phaddw(xmm5, xmm5);
509         pmovsxwd(xmm5, xmm5);
510         paddd(xmm8, xmm5);
511         movhlps(xmm6, xmm0);
512         pmovsxbw(xmm6, xmm6);
513         phaddw(xmm6, xmm6);
514         pmovsxwd(xmm6, xmm6);
515         paddd(xmm9, xmm6);
516         movdqu(xword[B-0x80], xmm0);
517         pmovsxbw(xmm5, xmm4);
518         phaddw(xmm5, xmm5);
519         pmovsxwd(xmm5, xmm5);
520         paddd(xmm10, xmm5);
521         movhlps(xmm6, xmm4);
522         pmovsxbw(xmm6, xmm6);
523         phaddw(xmm6, xmm6);
524         pmovsxwd(xmm6, xmm6);
525         paddd(xmm11, xmm6);
526         movdqu(xword[B-0x70], xmm4);
527         movdqa(xmm4, xmm1);
528         punpcklbw(xmm1, xmm3);
529         punpckhbw(xmm4, xmm3);
530         pmovsxbw(xmm5, xmm1);
531         phaddw(xmm5, xmm5);
532         pmovsxwd(xmm5, xmm5);
533         paddd(xmm12, xmm5);
534         movhlps(xmm6, xmm1);
535         pmovsxbw(xmm6, xmm6);
536         phaddw(xmm6, xmm6);
537         pmovsxwd(xmm6, xmm6);
538         paddd(xmm13, xmm6);
539         movdqu(xword[B-0x60], xmm1);
540         pmovsxbw(xmm5, xmm4);
541         phaddw(xmm5, xmm5);
542         pmovsxwd(xmm5, xmm5);
543         paddd(xmm14, xmm5);
544         movhlps(xmm6, xmm4);
545         pmovsxbw(xmm6, xmm6);
546         phaddw(xmm6, xmm6);
547         pmovsxwd(xmm6, xmm6);
548         paddd(xmm15, xmm6);
549         movdqu(xword[B-0x50], xmm4);
550         sub(B, -64);
551         align(4);
552
553 L(l7b4);
554         test(M, 0x1);
555         jle(l850, T_NEAR);
556         movdqu(xmm0, xword[A1-0x80]);
557         movdqu(xmm1, xword[A1-0x70]);
558         add(A1, LDA);
559         pmovsxbd(xmm5, xmm0);
560         paddd(xmm8, xmm5);
561         pshufd(xmm6, xmm0, 0x55);
562         pmovsxbd(xmm6, xmm6);
563         paddd(xmm9, xmm6);
564         pshufd(xmm5, xmm0, 0xaa);
565         pmovsxbd(xmm5, xmm5);
566         paddd(xmm10, xmm5);
567         pshufd(xmm6, xmm0, 0xff);
568         pmovsxbd(xmm6, xmm6);
569         paddd(xmm11, xmm6);
570         movdqu(xword[B-0x80], xmm0);
571         pmovsxbd(xmm5, xmm1);
572         paddd(xmm12, xmm5);
573         pshufd(xmm6, xmm1, 0x55);
574         pmovsxbd(xmm6, xmm6);
575         paddd(xmm13, xmm6);
576         pshufd(xmm5, xmm1, 0xaa);
577         pmovsxbd(xmm5, xmm5);
578         paddd(xmm14, xmm5);
579         pshufd(xmm6, xmm1, 0xff);
580         pmovsxbd(xmm6, xmm6);
581         paddd(xmm15, xmm6);
582         movdqu(xword[B-0x70], xmm1);
583         sub(B, -32);
584         align(4);
585
586 L(l850);
587         mov(A1, qword[ARG_BIAS]);
588         movdqu(xword[A1], xmm8);
589         movdqu(xword[A1+0x10], xmm9);
590         movdqu(xword[A1+0x20], xmm10);
591         movdqu(xword[A1+0x30], xmm11);
592         movdqu(xword[A1+0x40], xmm12);
593         movdqu(xword[A1+0x50], xmm13);
594         movdqu(xword[A1+0x60], xmm14);
595         movdqu(xword[A1+0x70], xmm15);
596         add(qword[ARG_BIAS], 0x80);
597         sub(N, 0x20);
598         cmp(N, 0x20);
599         jge(l48c, T_NEAR);
600         align(4);
601
602 L(l89c);
603         cmp(N, 0x10);
604         jl(lae8, T_NEAR);
605         align(4);
606
607 L(l8a8);
608         mov(A1, A);
609         add(A, 0x10);
610         pxor(xmm8, xmm8);
611         pxor(xmm9, xmm9);
612         pxor(xmm10, xmm10);
613         pxor(xmm11, xmm11);
614         mov(I, M);
615         sar(I, 0x2);
616         jle(l9d0, T_NEAR);
617         align(4);
618
619 L(l8d0);
620         movdqu(xmm0, xword[A1-0x80]);
621         add(A1, LDA);
622         movdqu(xmm1, xword[A1-0x80]);
623         add(A1, LDA);
624         movdqu(xmm2, xword[A1-0x80]);
625         add(A1, LDA);
626         movdqu(xmm3, xword[A1-0x80]);
627         add(A1, LDA);
628         movdqa(xmm4, xmm0);
629         punpcklbw(xmm0, xmm1);
630         punpckhbw(xmm4, xmm1);
631         movdqa(xmm1, xmm2);
632         punpcklbw(xmm2, xmm3);
633         punpckhbw(xmm1, xmm3);
634         movdqa(xmm3, xmm0);
635         punpcklwd(xmm0, xmm2);
636         punpckhwd(xmm3, xmm2);
637         movdqa(xmm2, xmm4);
638         punpcklwd(xmm4, xmm1);
639         punpckhwd(xmm2, xmm1);
640         pmovsxbw(xmm5, xmm0);
641         movhlps(xmm6, xmm0);
642         pmovsxbw(xmm6, xmm6);
643         phaddw(xmm5, xmm6);
644         phaddw(xmm5, xmm5);
645         pmovsxwd(xmm5, xmm5);
646         paddd(xmm8, xmm5);
647         pmovsxbw(xmm5, xmm3);
648         movhlps(xmm6, xmm3);
649         pmovsxbw(xmm6, xmm6);
650         phaddw(xmm5, xmm6);
651         phaddw(xmm5, xmm5);
652         pmovsxwd(xmm5, xmm5);
653         paddd(xmm9, xmm5);
654         movdqu(xword[B-0x80], xmm0);
655         movdqu(xword[B-0x70], xmm3);
656         pmovsxbw(xmm5, xmm4);
657         movhlps(xmm6, xmm4);
658         pmovsxbw(xmm6, xmm6);
659         phaddw(xmm5, xmm6);
660         phaddw(xmm5, xmm5);
661         pmovsxwd(xmm5, xmm5);
662         paddd(xmm10, xmm5);
663         pmovsxbw(xmm5, xmm2);
664         movhlps(xmm6, xmm2);
665         pmovsxbw(xmm6, xmm6);
666         phaddw(xmm5, xmm6);
667         phaddw(xmm5, xmm5);
668         pmovsxwd(xmm5, xmm5);
669         paddd(xmm11, xmm5);
670         movdqu(xword[B-0x60], xmm4);
671         movdqu(xword[B-0x50], xmm2);
672         sub(B, -64);
673         dec(I);
674         jg(l8d0, T_NEAR);
675         align(4);
676
677 L(l9d0);
678         test(M, 0x2);
679         jle(la64, T_NEAR);
680         movdqu(xmm0, xword[A1-0x80]);
681         add(A1, LDA);
682         movdqu(xmm1, xword[A1-0x80]);
683         add(A1, LDA);
684         movdqa(xmm2, xmm0);
685         punpcklbw(xmm0, xmm1);
686         punpckhbw(xmm2, xmm1);
687         pmovsxbw(xmm5, xmm0);
688         phaddw(xmm5, xmm5);
689         pmovsxwd(xmm5, xmm5);
690         paddd(xmm8, xmm5);
691         movhlps(xmm6, xmm0);
692         pmovsxbw(xmm6, xmm6);
693         phaddw(xmm6, xmm6);
694         pmovsxwd(xmm6, xmm6);
695         paddd(xmm9, xmm6);
696         pmovsxbw(xmm5, xmm2);
697         phaddw(xmm5, xmm5);
698         pmovsxwd(xmm5, xmm5);
699         paddd(xmm10, xmm5);
700         movhlps(xmm6, xmm2);
701         pmovsxbw(xmm6, xmm6);
702         phaddw(xmm6, xmm6);
703         pmovsxwd(xmm6, xmm6);
704         paddd(xmm11, xmm6);
705         movdqu(xword[B-0x80], xmm0);
706         movdqu(xword[B-0x70], xmm2);
707         sub(B, -32);
708         align(4);
709
710 L(la64);
711         test(M, 0x1);
712         jle(lab8, T_NEAR);
713         movdqu(xmm0, xword[A1-0x80]);
714         add(A1, LDA);
715         pmovsxbd(xmm5, xmm0);
716         paddd(xmm8, xmm5);
717         pshufd(xmm6, xmm0, 0x55);
718         pmovsxbd(xmm6, xmm6);
719         paddd(xmm9, xmm6);
720         pshufd(xmm5, xmm0, 0xaa);
721         pmovsxbd(xmm5, xmm5);
722         paddd(xmm10, xmm5);
723         pshufd(xmm6, xmm0, 0xff);
724         pmovsxbd(xmm6, xmm6);
725         paddd(xmm11, xmm6);
726         movdqu(xword[B-0x80], xmm0);
727         sub(B, -16);
728         align(4);
729
730 L(lab8);
731         mov(A1, qword[ARG_BIAS]);
732         movdqu(xword[A1], xmm8);
733         movdqu(xword[A1+0x10], xmm9);
734         movdqu(xword[A1+0x20], xmm10);
735         movdqu(xword[A1+0x30], xmm11);
736         add(qword[ARG_BIAS], 0x40);
737         sub(N, 0x10);
738         cmp(N, 0x10);
739         jge(l8a8, T_NEAR);
740         align(4);
741
742 L(lae8);
743         cmp(N, 0x8);
744         jl(ld78, T_NEAR);
745         align(4);
746
747 L(laf4);
748         mov(A1, A);
749         add(A, 0x8);
750         pxor(xmm8, xmm8);
751         pxor(xmm9, xmm9);
752         mov(I, M);
753         sar(I, 0x3);
754         jle(lc30, T_NEAR);
755         align(4);
756
757 L(lb14);
758         movq(xmm0, qword[A1-0x80]);
759         add(A1, LDA);
760         movq(xmm1, qword[A1-0x80]);
761         add(A1, LDA);
762         movq(xmm2, qword[A1-0x80]);
763         add(A1, LDA);
764         movq(xmm3, qword[A1-0x80]);
765         add(A1, LDA);
766         punpcklbw(xmm0, xmm1);
767         punpcklbw(xmm2, xmm3);
768         movdqa(xmm1, xmm0);
769         punpcklwd(xmm0, xmm2);
770         punpckhwd(xmm1, xmm2);
771         pmovsxbw(xmm5, xmm0);
772         movhlps(xmm6, xmm0);
773         pmovsxbw(xmm6, xmm6);
774         phaddw(xmm5, xmm6);
775         phaddw(xmm5, xmm5);
776         pmovsxwd(xmm5, xmm5);
777         paddd(xmm8, xmm5);
778         pmovsxbw(xmm5, xmm1);
779         movhlps(xmm6, xmm1);
780         pmovsxbw(xmm6, xmm6);
781         phaddw(xmm5, xmm6);
782         phaddw(xmm5, xmm5);
783         pmovsxwd(xmm5, xmm5);
784         paddd(xmm9, xmm5);
785         movdqu(xword[B-0x80], xmm0);
786         movdqu(xword[B-0x70], xmm1);
787         movq(xmm0, qword[A1-0x80]);
788         add(A1, LDA);
789         movq(xmm1, qword[A1-0x80]);
790         add(A1, LDA);
791         movq(xmm2, qword[A1-0x80]);
792         add(A1, LDA);
793         movq(xmm3, qword[A1-0x80]);
794         add(A1, LDA);
795         punpcklbw(xmm0, xmm1);
796         punpcklbw(xmm2, xmm3);
797         movdqa(xmm1, xmm0);
798         punpcklwd(xmm0, xmm2);
799         punpckhwd(xmm1, xmm2);
800         pmovsxbw(xmm5, xmm0);
801         movhlps(xmm6, xmm0);
802         pmovsxbw(xmm6, xmm6);
803         phaddw(xmm5, xmm6);
804         phaddw(xmm5, xmm5);
805         pmovsxwd(xmm5, xmm5);
806         paddd(xmm8, xmm5);
807         pmovsxbw(xmm5, xmm1);
808         movhlps(xmm6, xmm1);
809         pmovsxbw(xmm6, xmm6);
810         phaddw(xmm5, xmm6);
811         phaddw(xmm5, xmm5);
812         pmovsxwd(xmm5, xmm5);
813         paddd(xmm9, xmm5);
814         movdqu(xword[B-0x60], xmm0);
815         movdqu(xword[B-0x50], xmm1);
816         sub(B, -64);
817         dec(I);
818         jg(lb14, T_NEAR);
819         align(4);
820
821 L(lc30);
822         test(M, 0x4);
823         jle(lcc8, T_NEAR);
824         movq(xmm0, qword[A1-0x80]);
825         add(A1, LDA);
826         movq(xmm1, qword[A1-0x80]);
827         add(A1, LDA);
828         movq(xmm2, qword[A1-0x80]);
829         add(A1, LDA);
830         movq(xmm3, qword[A1-0x80]);
831         add(A1, LDA);
832         punpcklbw(xmm0, xmm1);
833         punpcklbw(xmm2, xmm3);
834         movdqa(xmm1, xmm0);
835         punpcklwd(xmm0, xmm2);
836         punpckhwd(xmm1, xmm2);
837         pmovsxbw(xmm5, xmm0);
838         movhlps(xmm6, xmm0);
839         pmovsxbw(xmm6, xmm6);
840         phaddw(xmm5, xmm6);
841         phaddw(xmm5, xmm5);
842         pmovsxwd(xmm5, xmm5);
843         paddd(xmm8, xmm5);
844         pmovsxbw(xmm5, xmm1);
845         movhlps(xmm6, xmm1);
846         pmovsxbw(xmm6, xmm6);
847         phaddw(xmm5, xmm6);
848         phaddw(xmm5, xmm5);
849         pmovsxwd(xmm5, xmm5);
850         paddd(xmm9, xmm5);
851         movdqu(xword[B-0x80], xmm0);
852         movdqu(xword[B-0x70], xmm1);
853         sub(B, -32);
854         align(4);
855
856 L(lcc8);
857         test(M, 0x2);
858         jle(ld1c, T_NEAR);
859         movq(xmm0, qword[A1-0x80]);
860         add(A1, LDA);
861         movq(xmm1, qword[A1-0x80]);
862         add(A1, LDA);
863         punpcklbw(xmm0, xmm1);
864         pmovsxbw(xmm5, xmm0);
865         phaddw(xmm5, xmm5);
866         pmovsxwd(xmm5, xmm5);
867         paddd(xmm8, xmm5);
868         movhlps(xmm6, xmm0);
869         pmovsxbw(xmm6, xmm6);
870         phaddw(xmm6, xmm6);
871         pmovsxwd(xmm6, xmm6);
872         paddd(xmm9, xmm6);
873         movdqu(xword[B-0x80], xmm0);
874         sub(B, -16);
875         align(4);
876
877 L(ld1c);
878         test(M, 0x1);
879         jle(ld54, T_NEAR);
880         movq(xmm0, qword[A1-0x80]);
881         add(A1, LDA);
882         pmovsxbd(xmm5, xmm0);
883         pshufd(xmm6, xmm0, 0x55);
884         pmovsxbd(xmm6, xmm6);
885         paddd(xmm8, xmm5);
886         paddd(xmm9, xmm6);
887         movq(qword[B-0x80], xmm0);
888         sub(B, -8);
889         align(4);
890
891 L(ld54);
892         mov(A1, qword[ARG_BIAS]);
893         movdqu(xword[A1], xmm8);
894         movdqu(xword[A1+0x10], xmm9);
895         add(qword[ARG_BIAS], 0x20);
896         sub(N, 0x8);
897         cmp(N, 0x8);
898         jge(laf4, T_NEAR);
899         align(4);
900
901 L(ld78);
902         cmp(N, 0x4);
903         jl(lf3c, T_NEAR);
904         align(4);
905
906 L(ld84);
907         mov(A1, A);
908         add(A, 0x4);
909         pxor(xmm7, xmm7);
910         mov(I, M);
911         sar(I, 0x3);
912         jle(le58, T_NEAR);
913         align(4);
914
915 L(ld9c);
916         movd(xmm0, dword[A1-0x80]);
917         add(A1, LDA);
918         movd(xmm1, dword[A1-0x80]);
919         add(A1, LDA);
920         movd(xmm2, dword[A1-0x80]);
921         add(A1, LDA);
922         movd(xmm3, dword[A1-0x80]);
923         add(A1, LDA);
924         punpcklbw(xmm0, xmm1);
925         punpcklbw(xmm2, xmm3);
926         punpcklwd(xmm0, xmm2);
927         pmovsxbw(xmm5, xmm0);
928         movhlps(xmm6, xmm0);
929         pmovsxbw(xmm6, xmm6);
930         phaddw(xmm5, xmm6);
931         phaddw(xmm5, xmm5);
932         pmovsxwd(xmm5, xmm5);
933         paddd(xmm7, xmm5);
934         movdqu(xword[B-0x80], xmm0);
935         movd(xmm0, dword[A1-0x80]);
936         add(A1, LDA);
937         movd(xmm1, dword[A1-0x80]);
938         add(A1, LDA);
939         movd(xmm2, dword[A1-0x80]);
940         add(A1, LDA);
941         movd(xmm3, dword[A1-0x80]);
942         add(A1, LDA);
943         punpcklbw(xmm0, xmm1);
944         punpcklbw(xmm2, xmm3);
945         punpcklwd(xmm0, xmm2);
946         pmovsxbw(xmm5, xmm0);
947         movhlps(xmm6, xmm0);
948         pmovsxbw(xmm6, xmm6);
949         phaddw(xmm5, xmm6);
950         phaddw(xmm5, xmm5);
951         pmovsxwd(xmm5, xmm5);
952         paddd(xmm7, xmm5);
953         movdqu(xword[B-0x70], xmm0);
954         sub(B, -32);
955         dec(I);
956         jg(ld9c, T_NEAR);
957         align(4);
958
959 L(le58);
960         test(M, 0x4);
961         jle(lebc, T_NEAR);
962         movd(xmm0, dword[A1-0x80]);
963         add(A1, LDA);
964         movd(xmm1, dword[A1-0x80]);
965         add(A1, LDA);
966         movd(xmm2, dword[A1-0x80]);
967         add(A1, LDA);
968         movd(xmm3, dword[A1-0x80]);
969         add(A1, LDA);
970         punpcklbw(xmm0, xmm1);
971         punpcklbw(xmm2, xmm3);
972         punpcklwd(xmm0, xmm2);
973         pmovsxbw(xmm5, xmm0);
974         movhlps(xmm6, xmm0);
975         pmovsxbw(xmm6, xmm6);
976         phaddw(xmm5, xmm6);
977         phaddw(xmm5, xmm5);
978         pmovsxwd(xmm5, xmm5);
979         paddd(xmm7, xmm5);
980         movdqu(xword[B-0x80], xmm0);
981         sub(B, -16);
982         align(4);
983
984 L(lebc);
985         test(M, 0x2);
986         jle(lef8, T_NEAR);
987         movd(xmm0, dword[A1-0x80]);
988         add(A1, LDA);
989         movd(xmm1, dword[A1-0x80]);
990         add(A1, LDA);
991         punpcklbw(xmm0, xmm1);
992         pmovsxbw(xmm5, xmm0);
993         phaddw(xmm5, xmm5);
994         pmovsxwd(xmm5, xmm5);
995         paddd(xmm7, xmm5);
996         movq(qword[B-0x80], xmm0);
997         sub(B, -8);
998         align(4);
999
1000 L(lef8);
1001         test(M, 0x1);
1002         jle(lf1c, T_NEAR);
1003         movd(xmm0, dword[A1-0x80]);
1004         pmovsxbd(xmm5, xmm0);
1005         paddd(xmm7, xmm5);
1006         movd(dword[B-0x80], xmm0);
1007         sub(B, -4);
1008         align(4);
1009
1010 L(lf1c);
1011         mov(A1, qword[ARG_BIAS]);
1012         movdqu(xword[A1], xmm7);
1013         add(qword[ARG_BIAS], 0x10);
1014         sub(N, 0x4);
1015         cmp(N, 0x4);
1016         jge(ld84, T_NEAR);
1017         align(4);
1018
1019 L(lf3c);
1020         cmp(N, 0x2);
1021         jl(l111a, T_NEAR);
1022         align(4);
1023
1024 L(lf48);
1025         mov(A1, A);
1026         add(A, 0x2);
1027         pxor(xmm7, xmm7);
1028         mov(LDA3, M);
1029         sar(LDA3, 0x3);
1030         jle(l1024, T_NEAR);
1031         align(4);
1032
1033 L(lf60);
1034         mov(ax, word[A1-0x80]);
1035         add(A1, LDA);
1036         pinsrw(xmm0, eax, 0x0);
1037         mov(ax, word[A1-0x80]);
1038         add(A1, LDA);
1039         pinsrw(xmm1, eax, 0x0);
1040         mov(ax, word[A1-0x80]);
1041         add(A1, LDA);
1042         pinsrw(xmm2, eax, 0x0);
1043         mov(ax, word[A1-0x80]);
1044         add(A1, LDA);
1045         pinsrw(xmm3, eax, 0x0);
1046         punpcklbw(xmm0, xmm1);
1047         punpcklbw(xmm2, xmm3);
1048         punpcklwd(xmm0, xmm2);
1049         mov(ax, word[A1-0x80]);
1050         add(A1, LDA);
1051         pinsrw(xmm1, eax, 0x0);
1052         mov(ax, word[A1-0x80]);
1053         add(A1, LDA);
1054         pinsrw(xmm2, eax, 0x0);
1055         mov(ax, word[A1-0x80]);
1056         add(A1, LDA);
1057         pinsrw(xmm3, eax, 0x0);
1058         mov(ax, word[A1-0x80]);
1059         add(A1, LDA);
1060         pinsrw(xmm4, eax, 0x0);
1061         punpcklbw(xmm1, xmm2);
1062         punpcklbw(xmm3, xmm4);
1063         punpcklwd(xmm1, xmm3);
1064         punpcklqdq(xmm0, xmm1);
1065         pshufd(xmm6, xmm0, 0xd8);
1066         pmovsxbw(xmm5, xmm6);
1067         movhlps(xmm6, xmm6);
1068         pmovsxbw(xmm6, xmm6);
1069         phaddw(xmm5, xmm6);
1070         phaddw(xmm5, xmm5);
1071         phaddw(xmm5, xmm5);
1072         pmovsxwd(xmm5, xmm5);
1073         paddd(xmm7, xmm5);
1074         movdqu(xword[B-0x80], xmm0);
1075         sub(B, -16);
1076         dec(LDA3);
1077         jg(lf60, T_NEAR);
1078         align(4);
1079
1080 L(l1024);
1081         test(M, 0x4);
1082         jle(l1090, T_NEAR);
1083         mov(ax, word[A1-0x80]);
1084         add(A1, LDA);
1085         pinsrw(xmm0, eax, 0x0);
1086         mov(ax, word[A1-0x80]);
1087         add(A1, LDA);
1088         pinsrw(xmm1, eax, 0x0);
1089         mov(ax, word[A1-0x80]);
1090         add(A1, LDA);
1091         pinsrw(xmm2, eax, 0x0);
1092         mov(ax, word[A1-0x80]);
1093         add(A1, LDA);
1094         pinsrw(xmm3, eax, 0x0);
1095         punpcklbw(xmm0, xmm1);
1096         punpcklbw(xmm2, xmm3);
1097         punpcklwd(xmm0, xmm2);
1098         pmovsxbw(xmm5, xmm0);
1099         phaddw(xmm5, xmm5);
1100         phaddw(xmm5, xmm5);
1101         pmovsxwd(xmm5, xmm5);
1102         paddd(xmm7, xmm5);
1103         movq(qword[B-0x80], xmm0);
1104         sub(B, -8);
1105         align(4);
1106
1107 L(l1090);
1108         test(M, 0x2);
1109         jle(l10d4, T_NEAR);
1110         mov(ax, word[A1-0x80]);
1111         add(A1, LDA);
1112         pinsrw(xmm0, eax, 0x0);
1113         mov(ax, word[A1-0x80]);
1114         add(A1, LDA);
1115         pinsrw(xmm1, eax, 0x0);
1116         punpcklbw(xmm0, xmm1);
1117         pmovsxbw(xmm5, xmm0);
1118         phaddw(xmm5, xmm5);
1119         pmovsxwd(xmm5, xmm5);
1120         paddd(xmm7, xmm5);
1121         movd(dword[B-0x80], xmm0);
1122         sub(B, -4);
1123         align(4);
1124
1125 L(l10d4);
1126         test(M, 0x1);
1127         jle(l10fc, T_NEAR);
1128         mov(ax, word[A1-0x80]);
1129         pinsrw(xmm0, eax, 0x0);
1130         pmovsxbd(xmm5, xmm0);
1131         paddd(xmm7, xmm5);
1132         mov(word[B-0x80], ax);
1133         sub(B, -2);
1134         align(4);
1135
1136 L(l10fc);
1137         mov(A1, qword[ARG_BIAS]);
1138         movq(qword[A1], xmm7);
1139         add(qword[ARG_BIAS], 0x8);
1140         sub(N, 0x2);
1141         cmp(N, 0x2);
1142         jge(lf48, T_NEAR);
1143         align(4);
1144
1145 L(l111a);
1146         cmp(N, 0x1);
1147         jl(l12bc, T_NEAR);
1148         align(4);
1149
1150 L(l1124);
1151         mov(A1, A);
1152         add(A, 0x1);
1153         pxor(xmm7, xmm7);
1154         mov(LDA3, M);
1155         sar(LDA3, 0x3);
1156         jle(l11d4, T_NEAR);
1157         align(4);
1158
1159 L(l113c);
1160         mov(al, byte[A1-0x80]);
1161         add(A1, LDA);
1162         pinsrb(xmm0, eax, 0x0);
1163         mov(al, byte[A1-0x80]);
1164         add(A1, LDA);
1165         pinsrb(xmm0, eax, 0x1);
1166         mov(al, byte[A1-0x80]);
1167         add(A1, LDA);
1168         pinsrb(xmm0, eax, 0x2);
1169         mov(al, byte[A1-0x80]);
1170         add(A1, LDA);
1171         pinsrb(xmm0, eax, 0x3);
1172         mov(al, byte[A1-0x80]);
1173         add(A1, LDA);
1174         pinsrb(xmm0, eax, 0x4);
1175         mov(al, byte[A1-0x80]);
1176         add(A1, LDA);
1177         pinsrb(xmm0, eax, 0x5);
1178         mov(al, byte[A1-0x80]);
1179         add(A1, LDA);
1180         pinsrb(xmm0, eax, 0x6);
1181         mov(al, byte[A1-0x80]);
1182         add(A1, LDA);
1183         pinsrb(xmm0, eax, 0x7);
1184         pmovsxbw(xmm5, xmm0);
1185         phaddw(xmm5, xmm6);
1186         phaddw(xmm5, xmm5);
1187         phaddw(xmm5, xmm5);
1188         pmovsxwd(xmm5, xmm5);
1189         paddd(xmm7, xmm5);
1190         movq(qword[B-0x80], xmm0);
1191         sub(B, -8);
1192         dec(LDA3);
1193         jg(l113c, T_NEAR);
1194         align(4);
1195
1196 L(l11d4);
1197         test(M, 0x4);
1198         jle(l1234, T_NEAR);
1199         mov(al, byte[A1-0x80]);
1200         add(A1, LDA);
1201         pinsrb(xmm0, eax, 0x0);
1202         mov(al, byte[A1-0x80]);
1203         add(A1, LDA);
1204         pinsrb(xmm0, eax, 0x1);
1205         mov(al, byte[A1-0x80]);
1206         add(A1, LDA);
1207         pinsrb(xmm0, eax, 0x2);
1208         mov(al, byte[A1-0x80]);
1209         add(A1, LDA);
1210         pinsrb(xmm0, eax, 0x3);
1211         pmovsxbw(xmm5, xmm0);
1212         phaddw(xmm5, xmm5);
1213         phaddw(xmm5, xmm5);
1214         pmovsxwd(xmm5, xmm5);
1215         paddd(xmm7, xmm5);
1216         movd(dword[B-0x80], xmm0);
1217         sub(B, -4);
1218         align(4);
1219
1220 L(l1234);
1221         test(M, 0x2);
1222         jle(l1278, T_NEAR);
1223         mov(al, byte[A1-0x80]);
1224         add(A1, LDA);
1225         pinsrb(xmm0, eax, 0x0);
1226         mov(byte[B-0x80], al);
1227         mov(al, byte[A1-0x80]);
1228         add(A1, LDA);
1229         pinsrb(xmm0, eax, 0x1);
1230         pmovsxbw(xmm5, xmm0);
1231         phaddw(xmm5, xmm5);
1232         pmovsxwd(xmm5, xmm5);
1233         paddd(xmm7, xmm5);
1234         mov(byte[B-0x7f], al);
1235         sub(B, -2);
1236         align(4);
1237
1238 L(l1278);
1239         test(M, 0x1);
1240         jle(l129c, T_NEAR);
1241         mov(al, byte[A1-0x80]);
1242         pinsrw(xmm0, eax, 0x0);
1243         pmovsxbd(xmm5, xmm0);
1244         paddd(xmm7, xmm5);
1245         mov(byte[B-0x80], al);
1246         sub(B, -1);
1247         align(4);
1248
1249 L(l129c);
1250         mov(A1, qword[ARG_BIAS]);
1251         movd(dword[A1], xmm7);
1252         add(qword[ARG_BIAS], 0x4);
1253         sub(N, 0x1);
1254         cmp(N, 0x1);
1255         jge(l1124, T_NEAR);
1256         align(4);
1257
1258 L(l12bc);
1259
1260         postamble();
1261 }
1262 outLocalLabel();
1263
1264 #undef M
1265 #undef N
1266 #undef A
1267 #undef LDA
1268 #undef ALPHA
1269 #undef B
1270 #undef I
1271 #undef A1
1272 #undef A2
1273 #undef LDA3
1274 #ifdef _WIN32
1275 #undef ARG_ALPHA
1276 #undef ARG_B
1277 #endif
1278 #undef ARG_BIAS
1279 }
1280
1281 }
1282 }
1283 }