Publishing 2019 R1 content
[platform/upstream/dldt.git] / inference-engine / thirdparty / mkl-dnn / src / cpu / gemm / s8x8s32 / jit_avx512_core_u8_copy_bt_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_bt_kern::jit_avx512_core_u8_copy_bt_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 l120;
63 Xbyak::Label l14c;
64 Xbyak::Label l168;
65 Xbyak::Label l178;
66 Xbyak::Label l184;
67 Xbyak::Label l194;
68 Xbyak::Label l20;
69 Xbyak::Label l20c;
70 Xbyak::Label l250;
71 Xbyak::Label l27c;
72 Xbyak::Label l298;
73 Xbyak::Label l2a8;
74 Xbyak::Label l2b4;
75 Xbyak::Label l2c8;
76 Xbyak::Label l34;
77 Xbyak::Label l360;
78 Xbyak::Label l3b4;
79 Xbyak::Label l3e8;
80 Xbyak::Label l400;
81 Xbyak::Label l40e;
82 Xbyak::Label l418;
83 Xbyak::Label l428;
84 Xbyak::Label l4a0;
85 Xbyak::Label l4e8;
86 Xbyak::Label l50c;
87 Xbyak::Label l524;
88 Xbyak::Label l534;
89 Xbyak::Label lcc;
90
91         preamble();
92 #ifdef _WIN32
93         auto stacksize = get_size_of_abi_save_regs();
94         mov(ALPHA, ptr[ARG_ALPHA]);
95         mov(B, ptr[ARG_B]);
96 #endif
97
98         mov(M, qword[M]);
99         mov(N, qword[N]);
100         mov(LDA, qword[LDA]);
101         lea(LDA3, ptr[LDA+LDA*2]);
102         sub(A, -128);
103         sub(B, -128);
104         cmp(N, 0x8);
105         jl(l178, T_NEAR);
106         align(4);
107
108 L(l20);
109         mov(A1, A);
110         add(A, 0x8);
111         mov(I, M);
112         sar(I, 0x3);
113         jle(lcc, T_NEAR);
114         align(4);
115
116 L(l34);
117         movq(xmm0, qword[A1-0x80]);
118         add(A1, LDA);
119         movq(xmm1, qword[A1-0x80]);
120         add(A1, LDA);
121         movq(xmm2, qword[A1-0x80]);
122         add(A1, LDA);
123         movq(xmm3, qword[A1-0x80]);
124         add(A1, LDA);
125         punpcklbw(xmm0, xmm1);
126         punpcklbw(xmm2, xmm3);
127         movdqa(xmm1, xmm0);
128         punpcklwd(xmm0, xmm2);
129         punpckhwd(xmm1, xmm2);
130         movdqu(xword[B-0x80], xmm0);
131         movdqu(xword[B-0x70], xmm1);
132         movq(xmm0, qword[A1-0x80]);
133         add(A1, LDA);
134         movq(xmm1, qword[A1-0x80]);
135         add(A1, LDA);
136         movq(xmm2, qword[A1-0x80]);
137         add(A1, LDA);
138         movq(xmm3, qword[A1-0x80]);
139         add(A1, LDA);
140         punpcklbw(xmm0, xmm1);
141         punpcklbw(xmm2, xmm3);
142         movdqa(xmm1, xmm0);
143         punpcklwd(xmm0, xmm2);
144         punpckhwd(xmm1, xmm2);
145         movdqu(xword[B-0x60], xmm0);
146         movdqu(xword[B-0x50], xmm1);
147         sub(B, -64);
148         dec(I);
149         jg(l34, T_NEAR);
150         align(4);
151
152 L(lcc);
153         test(M, 0x4);
154         jle(l120, T_NEAR);
155         movq(xmm0, qword[A1-0x80]);
156         add(A1, LDA);
157         movq(xmm1, qword[A1-0x80]);
158         add(A1, LDA);
159         movq(xmm2, qword[A1-0x80]);
160         add(A1, LDA);
161         movq(xmm3, qword[A1-0x80]);
162         add(A1, LDA);
163         punpcklbw(xmm0, xmm1);
164         punpcklbw(xmm2, xmm3);
165         movdqa(xmm1, xmm0);
166         punpcklwd(xmm0, xmm2);
167         punpckhwd(xmm1, xmm2);
168         movdqu(xword[B-0x80], xmm0);
169         movdqu(xword[B-0x70], xmm1);
170         sub(B, -32);
171         align(4);
172
173 L(l120);
174         test(M, 0x2);
175         jle(l14c, T_NEAR);
176         movq(xmm0, qword[A1-0x80]);
177         add(A1, LDA);
178         movq(xmm1, qword[A1-0x80]);
179         add(A1, LDA);
180         punpcklbw(xmm0, xmm1);
181         movdqu(xword[B-0x80], xmm0);
182         sub(B, -16);
183         align(4);
184
185 L(l14c);
186         test(M, 0x1);
187         jle(l168, T_NEAR);
188         movq(xmm0, qword[A1-0x80]);
189         add(A1, LDA);
190         movq(qword[B-0x80], xmm0);
191         sub(B, -8);
192         align(4);
193
194 L(l168);
195         sub(N, 0x8);
196         cmp(N, 0x8);
197         jge(l20, T_NEAR);
198         align(4);
199
200 L(l178);
201         cmp(N, 0x4);
202         jl(l2a8, T_NEAR);
203         align(4);
204
205 L(l184);
206         mov(A1, A);
207         add(A, 0x4);
208         mov(I, M);
209         sar(I, 0x3);
210         jle(l20c, T_NEAR);
211         align(4);
212
213 L(l194);
214         movd(xmm0, dword[A1-0x80]);
215         add(A1, LDA);
216         movd(xmm1, dword[A1-0x80]);
217         add(A1, LDA);
218         movd(xmm2, dword[A1-0x80]);
219         add(A1, LDA);
220         movd(xmm3, dword[A1-0x80]);
221         add(A1, LDA);
222         punpcklbw(xmm0, xmm1);
223         punpcklbw(xmm2, xmm3);
224         punpcklwd(xmm0, xmm2);
225         movdqu(xword[B-0x80], xmm0);
226         movd(xmm0, dword[A1-0x80]);
227         add(A1, LDA);
228         movd(xmm1, dword[A1-0x80]);
229         add(A1, LDA);
230         movd(xmm2, dword[A1-0x80]);
231         add(A1, LDA);
232         movd(xmm3, dword[A1-0x80]);
233         add(A1, LDA);
234         punpcklbw(xmm0, xmm1);
235         punpcklbw(xmm2, xmm3);
236         punpcklwd(xmm0, xmm2);
237         movdqu(xword[B-0x70], xmm0);
238         sub(B, -32);
239         dec(I);
240         jg(l194, T_NEAR);
241         align(4);
242
243 L(l20c);
244         test(M, 0x4);
245         jle(l250, T_NEAR);
246         movd(xmm0, dword[A1-0x80]);
247         add(A1, LDA);
248         movd(xmm1, dword[A1-0x80]);
249         add(A1, LDA);
250         movd(xmm2, dword[A1-0x80]);
251         add(A1, LDA);
252         movd(xmm3, dword[A1-0x80]);
253         add(A1, LDA);
254         punpcklbw(xmm0, xmm1);
255         punpcklbw(xmm2, xmm3);
256         punpcklwd(xmm0, xmm2);
257         movdqu(xword[B-0x80], xmm0);
258         sub(B, -16);
259         align(4);
260
261 L(l250);
262         test(M, 0x2);
263         jle(l27c, T_NEAR);
264         movd(xmm0, dword[A1-0x80]);
265         add(A1, LDA);
266         movd(xmm1, dword[A1-0x80]);
267         add(A1, LDA);
268         punpcklbw(xmm0, xmm1);
269         movq(qword[B-0x80], xmm0);
270         sub(B, -8);
271         align(4);
272
273 L(l27c);
274         test(M, 0x1);
275         jle(l298, T_NEAR);
276         movd(xmm0, dword[A1-0x80]);
277         movd(dword[B-0x80], xmm0);
278         sub(B, -4);
279         align(4);
280
281 L(l298);
282         sub(N, 0x4);
283         cmp(N, 0x4);
284         jge(l184, T_NEAR);
285         align(4);
286
287 L(l2a8);
288         cmp(N, 0x2);
289         jl(l40e, T_NEAR);
290         align(4);
291
292 L(l2b4);
293         mov(A1, A);
294         add(A, 0x2);
295         mov(LDA3, M);
296         sar(LDA3, 0x3);
297         jle(l360, T_NEAR);
298         align(4);
299
300 L(l2c8);
301         mov(ax, word[A1-0x80]);
302         add(A1, LDA);
303         pinsrw(xmm0, eax, 0x0);
304         mov(ax, word[A1-0x80]);
305         add(A1, LDA);
306         pinsrw(xmm1, eax, 0x0);
307         mov(ax, word[A1-0x80]);
308         add(A1, LDA);
309         pinsrw(xmm2, eax, 0x0);
310         mov(ax, word[A1-0x80]);
311         add(A1, LDA);
312         pinsrw(xmm3, eax, 0x0);
313         punpcklbw(xmm0, xmm1);
314         punpcklbw(xmm2, xmm3);
315         punpcklwd(xmm0, xmm2);
316         mov(ax, word[A1-0x80]);
317         add(A1, LDA);
318         pinsrw(xmm1, eax, 0x0);
319         mov(ax, word[A1-0x80]);
320         add(A1, LDA);
321         pinsrw(xmm2, eax, 0x0);
322         mov(ax, word[A1-0x80]);
323         add(A1, LDA);
324         pinsrw(xmm3, eax, 0x0);
325         mov(ax, word[A1-0x80]);
326         add(A1, LDA);
327         pinsrw(xmm4, eax, 0x0);
328         punpcklbw(xmm1, xmm2);
329         punpcklbw(xmm3, xmm4);
330         punpcklwd(xmm1, xmm3);
331         punpcklqdq(xmm0, xmm1);
332         movdqu(xword[B-0x80], xmm0);
333         sub(B, -16);
334         dec(LDA3);
335         jg(l2c8, T_NEAR);
336         align(4);
337
338 L(l360);
339         test(M, 0x4);
340         jle(l3b4, T_NEAR);
341         mov(ax, word[A1-0x80]);
342         add(A1, LDA);
343         pinsrw(xmm0, eax, 0x0);
344         mov(ax, word[A1-0x80]);
345         add(A1, LDA);
346         pinsrw(xmm1, eax, 0x0);
347         mov(ax, word[A1-0x80]);
348         add(A1, LDA);
349         pinsrw(xmm2, eax, 0x0);
350         mov(ax, word[A1-0x80]);
351         add(A1, LDA);
352         pinsrw(xmm3, eax, 0x0);
353         punpcklbw(xmm0, xmm1);
354         punpcklbw(xmm2, xmm3);
355         punpcklwd(xmm0, xmm2);
356         movq(qword[B-0x80], xmm0);
357         sub(B, -8);
358         align(4);
359
360 L(l3b4);
361         test(M, 0x2);
362         jle(l3e8, T_NEAR);
363         mov(ax, word[A1-0x80]);
364         add(A1, LDA);
365         pinsrw(xmm0, eax, 0x0);
366         mov(ax, word[A1-0x80]);
367         add(A1, LDA);
368         pinsrw(xmm1, eax, 0x0);
369         punpcklbw(xmm0, xmm1);
370         movd(dword[B-0x80], xmm0);
371         sub(B, -4);
372         align(4);
373
374 L(l3e8);
375         test(M, 0x1);
376         jle(l400, T_NEAR);
377         mov(ax, word[A1-0x80]);
378         mov(word[B-0x80], ax);
379         sub(B, -2);
380         align(4);
381
382 L(l400);
383         sub(N, 0x2);
384         cmp(N, 0x2);
385         jge(l2b4, T_NEAR);
386         align(4);
387
388 L(l40e);
389         cmp(N, 0x1);
390         jl(l534, T_NEAR);
391         align(4);
392
393 L(l418);
394         mov(A1, A);
395         add(A, 0x1);
396         mov(LDA3, M);
397         sar(LDA3, 0x3);
398         jle(l4a0, T_NEAR);
399         align(4);
400
401 L(l428);
402         mov(al, byte[A1-0x80]);
403         add(A1, LDA);
404         pinsrb(xmm0, eax, 0x0);
405         mov(al, byte[A1-0x80]);
406         add(A1, LDA);
407         pinsrb(xmm0, eax, 0x1);
408         mov(al, byte[A1-0x80]);
409         add(A1, LDA);
410         pinsrb(xmm0, eax, 0x2);
411         mov(al, byte[A1-0x80]);
412         add(A1, LDA);
413         pinsrb(xmm0, eax, 0x3);
414         mov(al, byte[A1-0x80]);
415         add(A1, LDA);
416         pinsrb(xmm0, eax, 0x4);
417         mov(al, byte[A1-0x80]);
418         add(A1, LDA);
419         pinsrb(xmm0, eax, 0x5);
420         mov(al, byte[A1-0x80]);
421         add(A1, LDA);
422         pinsrb(xmm0, eax, 0x6);
423         mov(al, byte[A1-0x80]);
424         add(A1, LDA);
425         pinsrb(xmm0, eax, 0x7);
426         movq(qword[B-0x80], xmm0);
427         sub(B, -8);
428         dec(LDA3);
429         jg(l428, T_NEAR);
430         align(4);
431
432 L(l4a0);
433         test(M, 0x4);
434         jle(l4e8, T_NEAR);
435         mov(al, byte[A1-0x80]);
436         add(A1, LDA);
437         pinsrb(xmm0, eax, 0x0);
438         mov(al, byte[A1-0x80]);
439         add(A1, LDA);
440         pinsrb(xmm0, eax, 0x1);
441         mov(al, byte[A1-0x80]);
442         add(A1, LDA);
443         pinsrb(xmm0, eax, 0x2);
444         mov(al, byte[A1-0x80]);
445         add(A1, LDA);
446         pinsrb(xmm0, eax, 0x3);
447         movd(dword[B-0x80], xmm0);
448         sub(B, -4);
449         align(4);
450
451 L(l4e8);
452         test(M, 0x2);
453         jle(l50c, T_NEAR);
454         mov(al, byte[A1-0x80]);
455         add(A1, LDA);
456         mov(byte[B-0x80], al);
457         mov(al, byte[A1-0x80]);
458         add(A1, LDA);
459         mov(byte[B-0x7f], al);
460         sub(B, -2);
461         align(4);
462
463 L(l50c);
464         test(M, 0x1);
465         jle(l524, T_NEAR);
466         mov(al, byte[A1-0x80]);
467         mov(byte[B-0x80], al);
468         sub(B, -1);
469         align(4);
470
471 L(l524);
472         sub(N, 0x1);
473         cmp(N, 0x1);
474         jge(l418, T_NEAR);
475         align(4);
476
477 L(l534);
478
479         postamble();
480 }
481 outLocalLabel();
482
483 #undef M
484 #undef N
485 #undef A
486 #undef LDA
487 #undef ALPHA
488 #undef B
489 #undef I
490 #undef A1
491 #undef A2
492 #undef LDA3
493 #ifdef _WIN32
494 #undef ARG_ALPHA
495 #undef ARG_B
496 #endif
497 }
498
499 }
500 }
501 }