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