Publishing 2019 R1 content
[platform/upstream/dldt.git] / inference-engine / thirdparty / mkl-dnn / src / cpu / gemm / s8x8s32 / jit_avx512_core_u8_copy_sum_bn_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_bn_kern::jit_avx512_core_u8_copy_sum_bn_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 l20;
66 Xbyak::Label l22c;
67 Xbyak::Label l340;
68 Xbyak::Label l3f8;
69 Xbyak::Label l48;
70 Xbyak::Label l498;
71 Xbyak::Label l51c;
72 Xbyak::Label l540;
73 Xbyak::Label l54c;
74 Xbyak::Label l56c;
75 Xbyak::Label l664;
76 Xbyak::Label l6f8;
77 Xbyak::Label l75c;
78 Xbyak::Label l7b4;
79 Xbyak::Label l7fc;
80 Xbyak::Label l81c;
81 Xbyak::Label l828;
82 Xbyak::Label l848;
83 Xbyak::Label l8d8;
84 Xbyak::Label l930;
85 Xbyak::Label l974;
86 Xbyak::Label l9b8;
87 Xbyak::Label l9ec;
88 Xbyak::Label la0a;
89 Xbyak::Label la14;
90 Xbyak::Label la28;
91 Xbyak::Label la6c;
92 Xbyak::Label laa8;
93 Xbyak::Label lae0;
94 Xbyak::Label lb14;
95 Xbyak::Label lb38;
96 Xbyak::Label lb58;
97
98         preamble();
99         auto stacksize = get_size_of_abi_save_regs();
100 #ifdef _WIN32
101         mov(ALPHA, ptr[ARG_ALPHA]);
102         mov(B, ptr[ARG_B]);
103 #endif
104
105         mov(N, qword[N]);
106         mov(M, qword[M]);
107         mov(LDA, qword[LDA]);
108         sub(A, -128);
109         sub(B, -128);
110         lea(LDA3, ptr[LDA+LDA*2]);
111         cmp(N, 0x8);
112         jl(l540, T_NEAR);
113         align(4);
114
115 L(l20);
116         mov(A1, A);
117         lea(A2, ptr[A1+LDA*4]);
118         lea(I, ptr[A1+LDA*8]);
119         mov(A, I);
120         pxor(xmm8, xmm8);
121         pxor(xmm9, xmm9);
122         mov(I, M);
123         sar(I, 0x4);
124         jle(l22c, T_NEAR);
125         align(4);
126
127 L(l48);
128         movdqu(xmm0, xword[A1-0x80]);
129         movdqu(xmm1, xword[A1+LDA*1-0x80]);
130         movdqu(xmm2, xword[A1+LDA*2-0x80]);
131         movdqu(xmm3, xword[A1+LDA3*1-0x80]);
132         sub(A1, -16);
133         movdqa(xmm4, xmm0);
134         punpckldq(xmm0, xmm1);
135         punpckhdq(xmm4, xmm1);
136         movdqa(xmm5, xmm2);
137         punpckldq(xmm2, xmm3);
138         punpckhdq(xmm5, xmm3);
139         movdqa(xmm1, xmm0);
140         punpcklqdq(xmm0, xmm2);
141         punpckhqdq(xmm1, xmm2);
142         movdqa(xmm3, xmm4);
143         punpcklqdq(xmm4, xmm5);
144         punpckhqdq(xmm3, xmm5);
145         pmovsxbw(xmm5, xmm0);
146         movhlps(xmm6, xmm0);
147         pmovsxbw(xmm6, xmm6);
148         phaddw(xmm5, xmm6);
149         phaddw(xmm5, xmm5);
150         pmovsxwd(xmm5, xmm5);
151         paddd(xmm8, xmm5);
152         movdqu(xword[B-0x80], xmm0);
153         pmovsxbw(xmm5, xmm1);
154         movhlps(xmm6, xmm1);
155         pmovsxbw(xmm6, xmm6);
156         phaddw(xmm5, xmm6);
157         phaddw(xmm5, xmm5);
158         pmovsxwd(xmm5, xmm5);
159         paddd(xmm8, xmm5);
160         movdqu(xword[B-0x60], xmm1);
161         pmovsxbw(xmm5, xmm4);
162         movhlps(xmm6, xmm4);
163         pmovsxbw(xmm6, xmm6);
164         phaddw(xmm5, xmm6);
165         phaddw(xmm5, xmm5);
166         pmovsxwd(xmm5, xmm5);
167         paddd(xmm8, xmm5);
168         movdqu(xword[B-0x40], xmm4);
169         pmovsxbw(xmm5, xmm3);
170         movhlps(xmm6, xmm3);
171         pmovsxbw(xmm6, xmm6);
172         phaddw(xmm5, xmm6);
173         phaddw(xmm5, xmm5);
174         pmovsxwd(xmm5, xmm5);
175         paddd(xmm8, xmm5);
176         movdqu(xword[B-0x20], xmm3);
177         movdqu(xmm0, xword[A2-0x80]);
178         movdqu(xmm1, xword[A2+LDA*1-0x80]);
179         movdqu(xmm2, xword[A2+LDA*2-0x80]);
180         movdqu(xmm3, xword[A2+LDA3*1-0x80]);
181         sub(A2, -16);
182         movdqa(xmm4, xmm0);
183         punpckldq(xmm0, xmm1);
184         punpckhdq(xmm4, xmm1);
185         movdqa(xmm5, xmm2);
186         punpckldq(xmm2, xmm3);
187         punpckhdq(xmm5, xmm3);
188         movdqa(xmm1, xmm0);
189         punpcklqdq(xmm0, xmm2);
190         punpckhqdq(xmm1, xmm2);
191         movdqa(xmm3, xmm4);
192         punpcklqdq(xmm4, xmm5);
193         punpckhqdq(xmm3, xmm5);
194         pmovsxbw(xmm5, xmm0);
195         movhlps(xmm6, xmm0);
196         pmovsxbw(xmm6, xmm6);
197         phaddw(xmm5, xmm6);
198         phaddw(xmm5, xmm5);
199         pmovsxwd(xmm5, xmm5);
200         paddd(xmm9, xmm5);
201         movdqu(xword[B-0x70], xmm0);
202         pmovsxbw(xmm5, xmm1);
203         movhlps(xmm6, xmm1);
204         pmovsxbw(xmm6, xmm6);
205         phaddw(xmm5, xmm6);
206         phaddw(xmm5, xmm5);
207         pmovsxwd(xmm5, xmm5);
208         paddd(xmm9, xmm5);
209         movdqu(xword[B-0x50], xmm1);
210         pmovsxbw(xmm5, xmm4);
211         movhlps(xmm6, xmm4);
212         pmovsxbw(xmm6, xmm6);
213         phaddw(xmm5, xmm6);
214         phaddw(xmm5, xmm5);
215         pmovsxwd(xmm5, xmm5);
216         paddd(xmm9, xmm5);
217         movdqu(xword[B-0x30], xmm4);
218         pmovsxbw(xmm5, xmm3);
219         movhlps(xmm6, xmm3);
220         pmovsxbw(xmm6, xmm6);
221         phaddw(xmm5, xmm6);
222         phaddw(xmm5, xmm5);
223         pmovsxwd(xmm5, xmm5);
224         paddd(xmm9, xmm5);
225         movdqu(xword[B-0x10], xmm3);
226         sub(B, -128);
227         dec(I);
228         jg(l48, T_NEAR);
229         align(4);
230
231 L(l22c);
232         test(M, 0x8);
233         jle(l340, T_NEAR);
234         movq(xmm0, qword[A1-0x80]);
235         movq(xmm1, qword[A1+LDA*1-0x80]);
236         movq(xmm2, qword[A1+LDA*2-0x80]);
237         movq(xmm3, qword[A1+LDA3*1-0x80]);
238         sub(A1, -8);
239         punpckldq(xmm0, xmm1);
240         punpckldq(xmm2, xmm3);
241         movdqa(xmm1, xmm0);
242         punpcklqdq(xmm0, xmm2);
243         punpckhqdq(xmm1, xmm2);
244         pmovsxbw(xmm5, xmm0);
245         movhlps(xmm6, xmm0);
246         pmovsxbw(xmm6, xmm6);
247         phaddw(xmm5, xmm6);
248         phaddw(xmm5, xmm5);
249         pmovsxwd(xmm5, xmm5);
250         paddd(xmm8, xmm5);
251         movdqu(xword[B-0x80], xmm0);
252         pmovsxbw(xmm5, xmm1);
253         movhlps(xmm6, xmm1);
254         pmovsxbw(xmm6, xmm6);
255         phaddw(xmm5, xmm6);
256         phaddw(xmm5, xmm5);
257         pmovsxwd(xmm5, xmm5);
258         paddd(xmm8, xmm5);
259         movdqu(xword[B-0x60], xmm1);
260         movq(xmm0, qword[A2-0x80]);
261         movq(xmm1, qword[A2+LDA*1-0x80]);
262         movq(xmm2, qword[A2+LDA*2-0x80]);
263         movq(xmm3, qword[A2+LDA3*1-0x80]);
264         sub(A2, -8);
265         punpckldq(xmm0, xmm1);
266         punpckldq(xmm2, xmm3);
267         movdqa(xmm1, xmm0);
268         punpcklqdq(xmm0, xmm2);
269         punpckhqdq(xmm1, xmm2);
270         pmovsxbw(xmm5, xmm0);
271         movhlps(xmm6, xmm0);
272         pmovsxbw(xmm6, xmm6);
273         phaddw(xmm5, xmm6);
274         phaddw(xmm5, xmm5);
275         pmovsxwd(xmm5, xmm5);
276         paddd(xmm9, xmm5);
277         movdqu(xword[B-0x70], xmm0);
278         pmovsxbw(xmm5, xmm1);
279         movhlps(xmm6, xmm1);
280         pmovsxbw(xmm6, xmm6);
281         phaddw(xmm5, xmm6);
282         phaddw(xmm5, xmm5);
283         pmovsxwd(xmm5, xmm5);
284         paddd(xmm9, xmm5);
285         movdqu(xword[B-0x50], xmm1);
286         sub(B, -64);
287         align(4);
288
289 L(l340);
290         test(M, 0x4);
291         jle(l3f8, T_NEAR);
292         movd(xmm0, dword[A1-0x80]);
293         movd(xmm1, dword[A1+LDA*1-0x80]);
294         movd(xmm2, dword[A1+LDA*2-0x80]);
295         movd(xmm3, dword[A1+LDA3*1-0x80]);
296         sub(A1, -4);
297         punpckldq(xmm0, xmm1);
298         punpckldq(xmm2, xmm3);
299         punpcklqdq(xmm0, xmm2);
300         pmovsxbw(xmm5, xmm0);
301         movhlps(xmm6, xmm0);
302         pmovsxbw(xmm6, xmm6);
303         phaddw(xmm5, xmm6);
304         phaddw(xmm5, xmm5);
305         pmovsxwd(xmm5, xmm5);
306         paddd(xmm8, xmm5);
307         movdqu(xword[B-0x80], xmm0);
308         movd(xmm0, dword[A2-0x80]);
309         movd(xmm1, dword[A2+LDA*1-0x80]);
310         movd(xmm2, dword[A2+LDA*2-0x80]);
311         movd(xmm3, dword[A2+LDA3*1-0x80]);
312         sub(A2, -4);
313         punpckldq(xmm0, xmm1);
314         punpckldq(xmm2, xmm3);
315         punpcklqdq(xmm0, xmm2);
316         pmovsxbw(xmm5, xmm0);
317         movhlps(xmm6, xmm0);
318         pmovsxbw(xmm6, xmm6);
319         phaddw(xmm5, xmm6);
320         phaddw(xmm5, xmm5);
321         pmovsxwd(xmm5, xmm5);
322         paddd(xmm9, xmm5);
323         movdqu(xword[B-0x70], xmm0);
324         sub(B, -32);
325         align(4);
326
327 L(l3f8);
328         test(M, 0x2);
329         jle(l498, T_NEAR);
330         mov(ax, word[A1-0x80]);
331         pinsrw(xmm0, eax, 0x0);
332         mov(ax, word[A1+LDA*1-0x80]);
333         pinsrw(xmm0, eax, 0x1);
334         mov(ax, word[A1+LDA*2-0x80]);
335         pinsrw(xmm0, eax, 0x2);
336         mov(ax, word[A1+LDA3*1-0x80]);
337         sub(A1, -2);
338         pinsrw(xmm0, eax, 0x3);
339         mov(ax, word[A2-0x80]);
340         pinsrw(xmm0, eax, 0x4);
341         mov(ax, word[A2+LDA*1-0x80]);
342         pinsrw(xmm0, eax, 0x5);
343         mov(ax, word[A2+LDA*2-0x80]);
344         pinsrw(xmm0, eax, 0x6);
345         mov(ax, word[A2+LDA3*1-0x80]);
346         sub(A2, -2);
347         pinsrw(xmm0, eax, 0x7);
348         pmovsxbw(xmm5, xmm0);
349         phaddw(xmm5, xmm5);
350         pmovsxwd(xmm5, xmm5);
351         paddd(xmm8, xmm5);
352         movhlps(xmm6, xmm0);
353         pmovsxbw(xmm6, xmm6);
354         phaddw(xmm6, xmm6);
355         pmovsxwd(xmm6, xmm6);
356         paddd(xmm9, xmm6);
357         movdqu(xword[B-0x80], xmm0);
358         sub(B, -16);
359         align(4);
360
361 L(l498);
362         test(M, 0x1);
363         jle(l51c, T_NEAR);
364         mov(al, byte[A1-0x80]);
365         pinsrb(xmm0, eax, 0x0);
366         mov(al, byte[A1+LDA*1-0x80]);
367         pinsrb(xmm0, eax, 0x1);
368         mov(al, byte[A1+LDA*2-0x80]);
369         pinsrb(xmm0, eax, 0x2);
370         mov(al, byte[A1+LDA3*1-0x80]);
371         pinsrb(xmm0, eax, 0x3);
372         mov(al, byte[A2-0x80]);
373         pinsrb(xmm0, eax, 0x4);
374         mov(al, byte[A2+LDA*1-0x80]);
375         pinsrb(xmm0, eax, 0x5);
376         mov(al, byte[A2+LDA*2-0x80]);
377         pinsrb(xmm0, eax, 0x6);
378         mov(al, byte[A2+LDA3*1-0x80]);
379         pinsrb(xmm0, eax, 0x7);
380         pmovsxbd(xmm5, xmm0);
381         pshufd(xmm6, xmm0, 0x55);
382         pmovsxbd(xmm6, xmm6);
383         paddd(xmm8, xmm5);
384         paddd(xmm9, xmm6);
385         movq(qword[B-0x80], xmm0);
386         sub(B, -8);
387         align(4);
388
389 L(l51c);
390         mov(A1, qword[ARG_BIAS]);
391         movdqu(xword[A1], xmm8);
392         movdqu(xword[A1+0x10], xmm9);
393         add(qword[ARG_BIAS], 0x20);
394         sub(N, 0x8);
395         cmp(N, 0x8);
396         jge(l20, T_NEAR);
397         align(4);
398
399 L(l540);
400         cmp(N, 0x4);
401         jl(l81c, T_NEAR);
402         align(4);
403
404 L(l54c);
405         mov(A1, A);
406         lea(A2, ptr[A1+LDA*2]);
407         lea(I, ptr[A1+LDA*4]);
408         mov(A, I);
409         pxor(xmm7, xmm7);
410         mov(I, M);
411         sar(I, 0x4);
412         jle(l664, T_NEAR);
413         align(4);
414
415 L(l56c);
416         movdqu(xmm0, xword[A1-0x80]);
417         movdqu(xmm1, xword[A1+LDA*1-0x80]);
418         sub(A1, -16);
419         movdqu(xmm2, xword[A2-0x80]);
420         movdqu(xmm3, xword[A2+LDA*1-0x80]);
421         sub(A2, -16);
422         movdqa(xmm4, xmm0);
423         punpckldq(xmm0, xmm1);
424         punpckhdq(xmm4, xmm1);
425         movdqa(xmm5, xmm2);
426         punpckldq(xmm2, xmm3);
427         punpckhdq(xmm5, xmm3);
428         movdqa(xmm1, xmm0);
429         punpcklqdq(xmm0, xmm2);
430         punpckhqdq(xmm1, xmm2);
431         movdqa(xmm3, xmm4);
432         punpcklqdq(xmm4, xmm5);
433         punpckhqdq(xmm3, xmm5);
434         pmovsxbw(xmm5, xmm0);
435         movhlps(xmm6, xmm0);
436         pmovsxbw(xmm6, xmm6);
437         phaddw(xmm5, xmm6);
438         phaddw(xmm5, xmm5);
439         pmovsxwd(xmm5, xmm5);
440         paddd(xmm7, xmm5);
441         movdqu(xword[B-0x80], xmm0);
442         pmovsxbw(xmm5, xmm1);
443         movhlps(xmm6, xmm1);
444         pmovsxbw(xmm6, xmm6);
445         phaddw(xmm5, xmm6);
446         phaddw(xmm5, xmm5);
447         pmovsxwd(xmm5, xmm5);
448         paddd(xmm7, xmm5);
449         movdqu(xword[B-0x70], xmm1);
450         pmovsxbw(xmm5, xmm4);
451         movhlps(xmm6, xmm4);
452         pmovsxbw(xmm6, xmm6);
453         phaddw(xmm5, xmm6);
454         phaddw(xmm5, xmm5);
455         pmovsxwd(xmm5, xmm5);
456         paddd(xmm7, xmm5);
457         movdqu(xword[B-0x60], xmm4);
458         pmovsxbw(xmm5, xmm3);
459         movhlps(xmm6, xmm3);
460         pmovsxbw(xmm6, xmm6);
461         phaddw(xmm5, xmm6);
462         phaddw(xmm5, xmm5);
463         pmovsxwd(xmm5, xmm5);
464         paddd(xmm7, xmm5);
465         movdqu(xword[B-0x50], xmm3);
466         sub(B, -64);
467         dec(I);
468         jg(l56c, T_NEAR);
469         align(4);
470
471 L(l664);
472         test(M, 0x8);
473         jle(l6f8, T_NEAR);
474         movq(xmm0, qword[A1-0x80]);
475         movq(xmm1, qword[A1+LDA*1-0x80]);
476         sub(A1, -8);
477         movq(xmm2, qword[A2-0x80]);
478         movq(xmm3, qword[A2+LDA*1-0x80]);
479         sub(A2, -8);
480         punpckldq(xmm0, xmm1);
481         punpckldq(xmm2, xmm3);
482         movdqa(xmm1, xmm0);
483         punpcklqdq(xmm0, xmm2);
484         punpckhqdq(xmm1, xmm2);
485         pmovsxbw(xmm5, xmm0);
486         movhlps(xmm6, xmm0);
487         pmovsxbw(xmm6, xmm6);
488         phaddw(xmm5, xmm6);
489         phaddw(xmm5, xmm5);
490         pmovsxwd(xmm5, xmm5);
491         paddd(xmm7, xmm5);
492         movdqu(xword[B-0x80], xmm0);
493         pmovsxbw(xmm5, xmm1);
494         movhlps(xmm6, xmm1);
495         pmovsxbw(xmm6, xmm6);
496         phaddw(xmm5, xmm6);
497         phaddw(xmm5, xmm5);
498         pmovsxwd(xmm5, xmm5);
499         paddd(xmm7, xmm5);
500         movdqu(xword[B-0x70], xmm1);
501         sub(B, -32);
502         align(4);
503
504 L(l6f8);
505         test(M, 0x4);
506         jle(l75c, T_NEAR);
507         movd(xmm0, dword[A1-0x80]);
508         movd(xmm1, dword[A1+LDA*1-0x80]);
509         sub(A1, -4);
510         movd(xmm2, dword[A2-0x80]);
511         movd(xmm3, dword[A2+LDA*1-0x80]);
512         sub(A2, -4);
513         punpckldq(xmm0, xmm1);
514         punpckldq(xmm2, xmm3);
515         punpcklqdq(xmm0, xmm2);
516         pmovsxbw(xmm5, xmm0);
517         movhlps(xmm6, xmm0);
518         pmovsxbw(xmm6, xmm6);
519         phaddw(xmm5, xmm6);
520         phaddw(xmm5, xmm5);
521         pmovsxwd(xmm5, xmm5);
522         paddd(xmm7, xmm5);
523         movdqu(xword[B-0x80], xmm0);
524         sub(B, -16);
525         align(4);
526
527 L(l75c);
528         test(M, 0x2);
529         jle(l7b4, T_NEAR);
530         mov(ax, word[A1-0x80]);
531         pinsrw(xmm0, eax, 0x0);
532         mov(ax, word[A1+LDA*1-0x80]);
533         sub(A1, -2);
534         pinsrw(xmm0, eax, 0x1);
535         mov(ax, word[A2-0x80]);
536         pinsrw(xmm0, eax, 0x2);
537         mov(ax, word[A2+LDA*1-0x80]);
538         sub(A2, -2);
539         pinsrw(xmm0, eax, 0x3);
540         pmovsxbw(xmm5, xmm0);
541         phaddw(xmm5, xmm5);
542         pmovsxwd(xmm5, xmm5);
543         paddd(xmm7, xmm5);
544         movq(qword[B-0x80], xmm0);
545         sub(B, -8);
546         align(4);
547
548 L(l7b4);
549         test(M, 0x1);
550         jle(l7fc, T_NEAR);
551         mov(al, byte[A1-0x80]);
552         pinsrb(xmm0, eax, 0x0);
553         mov(al, byte[A1+LDA*1-0x80]);
554         pinsrb(xmm0, eax, 0x1);
555         mov(al, byte[A2-0x80]);
556         pinsrb(xmm0, eax, 0x2);
557         mov(al, byte[A2+LDA*1-0x80]);
558         pinsrb(xmm0, eax, 0x3);
559         pmovsxbd(xmm5, xmm0);
560         paddd(xmm7, xmm5);
561         movd(dword[B-0x80], xmm0);
562         sub(B, -4);
563         align(4);
564
565 L(l7fc);
566         mov(A1, qword[ARG_BIAS]);
567         movdqu(xword[A1], xmm7);
568         add(qword[ARG_BIAS], 0x10);
569         sub(N, 0x4);
570         cmp(N, 0x4);
571         jge(l54c, T_NEAR);
572         align(4);
573
574 L(l81c);
575         cmp(N, 0x2);
576         jl(la0a, T_NEAR);
577         align(4);
578
579 L(l828);
580         mov(A1, A);
581         lea(A2, ptr[A1+LDA*1]);
582         lea(I, ptr[A1+LDA*2]);
583         mov(A, I);
584         pxor(xmm7, xmm7);
585         mov(I, M);
586         sar(I, 0x4);
587         jle(l8d8, T_NEAR);
588         align(4);
589
590 L(l848);
591         movdqu(xmm0, xword[A1-0x80]);
592         sub(A1, -16);
593         movdqu(xmm1, xword[A2-0x80]);
594         sub(A2, -16);
595         movdqa(xmm2, xmm0);
596         punpckldq(xmm0, xmm1);
597         punpckhdq(xmm2, xmm1);
598         pshufd(xmm6, xmm0, 0xd8);
599         pmovsxbw(xmm5, xmm6);
600         movhlps(xmm6, xmm6);
601         pmovsxbw(xmm6, xmm6);
602         phaddw(xmm5, xmm6);
603         phaddw(xmm5, xmm5);
604         phaddw(xmm5, xmm5);
605         pmovsxwd(xmm5, xmm5);
606         paddd(xmm7, xmm5);
607         movdqu(xword[B-0x80], xmm0);
608         pshufd(xmm6, xmm2, 0xd8);
609         pmovsxbw(xmm5, xmm6);
610         movhlps(xmm6, xmm6);
611         pmovsxbw(xmm6, xmm6);
612         phaddw(xmm5, xmm6);
613         phaddw(xmm5, xmm5);
614         phaddw(xmm5, xmm5);
615         pmovsxwd(xmm5, xmm5);
616         paddd(xmm7, xmm5);
617         movdqu(xword[B-0x70], xmm2);
618         sub(B, -32);
619         dec(I);
620         jg(l848, T_NEAR);
621         align(4);
622
623 L(l8d8);
624         test(M, 0x8);
625         jle(l930, T_NEAR);
626         movq(xmm0, qword[A1-0x80]);
627         sub(A1, -8);
628         movq(xmm1, qword[A2-0x80]);
629         sub(A2, -8);
630         punpckldq(xmm0, xmm1);
631         pshufd(xmm6, xmm0, 0xd8);
632         pmovsxbw(xmm5, xmm6);
633         movhlps(xmm6, xmm6);
634         pmovsxbw(xmm6, xmm6);
635         phaddw(xmm5, xmm6);
636         phaddw(xmm5, xmm5);
637         phaddw(xmm5, xmm5);
638         pmovsxwd(xmm5, xmm5);
639         paddd(xmm7, xmm5);
640         movdqu(xword[B-0x80], xmm0);
641         sub(B, -16);
642         align(4);
643
644 L(l930);
645         test(M, 0x4);
646         jle(l974, T_NEAR);
647         movd(xmm0, dword[A1-0x80]);
648         sub(A1, -4);
649         movd(xmm1, dword[A2-0x80]);
650         sub(A2, -4);
651         punpckldq(xmm0, xmm1);
652         pmovsxbw(xmm5, xmm0);
653         phaddw(xmm5, xmm5);
654         phaddw(xmm5, xmm5);
655         pmovsxwd(xmm5, xmm5);
656         paddd(xmm7, xmm5);
657         movq(qword[B-0x80], xmm0);
658         sub(B, -8);
659         align(4);
660
661 L(l974);
662         test(M, 0x2);
663         jle(l9b8, T_NEAR);
664         mov(ax, word[A1-0x80]);
665         sub(A1, -2);
666         pinsrw(xmm0, eax, 0x0);
667         mov(ax, word[A2-0x80]);
668         sub(A2, -2);
669         pinsrw(xmm0, eax, 0x1);
670         pmovsxbw(xmm5, xmm0);
671         phaddw(xmm5, xmm5);
672         pmovsxwd(xmm5, xmm5);
673         paddd(xmm7, xmm5);
674         movd(dword[B-0x80], xmm0);
675         sub(B, -4);
676         align(4);
677
678 L(l9b8);
679         test(M, 0x1);
680         jle(l9ec, T_NEAR);
681         mov(al, byte[A1-0x80]);
682         pinsrb(xmm0, eax, 0x0);
683         mov(byte[B-0x80], al);
684         mov(al, byte[A2-0x80]);
685         pinsrb(xmm0, eax, 0x1);
686         mov(byte[B-0x7f], al);
687         sub(B, -2);
688         pmovsxbd(xmm5, xmm0);
689         paddd(xmm7, xmm5);
690         align(4);
691
692 L(l9ec);
693         mov(A1, qword[ARG_BIAS]);
694         movq(qword[A1], xmm7);
695         add(qword[ARG_BIAS], 0x8);
696         sub(N, 0x2);
697         cmp(N, 0x2);
698         jge(l828, T_NEAR);
699         align(4);
700
701 L(la0a);
702         cmp(N, 0x1);
703         jl(lb58, T_NEAR);
704         align(4);
705
706 L(la14);
707         mov(A1, A);
708         add(A, LDA);
709         pxor(xmm7, xmm7);
710         mov(I, M);
711         sar(I, 0x4);
712         jle(la6c, T_NEAR);
713         align(4);
714
715 L(la28);
716         movdqu(xmm0, xword[A1-0x80]);
717         sub(A1, -16);
718         pmovsxbw(xmm5, xmm0);
719         movhlps(xmm6, xmm0);
720         pmovsxbw(xmm6, xmm6);
721         phaddw(xmm5, xmm6);
722         phaddw(xmm5, xmm5);
723         phaddw(xmm5, xmm5);
724         phaddw(xmm5, xmm5);
725         pmovsxwd(xmm5, xmm5);
726         paddd(xmm7, xmm5);
727         movdqu(xword[B-0x80], xmm0);
728         sub(B, -16);
729         dec(I);
730         jg(la28, T_NEAR);
731         align(4);
732
733 L(la6c);
734         test(M, 0x8);
735         jle(laa8, T_NEAR);
736         movq(xmm0, qword[A1-0x80]);
737         sub(A1, -8);
738         pmovsxbw(xmm5, xmm0);
739         phaddw(xmm5, xmm6);
740         phaddw(xmm5, xmm5);
741         phaddw(xmm5, xmm5);
742         pmovsxwd(xmm5, xmm5);
743         paddd(xmm7, xmm5);
744         movq(qword[B-0x80], xmm0);
745         sub(B, -8);
746         align(4);
747
748 L(laa8);
749         test(M, 0x4);
750         jle(lae0, T_NEAR);
751         movd(xmm0, dword[A1-0x80]);
752         sub(A1, -4);
753         pmovsxbw(xmm5, xmm0);
754         phaddw(xmm5, xmm5);
755         phaddw(xmm5, xmm5);
756         pmovsxwd(xmm5, xmm5);
757         paddd(xmm7, xmm5);
758         movd(dword[B-0x80], xmm0);
759         sub(B, -4);
760         align(4);
761
762 L(lae0);
763         test(M, 0x2);
764         jle(lb14, T_NEAR);
765         mov(ax, word[A1-0x80]);
766         pinsrw(xmm0, eax, 0x0);
767         pmovsxbw(xmm5, xmm0);
768         phaddw(xmm5, xmm5);
769         pmovsxwd(xmm5, xmm5);
770         paddd(xmm7, xmm5);
771         mov(word[B-0x80], ax);
772         sub(A1, -2);
773         sub(B, -2);
774         align(4);
775
776 L(lb14);
777         test(M, 0x1);
778         jle(lb38, T_NEAR);
779         mov(al, byte[A1-0x80]);
780         pinsrb(xmm0, eax, 0x0);
781         pmovsxbd(xmm5, xmm0);
782         paddd(xmm7, xmm5);
783         mov(byte[B-0x80], al);
784         sub(B, -1);
785         align(4);
786
787 L(lb38);
788         mov(A1, qword[ARG_BIAS]);
789         movd(dword[A1], xmm7);
790         add(qword[ARG_BIAS], 0x4);
791         sub(N, 0x1);
792         cmp(N, 0x1);
793         jge(la14, T_NEAR);
794         align(4);
795
796 L(lb58);
797
798         postamble();
799 }
800 outLocalLabel();
801
802 #undef M
803 #undef N
804 #undef A
805 #undef LDA
806 #undef ALPHA
807 #undef B
808 #undef I
809 #undef A1
810 #undef A2
811 #undef LDA3
812 #ifdef _WIN32
813 #undef ARG_ALPHA
814 #undef ARG_B
815 #endif
816 #undef ARG_BIAS
817 }
818
819 }
820 }
821 }