Publishing 2019 R1 content
[platform/upstream/dldt.git] / inference-engine / thirdparty / mkl-dnn / src / cpu / gemm / s8x8s32 / jit_avx512_core_u8_copy_at_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_at_kern::jit_avx512_core_u8_copy_at_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 l1014;
63 Xbyak::Label l1390;
64 Xbyak::Label l159c;
65 Xbyak::Label l173c;
66 Xbyak::Label l18e4;
67 Xbyak::Label l1a7c;
68 Xbyak::Label l1a8c;
69 Xbyak::Label l1a98;
70 Xbyak::Label l1ab4;
71 Xbyak::Label l1c64;
72 Xbyak::Label l1d74;
73 Xbyak::Label l1e50;
74 Xbyak::Label l1f2c;
75 Xbyak::Label l1ffc;
76 Xbyak::Label l20;
77 Xbyak::Label l200c;
78 Xbyak::Label l2018;
79 Xbyak::Label l2034;
80 Xbyak::Label l2110;
81 Xbyak::Label l21a0;
82 Xbyak::Label l2210;
83 Xbyak::Label l2284;
84 Xbyak::Label l22f0;
85 Xbyak::Label l2300;
86 Xbyak::Label l230c;
87 Xbyak::Label l2324;
88 Xbyak::Label l2398;
89 Xbyak::Label l23e8;
90 Xbyak::Label l242c;
91 Xbyak::Label l2474;
92 Xbyak::Label l24b4;
93 Xbyak::Label l24c4;
94 Xbyak::Label l24d0;
95 Xbyak::Label l24e8;
96 Xbyak::Label l2520;
97 Xbyak::Label l254c;
98 Xbyak::Label l2578;
99 Xbyak::Label l25a8;
100 Xbyak::Label l25c8;
101 Xbyak::Label l25d6;
102 Xbyak::Label l25e0;
103 Xbyak::Label l25f0;
104 Xbyak::Label l260c;
105 Xbyak::Label l262c;
106 Xbyak::Label l264c;
107 Xbyak::Label l2668;
108 Xbyak::Label l2680;
109 Xbyak::Label l2690;
110 Xbyak::Label l44;
111 Xbyak::Label l58c;
112 Xbyak::Label l8b0;
113 Xbyak::Label lb14;
114 Xbyak::Label ld84;
115 Xbyak::Label lfdc;
116 Xbyak::Label lfec;
117 Xbyak::Label lff8;
118
119         preamble();
120 #ifdef _WIN32
121         auto stacksize = get_size_of_abi_save_regs();
122         mov(ALPHA, ptr[ARG_ALPHA]);
123         mov(B, ptr[ARG_B]);
124 #endif
125
126         mov(N, qword[N]);
127         mov(M, qword[M]);
128         mov(LDA, qword[LDA]);
129         sub(A, -128);
130         sub(B, -128);
131         lea(LDA3, ptr[LDA+LDA*2]);
132         cmp(N, 0x30);
133         jl(lfec, T_NEAR);
134         align(4);
135
136 L(l20);
137         mov(A1, A);
138         mov(I, LDA);
139         shl(I, 0x5);
140         lea(I, ptr[I+LDA*8]);
141         lea(I, ptr[I+LDA*8]);
142         add(A, I);
143         mov(I, M);
144         sar(I, 0x4);
145         jle(l58c, T_NEAR);
146         align(4);
147
148 L(l44);
149         movdqu(xmm0, xword[A1-0x80]);
150         movdqu(xmm1, xword[A1+LDA*1-0x80]);
151         movdqu(xmm2, xword[A1+LDA*2-0x80]);
152         movdqu(xmm3, xword[A1+LDA3*1-0x80]);
153         lea(A2, ptr[A1+LDA*4]);
154         movdqa(xmm4, xmm0);
155         punpckldq(xmm0, xmm1);
156         punpckhdq(xmm4, xmm1);
157         movdqa(xmm5, xmm2);
158         punpckldq(xmm2, xmm3);
159         punpckhdq(xmm5, xmm3);
160         movdqa(xmm1, xmm0);
161         punpcklqdq(xmm0, xmm2);
162         punpckhqdq(xmm1, xmm2);
163         movdqa(xmm3, xmm4);
164         punpcklqdq(xmm4, xmm5);
165         punpckhqdq(xmm3, xmm5);
166         movdqu(xword[B-0x80], xmm0);
167         movdqu(xword[B+0x40], xmm1);
168         movdqu(xword[B+0x100], xmm4);
169         movdqu(xword[B+0x1c0], xmm3);
170         movdqu(xmm0, xword[A2-0x80]);
171         movdqu(xmm1, xword[A2+LDA*1-0x80]);
172         movdqu(xmm2, xword[A2+LDA*2-0x80]);
173         movdqu(xmm3, xword[A2+LDA3*1-0x80]);
174         lea(A2, ptr[A2+LDA*4]);
175         movdqa(xmm4, xmm0);
176         punpckldq(xmm0, xmm1);
177         punpckhdq(xmm4, xmm1);
178         movdqa(xmm5, xmm2);
179         punpckldq(xmm2, xmm3);
180         punpckhdq(xmm5, xmm3);
181         movdqa(xmm1, xmm0);
182         punpcklqdq(xmm0, xmm2);
183         punpckhqdq(xmm1, xmm2);
184         movdqa(xmm3, xmm4);
185         punpcklqdq(xmm4, xmm5);
186         punpckhqdq(xmm3, xmm5);
187         movdqu(xword[B-0x70], xmm0);
188         movdqu(xword[B+0x50], xmm1);
189         movdqu(xword[B+0x110], xmm4);
190         movdqu(xword[B+0x1d0], xmm3);
191         movdqu(xmm0, xword[A2-0x80]);
192         movdqu(xmm1, xword[A2+LDA*1-0x80]);
193         movdqu(xmm2, xword[A2+LDA*2-0x80]);
194         movdqu(xmm3, xword[A2+LDA3*1-0x80]);
195         lea(A2, ptr[A2+LDA*4]);
196         movdqa(xmm4, xmm0);
197         punpckldq(xmm0, xmm1);
198         punpckhdq(xmm4, xmm1);
199         movdqa(xmm5, xmm2);
200         punpckldq(xmm2, xmm3);
201         punpckhdq(xmm5, xmm3);
202         movdqa(xmm1, xmm0);
203         punpcklqdq(xmm0, xmm2);
204         punpckhqdq(xmm1, xmm2);
205         movdqa(xmm3, xmm4);
206         punpcklqdq(xmm4, xmm5);
207         punpckhqdq(xmm3, xmm5);
208         movdqu(xword[B-0x60], xmm0);
209         movdqu(xword[B+0x60], xmm1);
210         movdqu(xword[B+0x120], xmm4);
211         movdqu(xword[B+0x1e0], xmm3);
212         movdqu(xmm0, xword[A2-0x80]);
213         movdqu(xmm1, xword[A2+LDA*1-0x80]);
214         movdqu(xmm2, xword[A2+LDA*2-0x80]);
215         movdqu(xmm3, xword[A2+LDA3*1-0x80]);
216         lea(A2, ptr[A2+LDA*4]);
217         movdqa(xmm4, xmm0);
218         punpckldq(xmm0, xmm1);
219         punpckhdq(xmm4, xmm1);
220         movdqa(xmm5, xmm2);
221         punpckldq(xmm2, xmm3);
222         punpckhdq(xmm5, xmm3);
223         movdqa(xmm1, xmm0);
224         punpcklqdq(xmm0, xmm2);
225         punpckhqdq(xmm1, xmm2);
226         movdqa(xmm3, xmm4);
227         punpcklqdq(xmm4, xmm5);
228         punpckhqdq(xmm3, xmm5);
229         movdqu(xword[B-0x50], xmm0);
230         movdqu(xword[B+0x70], xmm1);
231         movdqu(xword[B+0x130], xmm4);
232         movdqu(xword[B+0x1f0], xmm3);
233         movdqu(xmm0, xword[A2-0x80]);
234         movdqu(xmm1, xword[A2+LDA*1-0x80]);
235         movdqu(xmm2, xword[A2+LDA*2-0x80]);
236         movdqu(xmm3, xword[A2+LDA3*1-0x80]);
237         lea(A2, ptr[A2+LDA*4]);
238         movdqa(xmm4, xmm0);
239         punpckldq(xmm0, xmm1);
240         punpckhdq(xmm4, xmm1);
241         movdqa(xmm5, xmm2);
242         punpckldq(xmm2, xmm3);
243         punpckhdq(xmm5, xmm3);
244         movdqa(xmm1, xmm0);
245         punpcklqdq(xmm0, xmm2);
246         punpckhqdq(xmm1, xmm2);
247         movdqa(xmm3, xmm4);
248         punpcklqdq(xmm4, xmm5);
249         punpckhqdq(xmm3, xmm5);
250         movdqu(xword[B-0x40], xmm0);
251         movdqu(xword[B+0x80], xmm1);
252         movdqu(xword[B+0x140], xmm4);
253         movdqu(xword[B+0x200], xmm3);
254         movdqu(xmm0, xword[A2-0x80]);
255         movdqu(xmm1, xword[A2+LDA*1-0x80]);
256         movdqu(xmm2, xword[A2+LDA*2-0x80]);
257         movdqu(xmm3, xword[A2+LDA3*1-0x80]);
258         lea(A2, ptr[A2+LDA*4]);
259         movdqa(xmm4, xmm0);
260         punpckldq(xmm0, xmm1);
261         punpckhdq(xmm4, xmm1);
262         movdqa(xmm5, xmm2);
263         punpckldq(xmm2, xmm3);
264         punpckhdq(xmm5, xmm3);
265         movdqa(xmm1, xmm0);
266         punpcklqdq(xmm0, xmm2);
267         punpckhqdq(xmm1, xmm2);
268         movdqa(xmm3, xmm4);
269         punpcklqdq(xmm4, xmm5);
270         punpckhqdq(xmm3, xmm5);
271         movdqu(xword[B-0x30], xmm0);
272         movdqu(xword[B+0x90], xmm1);
273         movdqu(xword[B+0x150], xmm4);
274         movdqu(xword[B+0x210], xmm3);
275         movdqu(xmm0, xword[A2-0x80]);
276         movdqu(xmm1, xword[A2+LDA*1-0x80]);
277         movdqu(xmm2, xword[A2+LDA*2-0x80]);
278         movdqu(xmm3, xword[A2+LDA3*1-0x80]);
279         lea(A2, ptr[A2+LDA*4]);
280         movdqa(xmm4, xmm0);
281         punpckldq(xmm0, xmm1);
282         punpckhdq(xmm4, xmm1);
283         movdqa(xmm5, xmm2);
284         punpckldq(xmm2, xmm3);
285         punpckhdq(xmm5, xmm3);
286         movdqa(xmm1, xmm0);
287         punpcklqdq(xmm0, xmm2);
288         punpckhqdq(xmm1, xmm2);
289         movdqa(xmm3, xmm4);
290         punpcklqdq(xmm4, xmm5);
291         punpckhqdq(xmm3, xmm5);
292         movdqu(xword[B-0x20], xmm0);
293         movdqu(xword[B+0xa0], xmm1);
294         movdqu(xword[B+0x160], xmm4);
295         movdqu(xword[B+0x220], xmm3);
296         movdqu(xmm0, xword[A2-0x80]);
297         movdqu(xmm1, xword[A2+LDA*1-0x80]);
298         movdqu(xmm2, xword[A2+LDA*2-0x80]);
299         movdqu(xmm3, xword[A2+LDA3*1-0x80]);
300         lea(A2, ptr[A2+LDA*4]);
301         movdqa(xmm4, xmm0);
302         punpckldq(xmm0, xmm1);
303         punpckhdq(xmm4, xmm1);
304         movdqa(xmm5, xmm2);
305         punpckldq(xmm2, xmm3);
306         punpckhdq(xmm5, xmm3);
307         movdqa(xmm1, xmm0);
308         punpcklqdq(xmm0, xmm2);
309         punpckhqdq(xmm1, xmm2);
310         movdqa(xmm3, xmm4);
311         punpcklqdq(xmm4, xmm5);
312         punpckhqdq(xmm3, xmm5);
313         movdqu(xword[B-0x10], xmm0);
314         movdqu(xword[B+0xb0], xmm1);
315         movdqu(xword[B+0x170], xmm4);
316         movdqu(xword[B+0x230], xmm3);
317         movdqu(xmm0, xword[A2-0x80]);
318         movdqu(xmm1, xword[A2+LDA*1-0x80]);
319         movdqu(xmm2, xword[A2+LDA*2-0x80]);
320         movdqu(xmm3, xword[A2+LDA3*1-0x80]);
321         lea(A2, ptr[A2+LDA*4]);
322         movdqa(xmm4, xmm0);
323         punpckldq(xmm0, xmm1);
324         punpckhdq(xmm4, xmm1);
325         movdqa(xmm5, xmm2);
326         punpckldq(xmm2, xmm3);
327         punpckhdq(xmm5, xmm3);
328         movdqa(xmm1, xmm0);
329         punpcklqdq(xmm0, xmm2);
330         punpckhqdq(xmm1, xmm2);
331         movdqa(xmm3, xmm4);
332         punpcklqdq(xmm4, xmm5);
333         punpckhqdq(xmm3, xmm5);
334         movdqu(xword[B], xmm0);
335         movdqu(xword[B+0xc0], xmm1);
336         movdqu(xword[B+0x180], xmm4);
337         movdqu(xword[B+0x240], xmm3);
338         movdqu(xmm0, xword[A2-0x80]);
339         movdqu(xmm1, xword[A2+LDA*1-0x80]);
340         movdqu(xmm2, xword[A2+LDA*2-0x80]);
341         movdqu(xmm3, xword[A2+LDA3*1-0x80]);
342         lea(A2, ptr[A2+LDA*4]);
343         movdqa(xmm4, xmm0);
344         punpckldq(xmm0, xmm1);
345         punpckhdq(xmm4, xmm1);
346         movdqa(xmm5, xmm2);
347         punpckldq(xmm2, xmm3);
348         punpckhdq(xmm5, xmm3);
349         movdqa(xmm1, xmm0);
350         punpcklqdq(xmm0, xmm2);
351         punpckhqdq(xmm1, xmm2);
352         movdqa(xmm3, xmm4);
353         punpcklqdq(xmm4, xmm5);
354         punpckhqdq(xmm3, xmm5);
355         movdqu(xword[B+0x10], xmm0);
356         movdqu(xword[B+0xd0], xmm1);
357         movdqu(xword[B+0x190], xmm4);
358         movdqu(xword[B+0x250], xmm3);
359         movdqu(xmm0, xword[A2-0x80]);
360         movdqu(xmm1, xword[A2+LDA*1-0x80]);
361         movdqu(xmm2, xword[A2+LDA*2-0x80]);
362         movdqu(xmm3, xword[A2+LDA3*1-0x80]);
363         lea(A2, ptr[A2+LDA*4]);
364         movdqa(xmm4, xmm0);
365         punpckldq(xmm0, xmm1);
366         punpckhdq(xmm4, xmm1);
367         movdqa(xmm5, xmm2);
368         punpckldq(xmm2, xmm3);
369         punpckhdq(xmm5, xmm3);
370         movdqa(xmm1, xmm0);
371         punpcklqdq(xmm0, xmm2);
372         punpckhqdq(xmm1, xmm2);
373         movdqa(xmm3, xmm4);
374         punpcklqdq(xmm4, xmm5);
375         punpckhqdq(xmm3, xmm5);
376         movdqu(xword[B+0x20], xmm0);
377         movdqu(xword[B+0xe0], xmm1);
378         movdqu(xword[B+0x1a0], xmm4);
379         movdqu(xword[B+0x260], xmm3);
380         movdqu(xmm0, xword[A2-0x80]);
381         movdqu(xmm1, xword[A2+LDA*1-0x80]);
382         movdqu(xmm2, xword[A2+LDA*2-0x80]);
383         movdqu(xmm3, xword[A2+LDA3*1-0x80]);
384         lea(A2, ptr[A2+LDA*4]);
385         movdqa(xmm4, xmm0);
386         punpckldq(xmm0, xmm1);
387         punpckhdq(xmm4, xmm1);
388         movdqa(xmm5, xmm2);
389         punpckldq(xmm2, xmm3);
390         punpckhdq(xmm5, xmm3);
391         movdqa(xmm1, xmm0);
392         punpcklqdq(xmm0, xmm2);
393         punpckhqdq(xmm1, xmm2);
394         movdqa(xmm3, xmm4);
395         punpcklqdq(xmm4, xmm5);
396         punpckhqdq(xmm3, xmm5);
397         movdqu(xword[B+0x30], xmm0);
398         movdqu(xword[B+0xf0], xmm1);
399         movdqu(xword[B+0x1b0], xmm4);
400         movdqu(xword[B+0x270], xmm3);
401         sub(A1, -16);
402         sub(B, -768);
403         dec(I);
404         jg(l44, T_NEAR);
405         align(4);
406
407 L(l58c);
408         test(M, 0x8);
409         jle(l8b0, T_NEAR);
410         movq(xmm0, qword[A1-0x80]);
411         movq(xmm1, qword[A1+LDA*1-0x80]);
412         movq(xmm2, qword[A1+LDA*2-0x80]);
413         movq(xmm3, qword[A1+LDA3*1-0x80]);
414         lea(A2, ptr[A1+LDA*4]);
415         punpckldq(xmm0, xmm1);
416         punpckldq(xmm2, xmm3);
417         movdqa(xmm1, xmm0);
418         punpcklqdq(xmm0, xmm2);
419         punpckhqdq(xmm1, xmm2);
420         movdqu(xword[B-0x80], xmm0);
421         movdqu(xword[B+0x40], xmm1);
422         movq(xmm0, qword[A2-0x80]);
423         movq(xmm1, qword[A2+LDA*1-0x80]);
424         movq(xmm2, qword[A2+LDA*2-0x80]);
425         movq(xmm3, qword[A2+LDA3*1-0x80]);
426         lea(A2, ptr[A2+LDA*4]);
427         punpckldq(xmm0, xmm1);
428         punpckldq(xmm2, xmm3);
429         movdqa(xmm1, xmm0);
430         punpcklqdq(xmm0, xmm2);
431         punpckhqdq(xmm1, xmm2);
432         movdqu(xword[B-0x70], xmm0);
433         movdqu(xword[B+0x50], xmm1);
434         movq(xmm0, qword[A2-0x80]);
435         movq(xmm1, qword[A2+LDA*1-0x80]);
436         movq(xmm2, qword[A2+LDA*2-0x80]);
437         movq(xmm3, qword[A2+LDA3*1-0x80]);
438         lea(A2, ptr[A2+LDA*4]);
439         punpckldq(xmm0, xmm1);
440         punpckldq(xmm2, xmm3);
441         movdqa(xmm1, xmm0);
442         punpcklqdq(xmm0, xmm2);
443         punpckhqdq(xmm1, xmm2);
444         movdqu(xword[B-0x60], xmm0);
445         movdqu(xword[B+0x60], xmm1);
446         movq(xmm0, qword[A2-0x80]);
447         movq(xmm1, qword[A2+LDA*1-0x80]);
448         movq(xmm2, qword[A2+LDA*2-0x80]);
449         movq(xmm3, qword[A2+LDA3*1-0x80]);
450         lea(A2, ptr[A2+LDA*4]);
451         punpckldq(xmm0, xmm1);
452         punpckldq(xmm2, xmm3);
453         movdqa(xmm1, xmm0);
454         punpcklqdq(xmm0, xmm2);
455         punpckhqdq(xmm1, xmm2);
456         movdqu(xword[B-0x50], xmm0);
457         movdqu(xword[B+0x70], xmm1);
458         movq(xmm0, qword[A2-0x80]);
459         movq(xmm1, qword[A2+LDA*1-0x80]);
460         movq(xmm2, qword[A2+LDA*2-0x80]);
461         movq(xmm3, qword[A2+LDA3*1-0x80]);
462         lea(A2, ptr[A2+LDA*4]);
463         punpckldq(xmm0, xmm1);
464         punpckldq(xmm2, xmm3);
465         movdqa(xmm1, xmm0);
466         punpcklqdq(xmm0, xmm2);
467         punpckhqdq(xmm1, xmm2);
468         movdqu(xword[B-0x40], xmm0);
469         movdqu(xword[B+0x80], xmm1);
470         movq(xmm0, qword[A2-0x80]);
471         movq(xmm1, qword[A2+LDA*1-0x80]);
472         movq(xmm2, qword[A2+LDA*2-0x80]);
473         movq(xmm3, qword[A2+LDA3*1-0x80]);
474         lea(A2, ptr[A2+LDA*4]);
475         punpckldq(xmm0, xmm1);
476         punpckldq(xmm2, xmm3);
477         movdqa(xmm1, xmm0);
478         punpcklqdq(xmm0, xmm2);
479         punpckhqdq(xmm1, xmm2);
480         movdqu(xword[B-0x30], xmm0);
481         movdqu(xword[B+0x90], xmm1);
482         movq(xmm0, qword[A2-0x80]);
483         movq(xmm1, qword[A2+LDA*1-0x80]);
484         movq(xmm2, qword[A2+LDA*2-0x80]);
485         movq(xmm3, qword[A2+LDA3*1-0x80]);
486         lea(A2, ptr[A2+LDA*4]);
487         punpckldq(xmm0, xmm1);
488         punpckldq(xmm2, xmm3);
489         movdqa(xmm1, xmm0);
490         punpcklqdq(xmm0, xmm2);
491         punpckhqdq(xmm1, xmm2);
492         movdqu(xword[B-0x20], xmm0);
493         movdqu(xword[B+0xa0], xmm1);
494         movq(xmm0, qword[A2-0x80]);
495         movq(xmm1, qword[A2+LDA*1-0x80]);
496         movq(xmm2, qword[A2+LDA*2-0x80]);
497         movq(xmm3, qword[A2+LDA3*1-0x80]);
498         lea(A2, ptr[A2+LDA*4]);
499         punpckldq(xmm0, xmm1);
500         punpckldq(xmm2, xmm3);
501         movdqa(xmm1, xmm0);
502         punpcklqdq(xmm0, xmm2);
503         punpckhqdq(xmm1, xmm2);
504         movdqu(xword[B-0x10], xmm0);
505         movdqu(xword[B+0xb0], xmm1);
506         movq(xmm0, qword[A2-0x80]);
507         movq(xmm1, qword[A2+LDA*1-0x80]);
508         movq(xmm2, qword[A2+LDA*2-0x80]);
509         movq(xmm3, qword[A2+LDA3*1-0x80]);
510         lea(A2, ptr[A2+LDA*4]);
511         punpckldq(xmm0, xmm1);
512         punpckldq(xmm2, xmm3);
513         movdqa(xmm1, xmm0);
514         punpcklqdq(xmm0, xmm2);
515         punpckhqdq(xmm1, xmm2);
516         movdqu(xword[B], xmm0);
517         movdqu(xword[B+0xc0], xmm1);
518         movq(xmm0, qword[A2-0x80]);
519         movq(xmm1, qword[A2+LDA*1-0x80]);
520         movq(xmm2, qword[A2+LDA*2-0x80]);
521         movq(xmm3, qword[A2+LDA3*1-0x80]);
522         lea(A2, ptr[A2+LDA*4]);
523         punpckldq(xmm0, xmm1);
524         punpckldq(xmm2, xmm3);
525         movdqa(xmm1, xmm0);
526         punpcklqdq(xmm0, xmm2);
527         punpckhqdq(xmm1, xmm2);
528         movdqu(xword[B+0x10], xmm0);
529         movdqu(xword[B+0xd0], xmm1);
530         movq(xmm0, qword[A2-0x80]);
531         movq(xmm1, qword[A2+LDA*1-0x80]);
532         movq(xmm2, qword[A2+LDA*2-0x80]);
533         movq(xmm3, qword[A2+LDA3*1-0x80]);
534         lea(A2, ptr[A2+LDA*4]);
535         punpckldq(xmm0, xmm1);
536         punpckldq(xmm2, xmm3);
537         movdqa(xmm1, xmm0);
538         punpcklqdq(xmm0, xmm2);
539         punpckhqdq(xmm1, xmm2);
540         movdqu(xword[B+0x20], xmm0);
541         movdqu(xword[B+0xe0], xmm1);
542         movq(xmm0, qword[A2-0x80]);
543         movq(xmm1, qword[A2+LDA*1-0x80]);
544         movq(xmm2, qword[A2+LDA*2-0x80]);
545         movq(xmm3, qword[A2+LDA3*1-0x80]);
546         lea(A2, ptr[A2+LDA*4]);
547         punpckldq(xmm0, xmm1);
548         punpckldq(xmm2, xmm3);
549         movdqa(xmm1, xmm0);
550         punpcklqdq(xmm0, xmm2);
551         punpckhqdq(xmm1, xmm2);
552         movdqu(xword[B+0x30], xmm0);
553         movdqu(xword[B+0xf0], xmm1);
554         sub(A1, -8);
555         sub(B, -384);
556         align(4);
557
558 L(l8b0);
559         test(M, 0x4);
560         jle(lb14, T_NEAR);
561         movd(xmm0, dword[A1-0x80]);
562         movd(xmm1, dword[A1+LDA*1-0x80]);
563         movd(xmm2, dword[A1+LDA*2-0x80]);
564         movd(xmm3, dword[A1+LDA3*1-0x80]);
565         lea(A2, ptr[A1+LDA*4]);
566         punpckldq(xmm0, xmm1);
567         punpckldq(xmm2, xmm3);
568         punpcklqdq(xmm0, xmm2);
569         movdqu(xword[B-0x80], xmm0);
570         movd(xmm0, dword[A2-0x80]);
571         movd(xmm1, dword[A2+LDA*1-0x80]);
572         movd(xmm2, dword[A2+LDA*2-0x80]);
573         movd(xmm3, dword[A2+LDA3*1-0x80]);
574         lea(A2, ptr[A2+LDA*4]);
575         punpckldq(xmm0, xmm1);
576         punpckldq(xmm2, xmm3);
577         punpcklqdq(xmm0, xmm2);
578         movdqu(xword[B-0x70], xmm0);
579         movd(xmm0, dword[A2-0x80]);
580         movd(xmm1, dword[A2+LDA*1-0x80]);
581         movd(xmm2, dword[A2+LDA*2-0x80]);
582         movd(xmm3, dword[A2+LDA3*1-0x80]);
583         lea(A2, ptr[A2+LDA*4]);
584         punpckldq(xmm0, xmm1);
585         punpckldq(xmm2, xmm3);
586         punpcklqdq(xmm0, xmm2);
587         movdqu(xword[B-0x60], xmm0);
588         movd(xmm0, dword[A2-0x80]);
589         movd(xmm1, dword[A2+LDA*1-0x80]);
590         movd(xmm2, dword[A2+LDA*2-0x80]);
591         movd(xmm3, dword[A2+LDA3*1-0x80]);
592         lea(A2, ptr[A2+LDA*4]);
593         punpckldq(xmm0, xmm1);
594         punpckldq(xmm2, xmm3);
595         punpcklqdq(xmm0, xmm2);
596         movdqu(xword[B-0x50], xmm0);
597         movd(xmm0, dword[A2-0x80]);
598         movd(xmm1, dword[A2+LDA*1-0x80]);
599         movd(xmm2, dword[A2+LDA*2-0x80]);
600         movd(xmm3, dword[A2+LDA3*1-0x80]);
601         lea(A2, ptr[A2+LDA*4]);
602         punpckldq(xmm0, xmm1);
603         punpckldq(xmm2, xmm3);
604         punpcklqdq(xmm0, xmm2);
605         movdqu(xword[B-0x40], xmm0);
606         movd(xmm0, dword[A2-0x80]);
607         movd(xmm1, dword[A2+LDA*1-0x80]);
608         movd(xmm2, dword[A2+LDA*2-0x80]);
609         movd(xmm3, dword[A2+LDA3*1-0x80]);
610         lea(A2, ptr[A2+LDA*4]);
611         punpckldq(xmm0, xmm1);
612         punpckldq(xmm2, xmm3);
613         punpcklqdq(xmm0, xmm2);
614         movdqu(xword[B-0x30], xmm0);
615         movd(xmm0, dword[A2-0x80]);
616         movd(xmm1, dword[A2+LDA*1-0x80]);
617         movd(xmm2, dword[A2+LDA*2-0x80]);
618         movd(xmm3, dword[A2+LDA3*1-0x80]);
619         lea(A2, ptr[A2+LDA*4]);
620         punpckldq(xmm0, xmm1);
621         punpckldq(xmm2, xmm3);
622         punpcklqdq(xmm0, xmm2);
623         movdqu(xword[B-0x20], xmm0);
624         movd(xmm0, dword[A2-0x80]);
625         movd(xmm1, dword[A2+LDA*1-0x80]);
626         movd(xmm2, dword[A2+LDA*2-0x80]);
627         movd(xmm3, dword[A2+LDA3*1-0x80]);
628         lea(A2, ptr[A2+LDA*4]);
629         punpckldq(xmm0, xmm1);
630         punpckldq(xmm2, xmm3);
631         punpcklqdq(xmm0, xmm2);
632         movdqu(xword[B-0x10], xmm0);
633         movd(xmm0, dword[A2-0x80]);
634         movd(xmm1, dword[A2+LDA*1-0x80]);
635         movd(xmm2, dword[A2+LDA*2-0x80]);
636         movd(xmm3, dword[A2+LDA3*1-0x80]);
637         lea(A2, ptr[A2+LDA*4]);
638         punpckldq(xmm0, xmm1);
639         punpckldq(xmm2, xmm3);
640         punpcklqdq(xmm0, xmm2);
641         movdqu(xword[B], xmm0);
642         movd(xmm0, dword[A2-0x80]);
643         movd(xmm1, dword[A2+LDA*1-0x80]);
644         movd(xmm2, dword[A2+LDA*2-0x80]);
645         movd(xmm3, dword[A2+LDA3*1-0x80]);
646         lea(A2, ptr[A2+LDA*4]);
647         punpckldq(xmm0, xmm1);
648         punpckldq(xmm2, xmm3);
649         punpcklqdq(xmm0, xmm2);
650         movdqu(xword[B+0x10], xmm0);
651         movd(xmm0, dword[A2-0x80]);
652         movd(xmm1, dword[A2+LDA*1-0x80]);
653         movd(xmm2, dword[A2+LDA*2-0x80]);
654         movd(xmm3, dword[A2+LDA3*1-0x80]);
655         lea(A2, ptr[A2+LDA*4]);
656         punpckldq(xmm0, xmm1);
657         punpckldq(xmm2, xmm3);
658         punpcklqdq(xmm0, xmm2);
659         movdqu(xword[B+0x20], xmm0);
660         movd(xmm0, dword[A2-0x80]);
661         movd(xmm1, dword[A2+LDA*1-0x80]);
662         movd(xmm2, dword[A2+LDA*2-0x80]);
663         movd(xmm3, dword[A2+LDA3*1-0x80]);
664         lea(A2, ptr[A2+LDA*4]);
665         punpckldq(xmm0, xmm1);
666         punpckldq(xmm2, xmm3);
667         punpcklqdq(xmm0, xmm2);
668         movdqu(xword[B+0x30], xmm0);
669         sub(A1, -4);
670         sub(B, -192);
671         align(4);
672
673 L(lb14);
674         test(M, 0x2);
675         jle(ld84, T_NEAR);
676         mov(ax, word[A1-0x80]);
677         pinsrw(xmm0, eax, 0x0);
678         mov(ax, word[A1+LDA*1-0x80]);
679         pinsrw(xmm0, eax, 0x1);
680         mov(ax, word[A1+LDA*2-0x80]);
681         pinsrw(xmm0, eax, 0x2);
682         mov(ax, word[A1+LDA3*1-0x80]);
683         lea(A2, ptr[A1+LDA*4]);
684         pinsrw(xmm0, eax, 0x3);
685         mov(ax, word[A2-0x80]);
686         pinsrw(xmm0, eax, 0x4);
687         mov(ax, word[A2+LDA*1-0x80]);
688         pinsrw(xmm0, eax, 0x5);
689         mov(ax, word[A2+LDA*2-0x80]);
690         pinsrw(xmm0, eax, 0x6);
691         mov(ax, word[A2+LDA3*1-0x80]);
692         lea(A2, ptr[A2+LDA*4]);
693         pinsrw(xmm0, eax, 0x7);
694         movdqu(xword[B-0x80], xmm0);
695         mov(ax, word[A2-0x80]);
696         pinsrw(xmm0, eax, 0x0);
697         mov(ax, word[A2+LDA*1-0x80]);
698         pinsrw(xmm0, eax, 0x1);
699         mov(ax, word[A2+LDA*2-0x80]);
700         pinsrw(xmm0, eax, 0x2);
701         mov(ax, word[A2+LDA3*1-0x80]);
702         lea(A2, ptr[A2+LDA*4]);
703         pinsrw(xmm0, eax, 0x3);
704         mov(ax, word[A2-0x80]);
705         pinsrw(xmm0, eax, 0x4);
706         mov(ax, word[A2+LDA*1-0x80]);
707         pinsrw(xmm0, eax, 0x5);
708         mov(ax, word[A2+LDA*2-0x80]);
709         pinsrw(xmm0, eax, 0x6);
710         mov(ax, word[A2+LDA3*1-0x80]);
711         pinsrw(xmm0, eax, 0x7);
712         lea(A2, ptr[A2+LDA*4]);
713         movdqu(xword[B-0x70], xmm0);
714         mov(ax, word[A2-0x80]);
715         pinsrw(xmm0, eax, 0x0);
716         mov(ax, word[A2+LDA*1-0x80]);
717         pinsrw(xmm0, eax, 0x1);
718         mov(ax, word[A2+LDA*2-0x80]);
719         pinsrw(xmm0, eax, 0x2);
720         mov(ax, word[A2+LDA3*1-0x80]);
721         lea(A2, ptr[A2+LDA*4]);
722         pinsrw(xmm0, eax, 0x3);
723         mov(ax, word[A2-0x80]);
724         pinsrw(xmm0, eax, 0x4);
725         mov(ax, word[A2+LDA*1-0x80]);
726         pinsrw(xmm0, eax, 0x5);
727         mov(ax, word[A2+LDA*2-0x80]);
728         pinsrw(xmm0, eax, 0x6);
729         mov(ax, word[A2+LDA3*1-0x80]);
730         pinsrw(xmm0, eax, 0x7);
731         lea(A2, ptr[A2+LDA*4]);
732         movdqu(xword[B-0x60], xmm0);
733         mov(ax, word[A2-0x80]);
734         pinsrw(xmm0, eax, 0x0);
735         mov(ax, word[A2+LDA*1-0x80]);
736         pinsrw(xmm0, eax, 0x1);
737         mov(ax, word[A2+LDA*2-0x80]);
738         pinsrw(xmm0, eax, 0x2);
739         mov(ax, word[A2+LDA3*1-0x80]);
740         lea(A2, ptr[A2+LDA*4]);
741         pinsrw(xmm0, eax, 0x3);
742         mov(ax, word[A2-0x80]);
743         pinsrw(xmm0, eax, 0x4);
744         mov(ax, word[A2+LDA*1-0x80]);
745         pinsrw(xmm0, eax, 0x5);
746         mov(ax, word[A2+LDA*2-0x80]);
747         pinsrw(xmm0, eax, 0x6);
748         mov(ax, word[A2+LDA3*1-0x80]);
749         pinsrw(xmm0, eax, 0x7);
750         lea(A2, ptr[A2+LDA*4]);
751         movdqu(xword[B-0x50], xmm0);
752         mov(ax, word[A2-0x80]);
753         pinsrw(xmm0, eax, 0x0);
754         mov(ax, word[A2+LDA*1-0x80]);
755         pinsrw(xmm0, eax, 0x1);
756         mov(ax, word[A2+LDA*2-0x80]);
757         pinsrw(xmm0, eax, 0x2);
758         mov(ax, word[A2+LDA3*1-0x80]);
759         lea(A2, ptr[A2+LDA*4]);
760         pinsrw(xmm0, eax, 0x3);
761         mov(ax, word[A2-0x80]);
762         pinsrw(xmm0, eax, 0x4);
763         mov(ax, word[A2+LDA*1-0x80]);
764         pinsrw(xmm0, eax, 0x5);
765         mov(ax, word[A2+LDA*2-0x80]);
766         pinsrw(xmm0, eax, 0x6);
767         mov(ax, word[A2+LDA3*1-0x80]);
768         pinsrw(xmm0, eax, 0x7);
769         lea(A2, ptr[A2+LDA*4]);
770         movdqu(xword[B-0x40], xmm0);
771         mov(ax, word[A2-0x80]);
772         pinsrw(xmm0, eax, 0x0);
773         mov(ax, word[A2+LDA*1-0x80]);
774         pinsrw(xmm0, eax, 0x1);
775         mov(ax, word[A2+LDA*2-0x80]);
776         pinsrw(xmm0, eax, 0x2);
777         mov(ax, word[A2+LDA3*1-0x80]);
778         lea(A2, ptr[A2+LDA*4]);
779         pinsrw(xmm0, eax, 0x3);
780         mov(ax, word[A2-0x80]);
781         pinsrw(xmm0, eax, 0x4);
782         mov(ax, word[A2+LDA*1-0x80]);
783         pinsrw(xmm0, eax, 0x5);
784         mov(ax, word[A2+LDA*2-0x80]);
785         pinsrw(xmm0, eax, 0x6);
786         mov(ax, word[A2+LDA3*1-0x80]);
787         pinsrw(xmm0, eax, 0x7);
788         lea(A2, ptr[A2+LDA*4]);
789         movdqu(xword[B-0x30], xmm0);
790         sub(A1, -2);
791         sub(B, -96);
792         align(4);
793
794 L(ld84);
795         test(M, 0x1);
796         jle(lfdc, T_NEAR);
797         mov(al, byte[A1-0x80]);
798         pinsrb(xmm0, eax, 0x0);
799         mov(al, byte[A1+LDA*1-0x80]);
800         pinsrb(xmm0, eax, 0x1);
801         mov(al, byte[A1+LDA*2-0x80]);
802         pinsrb(xmm0, eax, 0x2);
803         mov(al, byte[A1+LDA3*1-0x80]);
804         lea(A2, ptr[A1+LDA*4]);
805         pinsrb(xmm0, eax, 0x3);
806         mov(al, byte[A2-0x80]);
807         pinsrb(xmm0, eax, 0x4);
808         mov(al, byte[A2+LDA*1-0x80]);
809         pinsrb(xmm0, eax, 0x5);
810         mov(al, byte[A2+LDA*2-0x80]);
811         pinsrb(xmm0, eax, 0x6);
812         mov(al, byte[A2+LDA3*1-0x80]);
813         lea(A2, ptr[A2+LDA*4]);
814         pinsrb(xmm0, eax, 0x7);
815         mov(al, byte[A2-0x80]);
816         pinsrb(xmm0, eax, 0x8);
817         mov(al, byte[A2+LDA*1-0x80]);
818         pinsrb(xmm0, eax, 0x9);
819         mov(al, byte[A2+LDA*2-0x80]);
820         pinsrb(xmm0, eax, 0xa);
821         mov(al, byte[A2+LDA3*1-0x80]);
822         lea(A2, ptr[A2+LDA*4]);
823         pinsrb(xmm0, eax, 0xb);
824         mov(al, byte[A2-0x80]);
825         pinsrb(xmm0, eax, 0xc);
826         mov(al, byte[A2+LDA*1-0x80]);
827         pinsrb(xmm0, eax, 0xd);
828         mov(al, byte[A2+LDA*2-0x80]);
829         pinsrb(xmm0, eax, 0xe);
830         mov(al, byte[A2+LDA3*1-0x80]);
831         lea(A2, ptr[A2+LDA*4]);
832         pinsrb(xmm0, eax, 0xf);
833         movdqu(xword[B-0x80], xmm0);
834         mov(al, byte[A2-0x80]);
835         pinsrb(xmm0, eax, 0x0);
836         mov(al, byte[A2+LDA*1-0x80]);
837         pinsrb(xmm0, eax, 0x1);
838         mov(al, byte[A2+LDA*2-0x80]);
839         pinsrb(xmm0, eax, 0x2);
840         mov(al, byte[A2+LDA3*1-0x80]);
841         lea(A2, ptr[A2+LDA*4]);
842         pinsrb(xmm0, eax, 0x3);
843         mov(al, byte[A2-0x80]);
844         pinsrb(xmm0, eax, 0x4);
845         mov(al, byte[A2+LDA*1-0x80]);
846         pinsrb(xmm0, eax, 0x5);
847         mov(al, byte[A2+LDA*2-0x80]);
848         pinsrb(xmm0, eax, 0x6);
849         mov(al, byte[A2+LDA3*1-0x80]);
850         lea(A2, ptr[A2+LDA*4]);
851         pinsrb(xmm0, eax, 0x7);
852         mov(al, byte[A2-0x80]);
853         pinsrb(xmm0, eax, 0x8);
854         mov(al, byte[A2+LDA*1-0x80]);
855         pinsrb(xmm0, eax, 0x9);
856         mov(al, byte[A2+LDA*2-0x80]);
857         pinsrb(xmm0, eax, 0xa);
858         mov(al, byte[A2+LDA3*1-0x80]);
859         lea(A2, ptr[A2+LDA*4]);
860         pinsrb(xmm0, eax, 0xb);
861         mov(al, byte[A2-0x80]);
862         pinsrb(xmm0, eax, 0xc);
863         mov(al, byte[A2+LDA*1-0x80]);
864         pinsrb(xmm0, eax, 0xd);
865         mov(al, byte[A2+LDA*2-0x80]);
866         pinsrb(xmm0, eax, 0xe);
867         mov(al, byte[A2+LDA3*1-0x80]);
868         lea(A2, ptr[A2+LDA*4]);
869         pinsrb(xmm0, eax, 0xf);
870         movdqu(xword[B-0x70], xmm0);
871         mov(al, byte[A2-0x80]);
872         pinsrb(xmm0, eax, 0x0);
873         mov(al, byte[A2+LDA*1-0x80]);
874         pinsrb(xmm0, eax, 0x1);
875         mov(al, byte[A2+LDA*2-0x80]);
876         pinsrb(xmm0, eax, 0x2);
877         mov(al, byte[A2+LDA3*1-0x80]);
878         lea(A2, ptr[A2+LDA*4]);
879         pinsrb(xmm0, eax, 0x3);
880         mov(al, byte[A2-0x80]);
881         pinsrb(xmm0, eax, 0x4);
882         mov(al, byte[A2+LDA*1-0x80]);
883         pinsrb(xmm0, eax, 0x5);
884         mov(al, byte[A2+LDA*2-0x80]);
885         pinsrb(xmm0, eax, 0x6);
886         mov(al, byte[A2+LDA3*1-0x80]);
887         lea(A2, ptr[A2+LDA*4]);
888         pinsrb(xmm0, eax, 0x7);
889         mov(al, byte[A2-0x80]);
890         pinsrb(xmm0, eax, 0x8);
891         mov(al, byte[A2+LDA*1-0x80]);
892         pinsrb(xmm0, eax, 0x9);
893         mov(al, byte[A2+LDA*2-0x80]);
894         pinsrb(xmm0, eax, 0xa);
895         mov(al, byte[A2+LDA3*1-0x80]);
896         lea(A2, ptr[A2+LDA*4]);
897         pinsrb(xmm0, eax, 0xb);
898         mov(al, byte[A2-0x80]);
899         pinsrb(xmm0, eax, 0xc);
900         mov(al, byte[A2+LDA*1-0x80]);
901         pinsrb(xmm0, eax, 0xd);
902         mov(al, byte[A2+LDA*2-0x80]);
903         pinsrb(xmm0, eax, 0xe);
904         mov(al, byte[A2+LDA3*1-0x80]);
905         lea(A2, ptr[A2+LDA*4]);
906         pinsrb(xmm0, eax, 0xf);
907         movdqu(xword[B-0x60], xmm0);
908         sub(B, -48);
909         align(4);
910
911 L(lfdc);
912         sub(N, 0x30);
913         cmp(N, 0x30);
914         jge(l20, T_NEAR);
915         align(4);
916
917 L(lfec);
918         cmp(N, 0x20);
919         jl(l1a8c, T_NEAR);
920         align(4);
921
922 L(lff8);
923         mov(A1, A);
924         mov(I, LDA);
925         shl(I, 0x5);
926         add(A, I);
927         mov(I, M);
928         sar(I, 0x4);
929         jle(l1390, T_NEAR);
930         align(4);
931
932 L(l1014);
933         movdqu(xmm0, xword[A1-0x80]);
934         movdqu(xmm1, xword[A1+LDA*1-0x80]);
935         movdqu(xmm2, xword[A1+LDA*2-0x80]);
936         movdqu(xmm3, xword[A1+LDA3*1-0x80]);
937         lea(A2, ptr[A1+LDA*4]);
938         movdqa(xmm4, xmm0);
939         punpckldq(xmm0, xmm1);
940         punpckhdq(xmm4, xmm1);
941         movdqa(xmm5, xmm2);
942         punpckldq(xmm2, xmm3);
943         punpckhdq(xmm5, xmm3);
944         movdqa(xmm1, xmm0);
945         punpcklqdq(xmm0, xmm2);
946         punpckhqdq(xmm1, xmm2);
947         movdqa(xmm3, xmm4);
948         punpcklqdq(xmm4, xmm5);
949         punpckhqdq(xmm3, xmm5);
950         movdqu(xword[B-0x80], xmm0);
951         movdqu(xword[B], xmm1);
952         movdqu(xword[B+0x80], xmm4);
953         movdqu(xword[B+0x100], xmm3);
954         movdqu(xmm0, xword[A2-0x80]);
955         movdqu(xmm1, xword[A2+LDA*1-0x80]);
956         movdqu(xmm2, xword[A2+LDA*2-0x80]);
957         movdqu(xmm3, xword[A2+LDA3*1-0x80]);
958         lea(A2, ptr[A2+LDA*4]);
959         movdqa(xmm4, xmm0);
960         punpckldq(xmm0, xmm1);
961         punpckhdq(xmm4, xmm1);
962         movdqa(xmm5, xmm2);
963         punpckldq(xmm2, xmm3);
964         punpckhdq(xmm5, xmm3);
965         movdqa(xmm1, xmm0);
966         punpcklqdq(xmm0, xmm2);
967         punpckhqdq(xmm1, xmm2);
968         movdqa(xmm3, xmm4);
969         punpcklqdq(xmm4, xmm5);
970         punpckhqdq(xmm3, xmm5);
971         movdqu(xword[B-0x70], xmm0);
972         movdqu(xword[B+0x10], xmm1);
973         movdqu(xword[B+0x90], xmm4);
974         movdqu(xword[B+0x110], xmm3);
975         movdqu(xmm0, xword[A2-0x80]);
976         movdqu(xmm1, xword[A2+LDA*1-0x80]);
977         movdqu(xmm2, xword[A2+LDA*2-0x80]);
978         movdqu(xmm3, xword[A2+LDA3*1-0x80]);
979         lea(A2, ptr[A2+LDA*4]);
980         movdqa(xmm4, xmm0);
981         punpckldq(xmm0, xmm1);
982         punpckhdq(xmm4, xmm1);
983         movdqa(xmm5, xmm2);
984         punpckldq(xmm2, xmm3);
985         punpckhdq(xmm5, xmm3);
986         movdqa(xmm1, xmm0);
987         punpcklqdq(xmm0, xmm2);
988         punpckhqdq(xmm1, xmm2);
989         movdqa(xmm3, xmm4);
990         punpcklqdq(xmm4, xmm5);
991         punpckhqdq(xmm3, xmm5);
992         movdqu(xword[B-0x60], xmm0);
993         movdqu(xword[B+0x20], xmm1);
994         movdqu(xword[B+0xa0], xmm4);
995         movdqu(xword[B+0x120], xmm3);
996         movdqu(xmm0, xword[A2-0x80]);
997         movdqu(xmm1, xword[A2+LDA*1-0x80]);
998         movdqu(xmm2, xword[A2+LDA*2-0x80]);
999         movdqu(xmm3, xword[A2+LDA3*1-0x80]);
1000         lea(A2, ptr[A2+LDA*4]);
1001         movdqa(xmm4, xmm0);
1002         punpckldq(xmm0, xmm1);
1003         punpckhdq(xmm4, xmm1);
1004         movdqa(xmm5, xmm2);
1005         punpckldq(xmm2, xmm3);
1006         punpckhdq(xmm5, xmm3);
1007         movdqa(xmm1, xmm0);
1008         punpcklqdq(xmm0, xmm2);
1009         punpckhqdq(xmm1, xmm2);
1010         movdqa(xmm3, xmm4);
1011         punpcklqdq(xmm4, xmm5);
1012         punpckhqdq(xmm3, xmm5);
1013         movdqu(xword[B-0x50], xmm0);
1014         movdqu(xword[B+0x30], xmm1);
1015         movdqu(xword[B+0xb0], xmm4);
1016         movdqu(xword[B+0x130], xmm3);
1017         movdqu(xmm0, xword[A2-0x80]);
1018         movdqu(xmm1, xword[A2+LDA*1-0x80]);
1019         movdqu(xmm2, xword[A2+LDA*2-0x80]);
1020         movdqu(xmm3, xword[A2+LDA3*1-0x80]);
1021         lea(A2, ptr[A2+LDA*4]);
1022         movdqa(xmm4, xmm0);
1023         punpckldq(xmm0, xmm1);
1024         punpckhdq(xmm4, xmm1);
1025         movdqa(xmm5, xmm2);
1026         punpckldq(xmm2, xmm3);
1027         punpckhdq(xmm5, xmm3);
1028         movdqa(xmm1, xmm0);
1029         punpcklqdq(xmm0, xmm2);
1030         punpckhqdq(xmm1, xmm2);
1031         movdqa(xmm3, xmm4);
1032         punpcklqdq(xmm4, xmm5);
1033         punpckhqdq(xmm3, xmm5);
1034         movdqu(xword[B-0x40], xmm0);
1035         movdqu(xword[B+0x40], xmm1);
1036         movdqu(xword[B+0xc0], xmm4);
1037         movdqu(xword[B+0x140], xmm3);
1038         movdqu(xmm0, xword[A2-0x80]);
1039         movdqu(xmm1, xword[A2+LDA*1-0x80]);
1040         movdqu(xmm2, xword[A2+LDA*2-0x80]);
1041         movdqu(xmm3, xword[A2+LDA3*1-0x80]);
1042         lea(A2, ptr[A2+LDA*4]);
1043         movdqa(xmm4, xmm0);
1044         punpckldq(xmm0, xmm1);
1045         punpckhdq(xmm4, xmm1);
1046         movdqa(xmm5, xmm2);
1047         punpckldq(xmm2, xmm3);
1048         punpckhdq(xmm5, xmm3);
1049         movdqa(xmm1, xmm0);
1050         punpcklqdq(xmm0, xmm2);
1051         punpckhqdq(xmm1, xmm2);
1052         movdqa(xmm3, xmm4);
1053         punpcklqdq(xmm4, xmm5);
1054         punpckhqdq(xmm3, xmm5);
1055         movdqu(xword[B-0x30], xmm0);
1056         movdqu(xword[B+0x50], xmm1);
1057         movdqu(xword[B+0xd0], xmm4);
1058         movdqu(xword[B+0x150], xmm3);
1059         movdqu(xmm0, xword[A2-0x80]);
1060         movdqu(xmm1, xword[A2+LDA*1-0x80]);
1061         movdqu(xmm2, xword[A2+LDA*2-0x80]);
1062         movdqu(xmm3, xword[A2+LDA3*1-0x80]);
1063         lea(A2, ptr[A2+LDA*4]);
1064         movdqa(xmm4, xmm0);
1065         punpckldq(xmm0, xmm1);
1066         punpckhdq(xmm4, xmm1);
1067         movdqa(xmm5, xmm2);
1068         punpckldq(xmm2, xmm3);
1069         punpckhdq(xmm5, xmm3);
1070         movdqa(xmm1, xmm0);
1071         punpcklqdq(xmm0, xmm2);
1072         punpckhqdq(xmm1, xmm2);
1073         movdqa(xmm3, xmm4);
1074         punpcklqdq(xmm4, xmm5);
1075         punpckhqdq(xmm3, xmm5);
1076         movdqu(xword[B-0x20], xmm0);
1077         movdqu(xword[B+0x60], xmm1);
1078         movdqu(xword[B+0xe0], xmm4);
1079         movdqu(xword[B+0x160], xmm3);
1080         movdqu(xmm0, xword[A2-0x80]);
1081         movdqu(xmm1, xword[A2+LDA*1-0x80]);
1082         movdqu(xmm2, xword[A2+LDA*2-0x80]);
1083         movdqu(xmm3, xword[A2+LDA3*1-0x80]);
1084         lea(A2, ptr[A2+LDA*4]);
1085         movdqa(xmm4, xmm0);
1086         punpckldq(xmm0, xmm1);
1087         punpckhdq(xmm4, xmm1);
1088         movdqa(xmm5, xmm2);
1089         punpckldq(xmm2, xmm3);
1090         punpckhdq(xmm5, xmm3);
1091         movdqa(xmm1, xmm0);
1092         punpcklqdq(xmm0, xmm2);
1093         punpckhqdq(xmm1, xmm2);
1094         movdqa(xmm3, xmm4);
1095         punpcklqdq(xmm4, xmm5);
1096         punpckhqdq(xmm3, xmm5);
1097         movdqu(xword[B-0x10], xmm0);
1098         movdqu(xword[B+0x70], xmm1);
1099         movdqu(xword[B+0xf0], xmm4);
1100         movdqu(xword[B+0x170], xmm3);
1101         sub(A1, -16);
1102         sub(B, -512);
1103         dec(I);
1104         jg(l1014, T_NEAR);
1105         align(4);
1106
1107 L(l1390);
1108         test(M, 0x8);
1109         jle(l159c, T_NEAR);
1110         movq(xmm0, qword[A1-0x80]);
1111         movq(xmm1, qword[A1+LDA*1-0x80]);
1112         movq(xmm2, qword[A1+LDA*2-0x80]);
1113         movq(xmm3, qword[A1+LDA3*1-0x80]);
1114         lea(A2, ptr[A1+LDA*4]);
1115         punpckldq(xmm0, xmm1);
1116         punpckldq(xmm2, xmm3);
1117         movdqa(xmm1, xmm0);
1118         punpcklqdq(xmm0, xmm2);
1119         punpckhqdq(xmm1, xmm2);
1120         movdqu(xword[B-0x80], xmm0);
1121         movdqu(xword[B], xmm1);
1122         movq(xmm0, qword[A2-0x80]);
1123         movq(xmm1, qword[A2+LDA*1-0x80]);
1124         movq(xmm2, qword[A2+LDA*2-0x80]);
1125         movq(xmm3, qword[A2+LDA3*1-0x80]);
1126         lea(A2, ptr[A2+LDA*4]);
1127         punpckldq(xmm0, xmm1);
1128         punpckldq(xmm2, xmm3);
1129         movdqa(xmm1, xmm0);
1130         punpcklqdq(xmm0, xmm2);
1131         punpckhqdq(xmm1, xmm2);
1132         movdqu(xword[B-0x70], xmm0);
1133         movdqu(xword[B+0x10], xmm1);
1134         movq(xmm0, qword[A2-0x80]);
1135         movq(xmm1, qword[A2+LDA*1-0x80]);
1136         movq(xmm2, qword[A2+LDA*2-0x80]);
1137         movq(xmm3, qword[A2+LDA3*1-0x80]);
1138         lea(A2, ptr[A2+LDA*4]);
1139         punpckldq(xmm0, xmm1);
1140         punpckldq(xmm2, xmm3);
1141         movdqa(xmm1, xmm0);
1142         punpcklqdq(xmm0, xmm2);
1143         punpckhqdq(xmm1, xmm2);
1144         movdqu(xword[B-0x60], xmm0);
1145         movdqu(xword[B+0x20], xmm1);
1146         movq(xmm0, qword[A2-0x80]);
1147         movq(xmm1, qword[A2+LDA*1-0x80]);
1148         movq(xmm2, qword[A2+LDA*2-0x80]);
1149         movq(xmm3, qword[A2+LDA3*1-0x80]);
1150         lea(A2, ptr[A2+LDA*4]);
1151         punpckldq(xmm0, xmm1);
1152         punpckldq(xmm2, xmm3);
1153         movdqa(xmm1, xmm0);
1154         punpcklqdq(xmm0, xmm2);
1155         punpckhqdq(xmm1, xmm2);
1156         movdqu(xword[B-0x50], xmm0);
1157         movdqu(xword[B+0x30], xmm1);
1158         movq(xmm0, qword[A2-0x80]);
1159         movq(xmm1, qword[A2+LDA*1-0x80]);
1160         movq(xmm2, qword[A2+LDA*2-0x80]);
1161         movq(xmm3, qword[A2+LDA3*1-0x80]);
1162         lea(A2, ptr[A2+LDA*4]);
1163         punpckldq(xmm0, xmm1);
1164         punpckldq(xmm2, xmm3);
1165         movdqa(xmm1, xmm0);
1166         punpcklqdq(xmm0, xmm2);
1167         punpckhqdq(xmm1, xmm2);
1168         movdqu(xword[B-0x40], xmm0);
1169         movdqu(xword[B+0x40], xmm1);
1170         movq(xmm0, qword[A2-0x80]);
1171         movq(xmm1, qword[A2+LDA*1-0x80]);
1172         movq(xmm2, qword[A2+LDA*2-0x80]);
1173         movq(xmm3, qword[A2+LDA3*1-0x80]);
1174         lea(A2, ptr[A2+LDA*4]);
1175         punpckldq(xmm0, xmm1);
1176         punpckldq(xmm2, xmm3);
1177         movdqa(xmm1, xmm0);
1178         punpcklqdq(xmm0, xmm2);
1179         punpckhqdq(xmm1, xmm2);
1180         movdqu(xword[B-0x30], xmm0);
1181         movdqu(xword[B+0x50], xmm1);
1182         movq(xmm0, qword[A2-0x80]);
1183         movq(xmm1, qword[A2+LDA*1-0x80]);
1184         movq(xmm2, qword[A2+LDA*2-0x80]);
1185         movq(xmm3, qword[A2+LDA3*1-0x80]);
1186         lea(A2, ptr[A2+LDA*4]);
1187         punpckldq(xmm0, xmm1);
1188         punpckldq(xmm2, xmm3);
1189         movdqa(xmm1, xmm0);
1190         punpcklqdq(xmm0, xmm2);
1191         punpckhqdq(xmm1, xmm2);
1192         movdqu(xword[B-0x20], xmm0);
1193         movdqu(xword[B+0x60], xmm1);
1194         movq(xmm0, qword[A2-0x80]);
1195         movq(xmm1, qword[A2+LDA*1-0x80]);
1196         movq(xmm2, qword[A2+LDA*2-0x80]);
1197         movq(xmm3, qword[A2+LDA3*1-0x80]);
1198         punpckldq(xmm0, xmm1);
1199         punpckldq(xmm2, xmm3);
1200         movdqa(xmm1, xmm0);
1201         punpcklqdq(xmm0, xmm2);
1202         punpckhqdq(xmm1, xmm2);
1203         movdqu(xword[B-0x10], xmm0);
1204         movdqu(xword[B+0x70], xmm1);
1205         sub(A1, -8);
1206         sub(B, -256);
1207         align(4);
1208
1209 L(l159c);
1210         test(M, 0x4);
1211         jle(l173c, T_NEAR);
1212         movd(xmm0, dword[A1-0x80]);
1213         movd(xmm1, dword[A1+LDA*1-0x80]);
1214         movd(xmm2, dword[A1+LDA*2-0x80]);
1215         movd(xmm3, dword[A1+LDA3*1-0x80]);
1216         lea(A2, ptr[A1+LDA*4]);
1217         punpckldq(xmm0, xmm1);
1218         punpckldq(xmm2, xmm3);
1219         punpcklqdq(xmm0, xmm2);
1220         movdqu(xword[B-0x80], xmm0);
1221         movd(xmm0, dword[A2-0x80]);
1222         movd(xmm1, dword[A2+LDA*1-0x80]);
1223         movd(xmm2, dword[A2+LDA*2-0x80]);
1224         movd(xmm3, dword[A2+LDA3*1-0x80]);
1225         lea(A2, ptr[A2+LDA*4]);
1226         punpckldq(xmm0, xmm1);
1227         punpckldq(xmm2, xmm3);
1228         punpcklqdq(xmm0, xmm2);
1229         movdqu(xword[B-0x70], xmm0);
1230         movd(xmm0, dword[A2-0x80]);
1231         movd(xmm1, dword[A2+LDA*1-0x80]);
1232         movd(xmm2, dword[A2+LDA*2-0x80]);
1233         movd(xmm3, dword[A2+LDA3*1-0x80]);
1234         lea(A2, ptr[A2+LDA*4]);
1235         punpckldq(xmm0, xmm1);
1236         punpckldq(xmm2, xmm3);
1237         punpcklqdq(xmm0, xmm2);
1238         movdqu(xword[B-0x60], xmm0);
1239         movd(xmm0, dword[A2-0x80]);
1240         movd(xmm1, dword[A2+LDA*1-0x80]);
1241         movd(xmm2, dword[A2+LDA*2-0x80]);
1242         movd(xmm3, dword[A2+LDA3*1-0x80]);
1243         lea(A2, ptr[A2+LDA*4]);
1244         punpckldq(xmm0, xmm1);
1245         punpckldq(xmm2, xmm3);
1246         punpcklqdq(xmm0, xmm2);
1247         movdqu(xword[B-0x50], xmm0);
1248         movd(xmm0, dword[A2-0x80]);
1249         movd(xmm1, dword[A2+LDA*1-0x80]);
1250         movd(xmm2, dword[A2+LDA*2-0x80]);
1251         movd(xmm3, dword[A2+LDA3*1-0x80]);
1252         lea(A2, ptr[A2+LDA*4]);
1253         punpckldq(xmm0, xmm1);
1254         punpckldq(xmm2, xmm3);
1255         punpcklqdq(xmm0, xmm2);
1256         movdqu(xword[B-0x40], xmm0);
1257         movd(xmm0, dword[A2-0x80]);
1258         movd(xmm1, dword[A2+LDA*1-0x80]);
1259         movd(xmm2, dword[A2+LDA*2-0x80]);
1260         movd(xmm3, dword[A2+LDA3*1-0x80]);
1261         lea(A2, ptr[A2+LDA*4]);
1262         punpckldq(xmm0, xmm1);
1263         punpckldq(xmm2, xmm3);
1264         punpcklqdq(xmm0, xmm2);
1265         movdqu(xword[B-0x30], xmm0);
1266         movd(xmm0, dword[A2-0x80]);
1267         movd(xmm1, dword[A2+LDA*1-0x80]);
1268         movd(xmm2, dword[A2+LDA*2-0x80]);
1269         movd(xmm3, dword[A2+LDA3*1-0x80]);
1270         lea(A2, ptr[A2+LDA*4]);
1271         punpckldq(xmm0, xmm1);
1272         punpckldq(xmm2, xmm3);
1273         punpcklqdq(xmm0, xmm2);
1274         movdqu(xword[B-0x20], xmm0);
1275         movd(xmm0, dword[A2-0x80]);
1276         movd(xmm1, dword[A2+LDA*1-0x80]);
1277         movd(xmm2, dword[A2+LDA*2-0x80]);
1278         movd(xmm3, dword[A2+LDA3*1-0x80]);
1279         lea(A2, ptr[A2+LDA*4]);
1280         punpckldq(xmm0, xmm1);
1281         punpckldq(xmm2, xmm3);
1282         punpcklqdq(xmm0, xmm2);
1283         movdqu(xword[B-0x10], xmm0);
1284         sub(A1, -4);
1285         sub(B, -128);
1286         align(4);
1287
1288 L(l173c);
1289         test(M, 0x2);
1290         jle(l18e4, T_NEAR);
1291         mov(ax, word[A1-0x80]);
1292         pinsrw(xmm0, eax, 0x0);
1293         mov(ax, word[A1+LDA*1-0x80]);
1294         pinsrw(xmm0, eax, 0x1);
1295         mov(ax, word[A1+LDA*2-0x80]);
1296         pinsrw(xmm0, eax, 0x2);
1297         mov(ax, word[A1+LDA3*1-0x80]);
1298         lea(A2, ptr[A1+LDA*4]);
1299         pinsrw(xmm0, eax, 0x3);
1300         mov(ax, word[A2-0x80]);
1301         pinsrw(xmm0, eax, 0x4);
1302         mov(ax, word[A2+LDA*1-0x80]);
1303         pinsrw(xmm0, eax, 0x5);
1304         mov(ax, word[A2+LDA*2-0x80]);
1305         pinsrw(xmm0, eax, 0x6);
1306         mov(ax, word[A2+LDA3*1-0x80]);
1307         lea(A2, ptr[A2+LDA*4]);
1308         pinsrw(xmm0, eax, 0x7);
1309         movdqu(xword[B-0x80], xmm0);
1310         mov(ax, word[A2-0x80]);
1311         pinsrw(xmm0, eax, 0x0);
1312         mov(ax, word[A2+LDA*1-0x80]);
1313         pinsrw(xmm0, eax, 0x1);
1314         mov(ax, word[A2+LDA*2-0x80]);
1315         pinsrw(xmm0, eax, 0x2);
1316         mov(ax, word[A2+LDA3*1-0x80]);
1317         lea(A2, ptr[A2+LDA*4]);
1318         pinsrw(xmm0, eax, 0x3);
1319         mov(ax, word[A2-0x80]);
1320         pinsrw(xmm0, eax, 0x4);
1321         mov(ax, word[A2+LDA*1-0x80]);
1322         pinsrw(xmm0, eax, 0x5);
1323         mov(ax, word[A2+LDA*2-0x80]);
1324         pinsrw(xmm0, eax, 0x6);
1325         mov(ax, word[A2+LDA3*1-0x80]);
1326         pinsrw(xmm0, eax, 0x7);
1327         lea(A2, ptr[A2+LDA*4]);
1328         movdqu(xword[B-0x70], xmm0);
1329         mov(ax, word[A2-0x80]);
1330         pinsrw(xmm0, eax, 0x0);
1331         mov(ax, word[A2+LDA*1-0x80]);
1332         pinsrw(xmm0, eax, 0x1);
1333         mov(ax, word[A2+LDA*2-0x80]);
1334         pinsrw(xmm0, eax, 0x2);
1335         mov(ax, word[A2+LDA3*1-0x80]);
1336         lea(A2, ptr[A2+LDA*4]);
1337         pinsrw(xmm0, eax, 0x3);
1338         mov(ax, word[A2-0x80]);
1339         pinsrw(xmm0, eax, 0x4);
1340         mov(ax, word[A2+LDA*1-0x80]);
1341         pinsrw(xmm0, eax, 0x5);
1342         mov(ax, word[A2+LDA*2-0x80]);
1343         pinsrw(xmm0, eax, 0x6);
1344         mov(ax, word[A2+LDA3*1-0x80]);
1345         pinsrw(xmm0, eax, 0x7);
1346         lea(A2, ptr[A2+LDA*4]);
1347         movdqu(xword[B-0x60], xmm0);
1348         mov(ax, word[A2-0x80]);
1349         pinsrw(xmm0, eax, 0x0);
1350         mov(ax, word[A2+LDA*1-0x80]);
1351         pinsrw(xmm0, eax, 0x1);
1352         mov(ax, word[A2+LDA*2-0x80]);
1353         pinsrw(xmm0, eax, 0x2);
1354         mov(ax, word[A2+LDA3*1-0x80]);
1355         lea(A2, ptr[A2+LDA*4]);
1356         pinsrw(xmm0, eax, 0x3);
1357         mov(ax, word[A2-0x80]);
1358         pinsrw(xmm0, eax, 0x4);
1359         mov(ax, word[A2+LDA*1-0x80]);
1360         pinsrw(xmm0, eax, 0x5);
1361         mov(ax, word[A2+LDA*2-0x80]);
1362         pinsrw(xmm0, eax, 0x6);
1363         mov(ax, word[A2+LDA3*1-0x80]);
1364         pinsrw(xmm0, eax, 0x7);
1365         lea(A2, ptr[A2+LDA*4]);
1366         movdqu(xword[B-0x50], xmm0);
1367         sub(A1, -2);
1368         sub(B, -64);
1369         align(4);
1370
1371 L(l18e4);
1372         test(M, 0x1);
1373         jle(l1a7c, T_NEAR);
1374         mov(al, byte[A1-0x80]);
1375         pinsrb(xmm0, eax, 0x0);
1376         mov(al, byte[A1+LDA*1-0x80]);
1377         pinsrb(xmm0, eax, 0x1);
1378         mov(al, byte[A1+LDA*2-0x80]);
1379         pinsrb(xmm0, eax, 0x2);
1380         mov(al, byte[A1+LDA3*1-0x80]);
1381         lea(A2, ptr[A1+LDA*4]);
1382         pinsrb(xmm0, eax, 0x3);
1383         mov(al, byte[A2-0x80]);
1384         pinsrb(xmm0, eax, 0x4);
1385         mov(al, byte[A2+LDA*1-0x80]);
1386         pinsrb(xmm0, eax, 0x5);
1387         mov(al, byte[A2+LDA*2-0x80]);
1388         pinsrb(xmm0, eax, 0x6);
1389         mov(al, byte[A2+LDA3*1-0x80]);
1390         lea(A2, ptr[A2+LDA*4]);
1391         pinsrb(xmm0, eax, 0x7);
1392         mov(al, byte[A2-0x80]);
1393         pinsrb(xmm0, eax, 0x8);
1394         mov(al, byte[A2+LDA*1-0x80]);
1395         pinsrb(xmm0, eax, 0x9);
1396         mov(al, byte[A2+LDA*2-0x80]);
1397         pinsrb(xmm0, eax, 0xa);
1398         mov(al, byte[A2+LDA3*1-0x80]);
1399         lea(A2, ptr[A2+LDA*4]);
1400         pinsrb(xmm0, eax, 0xb);
1401         mov(al, byte[A2-0x80]);
1402         pinsrb(xmm0, eax, 0xc);
1403         mov(al, byte[A2+LDA*1-0x80]);
1404         pinsrb(xmm0, eax, 0xd);
1405         mov(al, byte[A2+LDA*2-0x80]);
1406         pinsrb(xmm0, eax, 0xe);
1407         mov(al, byte[A2+LDA3*1-0x80]);
1408         lea(A2, ptr[A2+LDA*4]);
1409         pinsrb(xmm0, eax, 0xf);
1410         movdqu(xword[B-0x80], xmm0);
1411         mov(al, byte[A2-0x80]);
1412         pinsrb(xmm0, eax, 0x0);
1413         mov(al, byte[A2+LDA*1-0x80]);
1414         pinsrb(xmm0, eax, 0x1);
1415         mov(al, byte[A2+LDA*2-0x80]);
1416         pinsrb(xmm0, eax, 0x2);
1417         mov(al, byte[A2+LDA3*1-0x80]);
1418         lea(A2, ptr[A2+LDA*4]);
1419         pinsrb(xmm0, eax, 0x3);
1420         mov(al, byte[A2-0x80]);
1421         pinsrb(xmm0, eax, 0x4);
1422         mov(al, byte[A2+LDA*1-0x80]);
1423         pinsrb(xmm0, eax, 0x5);
1424         mov(al, byte[A2+LDA*2-0x80]);
1425         pinsrb(xmm0, eax, 0x6);
1426         mov(al, byte[A2+LDA3*1-0x80]);
1427         lea(A2, ptr[A2+LDA*4]);
1428         pinsrb(xmm0, eax, 0x7);
1429         mov(al, byte[A2-0x80]);
1430         pinsrb(xmm0, eax, 0x8);
1431         mov(al, byte[A2+LDA*1-0x80]);
1432         pinsrb(xmm0, eax, 0x9);
1433         mov(al, byte[A2+LDA*2-0x80]);
1434         pinsrb(xmm0, eax, 0xa);
1435         mov(al, byte[A2+LDA3*1-0x80]);
1436         lea(A2, ptr[A2+LDA*4]);
1437         pinsrb(xmm0, eax, 0xb);
1438         mov(al, byte[A2-0x80]);
1439         pinsrb(xmm0, eax, 0xc);
1440         mov(al, byte[A2+LDA*1-0x80]);
1441         pinsrb(xmm0, eax, 0xd);
1442         mov(al, byte[A2+LDA*2-0x80]);
1443         pinsrb(xmm0, eax, 0xe);
1444         mov(al, byte[A2+LDA3*1-0x80]);
1445         lea(A2, ptr[A2+LDA*4]);
1446         pinsrb(xmm0, eax, 0xf);
1447         movdqu(xword[B-0x70], xmm0);
1448         sub(B, -32);
1449         align(4);
1450
1451 L(l1a7c);
1452         sub(N, 0x20);
1453         cmp(N, 0x20);
1454         jge(lff8, T_NEAR);
1455         align(4);
1456
1457 L(l1a8c);
1458         cmp(N, 0x10);
1459         jl(l200c, T_NEAR);
1460         align(4);
1461
1462 L(l1a98);
1463         mov(A1, A);
1464         mov(I, LDA);
1465         shl(I, 0x4);
1466         add(A, I);
1467         mov(I, M);
1468         sar(I, 0x4);
1469         jle(l1c64, T_NEAR);
1470         align(4);
1471
1472 L(l1ab4);
1473         movdqu(xmm0, xword[A1-0x80]);
1474         movdqu(xmm1, xword[A1+LDA*1-0x80]);
1475         movdqu(xmm2, xword[A1+LDA*2-0x80]);
1476         movdqu(xmm3, xword[A1+LDA3*1-0x80]);
1477         lea(A2, ptr[A1+LDA*4]);
1478         movdqa(xmm4, xmm0);
1479         punpckldq(xmm0, xmm1);
1480         punpckhdq(xmm4, xmm1);
1481         movdqa(xmm5, xmm2);
1482         punpckldq(xmm2, xmm3);
1483         punpckhdq(xmm5, xmm3);
1484         movdqa(xmm1, xmm0);
1485         punpcklqdq(xmm0, xmm2);
1486         punpckhqdq(xmm1, xmm2);
1487         movdqa(xmm3, xmm4);
1488         punpcklqdq(xmm4, xmm5);
1489         punpckhqdq(xmm3, xmm5);
1490         movdqu(xword[B-0x80], xmm0);
1491         movdqu(xword[B-0x40], xmm1);
1492         movdqu(xword[B], xmm4);
1493         movdqu(xword[B+0x40], xmm3);
1494         movdqu(xmm0, xword[A2-0x80]);
1495         movdqu(xmm1, xword[A2+LDA*1-0x80]);
1496         movdqu(xmm2, xword[A2+LDA*2-0x80]);
1497         movdqu(xmm3, xword[A2+LDA3*1-0x80]);
1498         lea(A2, ptr[A2+LDA*4]);
1499         movdqa(xmm4, xmm0);
1500         punpckldq(xmm0, xmm1);
1501         punpckhdq(xmm4, xmm1);
1502         movdqa(xmm5, xmm2);
1503         punpckldq(xmm2, xmm3);
1504         punpckhdq(xmm5, xmm3);
1505         movdqa(xmm1, xmm0);
1506         punpcklqdq(xmm0, xmm2);
1507         punpckhqdq(xmm1, xmm2);
1508         movdqa(xmm3, xmm4);
1509         punpcklqdq(xmm4, xmm5);
1510         punpckhqdq(xmm3, xmm5);
1511         movdqu(xword[B-0x70], xmm0);
1512         movdqu(xword[B-0x30], xmm1);
1513         movdqu(xword[B+0x10], xmm4);
1514         movdqu(xword[B+0x50], xmm3);
1515         movdqu(xmm0, xword[A2-0x80]);
1516         movdqu(xmm1, xword[A2+LDA*1-0x80]);
1517         movdqu(xmm2, xword[A2+LDA*2-0x80]);
1518         movdqu(xmm3, xword[A2+LDA3*1-0x80]);
1519         lea(A2, ptr[A2+LDA*4]);
1520         movdqa(xmm4, xmm0);
1521         punpckldq(xmm0, xmm1);
1522         punpckhdq(xmm4, xmm1);
1523         movdqa(xmm5, xmm2);
1524         punpckldq(xmm2, xmm3);
1525         punpckhdq(xmm5, xmm3);
1526         movdqa(xmm1, xmm0);
1527         punpcklqdq(xmm0, xmm2);
1528         punpckhqdq(xmm1, xmm2);
1529         movdqa(xmm3, xmm4);
1530         punpcklqdq(xmm4, xmm5);
1531         punpckhqdq(xmm3, xmm5);
1532         movdqu(xword[B-0x60], xmm0);
1533         movdqu(xword[B-0x20], xmm1);
1534         movdqu(xword[B+0x20], xmm4);
1535         movdqu(xword[B+0x60], xmm3);
1536         movdqu(xmm0, xword[A2-0x80]);
1537         movdqu(xmm1, xword[A2+LDA*1-0x80]);
1538         movdqu(xmm2, xword[A2+LDA*2-0x80]);
1539         movdqu(xmm3, xword[A2+LDA3*1-0x80]);
1540         lea(A2, ptr[A2+LDA*4]);
1541         movdqa(xmm4, xmm0);
1542         punpckldq(xmm0, xmm1);
1543         punpckhdq(xmm4, xmm1);
1544         movdqa(xmm5, xmm2);
1545         punpckldq(xmm2, xmm3);
1546         punpckhdq(xmm5, xmm3);
1547         movdqa(xmm1, xmm0);
1548         punpcklqdq(xmm0, xmm2);
1549         punpckhqdq(xmm1, xmm2);
1550         movdqa(xmm3, xmm4);
1551         punpcklqdq(xmm4, xmm5);
1552         punpckhqdq(xmm3, xmm5);
1553         movdqu(xword[B-0x50], xmm0);
1554         movdqu(xword[B-0x10], xmm1);
1555         movdqu(xword[B+0x30], xmm4);
1556         movdqu(xword[B+0x70], xmm3);
1557         sub(A1, -16);
1558         sub(B, -256);
1559         dec(I);
1560         jg(l1ab4, T_NEAR);
1561         align(4);
1562
1563 L(l1c64);
1564         test(M, 0x8);
1565         jle(l1d74, T_NEAR);
1566         movq(xmm0, qword[A1-0x80]);
1567         movq(xmm1, qword[A1+LDA*1-0x80]);
1568         movq(xmm2, qword[A1+LDA*2-0x80]);
1569         movq(xmm3, qword[A1+LDA3*1-0x80]);
1570         lea(A2, ptr[A1+LDA*4]);
1571         punpckldq(xmm0, xmm1);
1572         punpckldq(xmm2, xmm3);
1573         movdqa(xmm1, xmm0);
1574         punpcklqdq(xmm0, xmm2);
1575         punpckhqdq(xmm1, xmm2);
1576         movdqu(xword[B-0x80], xmm0);
1577         movdqu(xword[B-0x40], xmm1);
1578         movq(xmm0, qword[A2-0x80]);
1579         movq(xmm1, qword[A2+LDA*1-0x80]);
1580         movq(xmm2, qword[A2+LDA*2-0x80]);
1581         movq(xmm3, qword[A2+LDA3*1-0x80]);
1582         lea(A2, ptr[A2+LDA*4]);
1583         punpckldq(xmm0, xmm1);
1584         punpckldq(xmm2, xmm3);
1585         movdqa(xmm1, xmm0);
1586         punpcklqdq(xmm0, xmm2);
1587         punpckhqdq(xmm1, xmm2);
1588         movdqu(xword[B-0x70], xmm0);
1589         movdqu(xword[B-0x30], xmm1);
1590         movq(xmm0, qword[A2-0x80]);
1591         movq(xmm1, qword[A2+LDA*1-0x80]);
1592         movq(xmm2, qword[A2+LDA*2-0x80]);
1593         movq(xmm3, qword[A2+LDA3*1-0x80]);
1594         lea(A2, ptr[A2+LDA*4]);
1595         punpckldq(xmm0, xmm1);
1596         punpckldq(xmm2, xmm3);
1597         movdqa(xmm1, xmm0);
1598         punpcklqdq(xmm0, xmm2);
1599         punpckhqdq(xmm1, xmm2);
1600         movdqu(xword[B-0x60], xmm0);
1601         movdqu(xword[B-0x20], xmm1);
1602         movq(xmm0, qword[A2-0x80]);
1603         movq(xmm1, qword[A2+LDA*1-0x80]);
1604         movq(xmm2, qword[A2+LDA*2-0x80]);
1605         movq(xmm3, qword[A2+LDA3*1-0x80]);
1606         punpckldq(xmm0, xmm1);
1607         punpckldq(xmm2, xmm3);
1608         movdqa(xmm1, xmm0);
1609         punpcklqdq(xmm0, xmm2);
1610         punpckhqdq(xmm1, xmm2);
1611         movdqu(xword[B-0x50], xmm0);
1612         movdqu(xword[B-0x10], xmm1);
1613         sub(A1, -8);
1614         sub(B, -128);
1615         align(4);
1616
1617 L(l1d74);
1618         test(M, 0x4);
1619         jle(l1e50, T_NEAR);
1620         movd(xmm0, dword[A1-0x80]);
1621         movd(xmm1, dword[A1+LDA*1-0x80]);
1622         movd(xmm2, dword[A1+LDA*2-0x80]);
1623         movd(xmm3, dword[A1+LDA3*1-0x80]);
1624         lea(A2, ptr[A1+LDA*4]);
1625         punpckldq(xmm0, xmm1);
1626         punpckldq(xmm2, xmm3);
1627         punpcklqdq(xmm0, xmm2);
1628         movdqu(xword[B-0x80], xmm0);
1629         movd(xmm0, dword[A2-0x80]);
1630         movd(xmm1, dword[A2+LDA*1-0x80]);
1631         movd(xmm2, dword[A2+LDA*2-0x80]);
1632         movd(xmm3, dword[A2+LDA3*1-0x80]);
1633         lea(A2, ptr[A2+LDA*4]);
1634         punpckldq(xmm0, xmm1);
1635         punpckldq(xmm2, xmm3);
1636         punpcklqdq(xmm0, xmm2);
1637         movdqu(xword[B-0x70], xmm0);
1638         movd(xmm0, dword[A2-0x80]);
1639         movd(xmm1, dword[A2+LDA*1-0x80]);
1640         movd(xmm2, dword[A2+LDA*2-0x80]);
1641         movd(xmm3, dword[A2+LDA3*1-0x80]);
1642         lea(A2, ptr[A2+LDA*4]);
1643         punpckldq(xmm0, xmm1);
1644         punpckldq(xmm2, xmm3);
1645         punpcklqdq(xmm0, xmm2);
1646         movdqu(xword[B-0x60], xmm0);
1647         movd(xmm0, dword[A2-0x80]);
1648         movd(xmm1, dword[A2+LDA*1-0x80]);
1649         movd(xmm2, dword[A2+LDA*2-0x80]);
1650         movd(xmm3, dword[A2+LDA3*1-0x80]);
1651         lea(A2, ptr[A2+LDA*4]);
1652         punpckldq(xmm0, xmm1);
1653         punpckldq(xmm2, xmm3);
1654         punpcklqdq(xmm0, xmm2);
1655         movdqu(xword[B-0x50], xmm0);
1656         sub(A1, -4);
1657         sub(B, -64);
1658         align(4);
1659
1660 L(l1e50);
1661         test(M, 0x2);
1662         jle(l1f2c, T_NEAR);
1663         mov(ax, word[A1-0x80]);
1664         pinsrw(xmm0, eax, 0x0);
1665         mov(ax, word[A1+LDA*1-0x80]);
1666         pinsrw(xmm0, eax, 0x1);
1667         mov(ax, word[A1+LDA*2-0x80]);
1668         pinsrw(xmm0, eax, 0x2);
1669         mov(ax, word[A1+LDA3*1-0x80]);
1670         lea(A2, ptr[A1+LDA*4]);
1671         pinsrw(xmm0, eax, 0x3);
1672         mov(ax, word[A2-0x80]);
1673         pinsrw(xmm0, eax, 0x4);
1674         mov(ax, word[A2+LDA*1-0x80]);
1675         pinsrw(xmm0, eax, 0x5);
1676         mov(ax, word[A2+LDA*2-0x80]);
1677         pinsrw(xmm0, eax, 0x6);
1678         mov(ax, word[A2+LDA3*1-0x80]);
1679         lea(A2, ptr[A2+LDA*4]);
1680         pinsrw(xmm0, eax, 0x7);
1681         movdqu(xword[B-0x80], xmm0);
1682         mov(ax, word[A2-0x80]);
1683         pinsrw(xmm0, eax, 0x0);
1684         mov(ax, word[A2+LDA*1-0x80]);
1685         pinsrw(xmm0, eax, 0x1);
1686         mov(ax, word[A2+LDA*2-0x80]);
1687         pinsrw(xmm0, eax, 0x2);
1688         mov(ax, word[A2+LDA3*1-0x80]);
1689         lea(A2, ptr[A2+LDA*4]);
1690         pinsrw(xmm0, eax, 0x3);
1691         mov(ax, word[A2-0x80]);
1692         pinsrw(xmm0, eax, 0x4);
1693         mov(ax, word[A2+LDA*1-0x80]);
1694         pinsrw(xmm0, eax, 0x5);
1695         mov(ax, word[A2+LDA*2-0x80]);
1696         pinsrw(xmm0, eax, 0x6);
1697         mov(ax, word[A2+LDA3*1-0x80]);
1698         pinsrw(xmm0, eax, 0x7);
1699         movdqu(xword[B-0x70], xmm0);
1700         sub(A1, -2);
1701         sub(B, -32);
1702         align(4);
1703
1704 L(l1f2c);
1705         test(M, 0x1);
1706         jle(l1ffc, T_NEAR);
1707         mov(al, byte[A1-0x80]);
1708         pinsrb(xmm0, eax, 0x0);
1709         mov(al, byte[A1+LDA*1-0x80]);
1710         pinsrb(xmm0, eax, 0x1);
1711         mov(al, byte[A1+LDA*2-0x80]);
1712         pinsrb(xmm0, eax, 0x2);
1713         mov(al, byte[A1+LDA3*1-0x80]);
1714         lea(A2, ptr[A1+LDA*4]);
1715         pinsrb(xmm0, eax, 0x3);
1716         mov(al, byte[A2-0x80]);
1717         pinsrb(xmm0, eax, 0x4);
1718         mov(al, byte[A2+LDA*1-0x80]);
1719         pinsrb(xmm0, eax, 0x5);
1720         mov(al, byte[A2+LDA*2-0x80]);
1721         pinsrb(xmm0, eax, 0x6);
1722         mov(al, byte[A2+LDA3*1-0x80]);
1723         lea(A2, ptr[A2+LDA*4]);
1724         pinsrb(xmm0, eax, 0x7);
1725         mov(al, byte[A2-0x80]);
1726         pinsrb(xmm0, eax, 0x8);
1727         mov(al, byte[A2+LDA*1-0x80]);
1728         pinsrb(xmm0, eax, 0x9);
1729         mov(al, byte[A2+LDA*2-0x80]);
1730         pinsrb(xmm0, eax, 0xa);
1731         mov(al, byte[A2+LDA3*1-0x80]);
1732         lea(A2, ptr[A2+LDA*4]);
1733         pinsrb(xmm0, eax, 0xb);
1734         mov(al, byte[A2-0x80]);
1735         pinsrb(xmm0, eax, 0xc);
1736         mov(al, byte[A2+LDA*1-0x80]);
1737         pinsrb(xmm0, eax, 0xd);
1738         mov(al, byte[A2+LDA*2-0x80]);
1739         pinsrb(xmm0, eax, 0xe);
1740         mov(al, byte[A2+LDA3*1-0x80]);
1741         pinsrb(xmm0, eax, 0xf);
1742         movdqu(xword[B-0x80], xmm0);
1743         sub(B, -16);
1744         align(4);
1745
1746 L(l1ffc);
1747         sub(N, 0x10);
1748         cmp(N, 0x10);
1749         jge(l1a98, T_NEAR);
1750         align(4);
1751
1752 L(l200c);
1753         cmp(N, 0x8);
1754         jl(l2300, T_NEAR);
1755         align(4);
1756
1757 L(l2018);
1758         mov(A1, A);
1759         lea(A2, ptr[A1+LDA*4]);
1760         lea(I, ptr[A1+LDA*8]);
1761         mov(A, I);
1762         mov(I, M);
1763         sar(I, 0x4);
1764         jle(l2110, T_NEAR);
1765         align(4);
1766
1767 L(l2034);
1768         movdqu(xmm0, xword[A1-0x80]);
1769         movdqu(xmm1, xword[A1+LDA*1-0x80]);
1770         movdqu(xmm2, xword[A1+LDA*2-0x80]);
1771         movdqu(xmm3, xword[A1+LDA3*1-0x80]);
1772         sub(A1, -16);
1773         movdqa(xmm4, xmm0);
1774         punpckldq(xmm0, xmm1);
1775         punpckhdq(xmm4, xmm1);
1776         movdqa(xmm5, xmm2);
1777         punpckldq(xmm2, xmm3);
1778         punpckhdq(xmm5, xmm3);
1779         movdqa(xmm1, xmm0);
1780         punpcklqdq(xmm0, xmm2);
1781         punpckhqdq(xmm1, xmm2);
1782         movdqa(xmm3, xmm4);
1783         punpcklqdq(xmm4, xmm5);
1784         punpckhqdq(xmm3, xmm5);
1785         movdqu(xword[B-0x80], xmm0);
1786         movdqu(xword[B-0x60], xmm1);
1787         movdqu(xword[B-0x40], xmm4);
1788         movdqu(xword[B-0x20], xmm3);
1789         movdqu(xmm0, xword[A2-0x80]);
1790         movdqu(xmm1, xword[A2+LDA*1-0x80]);
1791         movdqu(xmm2, xword[A2+LDA*2-0x80]);
1792         movdqu(xmm3, xword[A2+LDA3*1-0x80]);
1793         sub(A2, -16);
1794         movdqa(xmm4, xmm0);
1795         punpckldq(xmm0, xmm1);
1796         punpckhdq(xmm4, xmm1);
1797         movdqa(xmm5, xmm2);
1798         punpckldq(xmm2, xmm3);
1799         punpckhdq(xmm5, xmm3);
1800         movdqa(xmm1, xmm0);
1801         punpcklqdq(xmm0, xmm2);
1802         punpckhqdq(xmm1, xmm2);
1803         movdqa(xmm3, xmm4);
1804         punpcklqdq(xmm4, xmm5);
1805         punpckhqdq(xmm3, xmm5);
1806         movdqu(xword[B-0x70], xmm0);
1807         movdqu(xword[B-0x50], xmm1);
1808         movdqu(xword[B-0x30], xmm4);
1809         movdqu(xword[B-0x10], xmm3);
1810         sub(B, -128);
1811         dec(I);
1812         jg(l2034, T_NEAR);
1813         align(4);
1814
1815 L(l2110);
1816         test(M, 0x8);
1817         jle(l21a0, T_NEAR);
1818         movq(xmm0, qword[A1-0x80]);
1819         movq(xmm1, qword[A1+LDA*1-0x80]);
1820         movq(xmm2, qword[A1+LDA*2-0x80]);
1821         movq(xmm3, qword[A1+LDA3*1-0x80]);
1822         sub(A1, -8);
1823         punpckldq(xmm0, xmm1);
1824         punpckldq(xmm2, xmm3);
1825         movdqa(xmm1, xmm0);
1826         punpcklqdq(xmm0, xmm2);
1827         punpckhqdq(xmm1, xmm2);
1828         movdqu(xword[B-0x80], xmm0);
1829         movdqu(xword[B-0x60], xmm1);
1830         movq(xmm0, qword[A2-0x80]);
1831         movq(xmm1, qword[A2+LDA*1-0x80]);
1832         movq(xmm2, qword[A2+LDA*2-0x80]);
1833         movq(xmm3, qword[A2+LDA3*1-0x80]);
1834         sub(A2, -8);
1835         punpckldq(xmm0, xmm1);
1836         punpckldq(xmm2, xmm3);
1837         movdqa(xmm1, xmm0);
1838         punpcklqdq(xmm0, xmm2);
1839         punpckhqdq(xmm1, xmm2);
1840         movdqu(xword[B-0x70], xmm0);
1841         movdqu(xword[B-0x50], xmm1);
1842         sub(B, -64);
1843         align(4);
1844
1845 L(l21a0);
1846         test(M, 0x4);
1847         jle(l2210, T_NEAR);
1848         movd(xmm0, dword[A1-0x80]);
1849         movd(xmm1, dword[A1+LDA*1-0x80]);
1850         movd(xmm2, dword[A1+LDA*2-0x80]);
1851         movd(xmm3, dword[A1+LDA3*1-0x80]);
1852         sub(A1, -4);
1853         punpckldq(xmm0, xmm1);
1854         punpckldq(xmm2, xmm3);
1855         punpcklqdq(xmm0, xmm2);
1856         movdqu(xword[B-0x80], xmm0);
1857         movd(xmm0, dword[A2-0x80]);
1858         movd(xmm1, dword[A2+LDA*1-0x80]);
1859         movd(xmm2, dword[A2+LDA*2-0x80]);
1860         movd(xmm3, dword[A2+LDA3*1-0x80]);
1861         sub(A2, -4);
1862         punpckldq(xmm0, xmm1);
1863         punpckldq(xmm2, xmm3);
1864         punpcklqdq(xmm0, xmm2);
1865         movdqu(xword[B-0x70], xmm0);
1866         sub(B, -32);
1867         align(4);
1868
1869 L(l2210);
1870         test(M, 0x2);
1871         jle(l2284, T_NEAR);
1872         mov(ax, word[A1-0x80]);
1873         pinsrw(xmm0, eax, 0x0);
1874         mov(ax, word[A1+LDA*1-0x80]);
1875         pinsrw(xmm0, eax, 0x1);
1876         mov(ax, word[A1+LDA*2-0x80]);
1877         pinsrw(xmm0, eax, 0x2);
1878         mov(ax, word[A1+LDA3*1-0x80]);
1879         sub(A1, -2);
1880         pinsrw(xmm0, eax, 0x3);
1881         mov(ax, word[A2-0x80]);
1882         pinsrw(xmm0, eax, 0x4);
1883         mov(ax, word[A2+LDA*1-0x80]);
1884         pinsrw(xmm0, eax, 0x5);
1885         mov(ax, word[A2+LDA*2-0x80]);
1886         pinsrw(xmm0, eax, 0x6);
1887         mov(ax, word[A2+LDA3*1-0x80]);
1888         sub(A2, -2);
1889         pinsrw(xmm0, eax, 0x7);
1890         movdqu(xword[B-0x80], xmm0);
1891         sub(B, -16);
1892         align(4);
1893
1894 L(l2284);
1895         test(M, 0x1);
1896         jle(l22f0, T_NEAR);
1897         mov(al, byte[A1-0x80]);
1898         pinsrb(xmm0, eax, 0x0);
1899         mov(al, byte[A1+LDA*1-0x80]);
1900         pinsrb(xmm0, eax, 0x1);
1901         mov(al, byte[A1+LDA*2-0x80]);
1902         pinsrb(xmm0, eax, 0x2);
1903         mov(al, byte[A1+LDA3*1-0x80]);
1904         pinsrb(xmm0, eax, 0x3);
1905         mov(al, byte[A2-0x80]);
1906         pinsrb(xmm0, eax, 0x4);
1907         mov(al, byte[A2+LDA*1-0x80]);
1908         pinsrb(xmm0, eax, 0x5);
1909         mov(al, byte[A2+LDA*2-0x80]);
1910         pinsrb(xmm0, eax, 0x6);
1911         mov(al, byte[A2+LDA3*1-0x80]);
1912         pinsrb(xmm0, eax, 0x7);
1913         movq(qword[B-0x80], xmm0);
1914         sub(B, -8);
1915         align(4);
1916
1917 L(l22f0);
1918         sub(N, 0x8);
1919         cmp(N, 0x8);
1920         jge(l2018, T_NEAR);
1921         align(4);
1922
1923 L(l2300);
1924         cmp(N, 0x4);
1925         jl(l24c4, T_NEAR);
1926         align(4);
1927
1928 L(l230c);
1929         mov(A1, A);
1930         lea(A2, ptr[A1+LDA*2]);
1931         lea(I, ptr[A1+LDA*4]);
1932         mov(A, I);
1933         mov(I, M);
1934         sar(I, 0x4);
1935         jle(l2398, T_NEAR);
1936         align(4);
1937
1938 L(l2324);
1939         movdqu(xmm0, xword[A1-0x80]);
1940         movdqu(xmm1, xword[A1+LDA*1-0x80]);
1941         sub(A1, -16);
1942         movdqu(xmm2, xword[A2-0x80]);
1943         movdqu(xmm3, xword[A2+LDA*1-0x80]);
1944         sub(A2, -16);
1945         movdqa(xmm4, xmm0);
1946         punpckldq(xmm0, xmm1);
1947         punpckhdq(xmm4, xmm1);
1948         movdqa(xmm5, xmm2);
1949         punpckldq(xmm2, xmm3);
1950         punpckhdq(xmm5, xmm3);
1951         movdqa(xmm1, xmm0);
1952         punpcklqdq(xmm0, xmm2);
1953         punpckhqdq(xmm1, xmm2);
1954         movdqa(xmm3, xmm4);
1955         punpcklqdq(xmm4, xmm5);
1956         punpckhqdq(xmm3, xmm5);
1957         movdqu(xword[B-0x80], xmm0);
1958         movdqu(xword[B-0x70], xmm1);
1959         movdqu(xword[B-0x60], xmm4);
1960         movdqu(xword[B-0x50], xmm3);
1961         sub(B, -64);
1962         dec(I);
1963         jg(l2324, T_NEAR);
1964         align(4);
1965
1966 L(l2398);
1967         test(M, 0x8);
1968         jle(l23e8, T_NEAR);
1969         movq(xmm0, qword[A1-0x80]);
1970         movq(xmm1, qword[A1+LDA*1-0x80]);
1971         sub(A1, -8);
1972         movq(xmm2, qword[A2-0x80]);
1973         movq(xmm3, qword[A2+LDA*1-0x80]);
1974         sub(A2, -8);
1975         punpckldq(xmm0, xmm1);
1976         punpckldq(xmm2, xmm3);
1977         movdqa(xmm1, xmm0);
1978         punpcklqdq(xmm0, xmm2);
1979         punpckhqdq(xmm1, xmm2);
1980         movdqu(xword[B-0x80], xmm0);
1981         movdqu(xword[B-0x70], xmm1);
1982         sub(B, -32);
1983         align(4);
1984
1985 L(l23e8);
1986         test(M, 0x4);
1987         jle(l242c, T_NEAR);
1988         movd(xmm0, dword[A1-0x80]);
1989         movd(xmm1, dword[A1+LDA*1-0x80]);
1990         sub(A1, -4);
1991         movd(xmm2, dword[A2-0x80]);
1992         movd(xmm3, dword[A2+LDA*1-0x80]);
1993         sub(A2, -4);
1994         punpckldq(xmm0, xmm1);
1995         punpckldq(xmm2, xmm3);
1996         punpcklqdq(xmm0, xmm2);
1997         movdqu(xword[B-0x80], xmm0);
1998         sub(B, -16);
1999         align(4);
2000
2001 L(l242c);
2002         test(M, 0x2);
2003         jle(l2474, T_NEAR);
2004         mov(ax, word[A1-0x80]);
2005         pinsrw(xmm0, eax, 0x0);
2006         mov(ax, word[A1+LDA*1-0x80]);
2007         sub(A1, -2);
2008         pinsrw(xmm0, eax, 0x1);
2009         mov(ax, word[A2-0x80]);
2010         pinsrw(xmm0, eax, 0x2);
2011         mov(ax, word[A2+LDA*1-0x80]);
2012         sub(A2, -2);
2013         pinsrw(xmm0, eax, 0x3);
2014         movq(qword[B-0x80], xmm0);
2015         sub(B, -8);
2016         align(4);
2017
2018 L(l2474);
2019         test(M, 0x1);
2020         jle(l24b4, T_NEAR);
2021         mov(al, byte[A1-0x80]);
2022         pinsrb(xmm0, eax, 0x0);
2023         mov(al, byte[A1+LDA*1-0x80]);
2024         pinsrb(xmm0, eax, 0x1);
2025         mov(al, byte[A2-0x80]);
2026         pinsrb(xmm0, eax, 0x2);
2027         mov(al, byte[A2+LDA*1-0x80]);
2028         pinsrb(xmm0, eax, 0x3);
2029         movd(dword[B-0x80], xmm0);
2030         sub(B, -4);
2031         align(4);
2032
2033 L(l24b4);
2034         sub(N, 0x4);
2035         cmp(N, 0x4);
2036         jge(l230c, T_NEAR);
2037         align(4);
2038
2039 L(l24c4);
2040         cmp(N, 0x2);
2041         jl(l25d6, T_NEAR);
2042         align(4);
2043
2044 L(l24d0);
2045         mov(A1, A);
2046         lea(A2, ptr[A1+LDA*1]);
2047         lea(I, ptr[A1+LDA*2]);
2048         mov(A, I);
2049         mov(I, M);
2050         sar(I, 0x4);
2051         jle(l2520, T_NEAR);
2052         align(4);
2053
2054 L(l24e8);
2055         movdqu(xmm0, xword[A1-0x80]);
2056         sub(A1, -16);
2057         movdqu(xmm1, xword[A2-0x80]);
2058         sub(A2, -16);
2059         movdqa(xmm2, xmm0);
2060         punpckldq(xmm0, xmm1);
2061         punpckhdq(xmm2, xmm1);
2062         movdqu(xword[B-0x80], xmm0);
2063         movdqu(xword[B-0x70], xmm2);
2064         sub(B, -32);
2065         dec(I);
2066         jg(l24e8, T_NEAR);
2067         align(4);
2068
2069 L(l2520);
2070         test(M, 0x8);
2071         jle(l254c, T_NEAR);
2072         movq(xmm0, qword[A1-0x80]);
2073         sub(A1, -8);
2074         movq(xmm1, qword[A2-0x80]);
2075         sub(A2, -8);
2076         punpckldq(xmm0, xmm1);
2077         movdqu(xword[B-0x80], xmm0);
2078         sub(B, -16);
2079         align(4);
2080
2081 L(l254c);
2082         test(M, 0x4);
2083         jle(l2578, T_NEAR);
2084         movd(xmm0, dword[A1-0x80]);
2085         sub(A1, -4);
2086         movd(xmm1, dword[A2-0x80]);
2087         sub(A2, -4);
2088         punpckldq(xmm0, xmm1);
2089         movq(qword[B-0x80], xmm0);
2090         sub(B, -8);
2091         align(4);
2092
2093 L(l2578);
2094         test(M, 0x2);
2095         jle(l25a8, T_NEAR);
2096         mov(ax, word[A1-0x80]);
2097         sub(A1, -2);
2098         pinsrw(xmm0, eax, 0x0);
2099         mov(ax, word[A2-0x80]);
2100         sub(A2, -2);
2101         pinsrw(xmm0, eax, 0x1);
2102         movd(dword[B-0x80], xmm0);
2103         sub(B, -4);
2104         align(4);
2105
2106 L(l25a8);
2107         test(M, 0x1);
2108         jle(l25c8, T_NEAR);
2109         mov(al, byte[A1-0x80]);
2110         mov(byte[B-0x80], al);
2111         mov(al, byte[A2-0x80]);
2112         mov(byte[B-0x7f], al);
2113         sub(B, -2);
2114         align(4);
2115
2116 L(l25c8);
2117         sub(N, 0x2);
2118         cmp(N, 0x2);
2119         jge(l24d0, T_NEAR);
2120         align(4);
2121
2122 L(l25d6);
2123         cmp(N, 0x1);
2124         jl(l2690, T_NEAR);
2125         align(4);
2126
2127 L(l25e0);
2128         mov(A1, A);
2129         add(A, LDA);
2130         mov(I, M);
2131         sar(I, 0x4);
2132         jle(l260c, T_NEAR);
2133         align(4);
2134
2135 L(l25f0);
2136         movdqu(xmm0, xword[A1-0x80]);
2137         sub(A1, -16);
2138         movdqu(xword[B-0x80], xmm0);
2139         sub(B, -16);
2140         dec(I);
2141         jg(l25f0, T_NEAR);
2142         align(4);
2143
2144 L(l260c);
2145         test(M, 0x8);
2146         jle(l262c, T_NEAR);
2147         movq(xmm0, qword[A1-0x80]);
2148         sub(A1, -8);
2149         movq(qword[B-0x80], xmm0);
2150         sub(B, -8);
2151         align(4);
2152
2153 L(l262c);
2154         test(M, 0x4);
2155         jle(l264c, T_NEAR);
2156         movd(xmm0, dword[A1-0x80]);
2157         sub(A1, -4);
2158         movd(dword[B-0x80], xmm0);
2159         sub(B, -4);
2160         align(4);
2161
2162 L(l264c);
2163         test(M, 0x2);
2164         jle(l2668, T_NEAR);
2165         mov(ax, word[A1-0x80]);
2166         mov(word[B-0x80], ax);
2167         sub(A1, -2);
2168         sub(B, -2);
2169         align(4);
2170
2171 L(l2668);
2172         test(M, 0x1);
2173         jle(l2680, T_NEAR);
2174         mov(al, byte[A1-0x80]);
2175         mov(byte[B-0x80], al);
2176         sub(B, -1);
2177         align(4);
2178
2179 L(l2680);
2180         sub(N, 0x1);
2181         cmp(N, 0x1);
2182         jge(l25e0, T_NEAR);
2183         align(4);
2184
2185 L(l2690);
2186
2187         postamble();
2188 }
2189 outLocalLabel();
2190
2191 #undef M
2192 #undef N
2193 #undef A
2194 #undef LDA
2195 #undef ALPHA
2196 #undef B
2197 #undef I
2198 #undef A1
2199 #undef A2
2200 #undef LDA3
2201 #ifdef _WIN32
2202 #undef ARG_ALPHA
2203 #undef ARG_B
2204 #endif
2205 }
2206
2207 }
2208 }
2209 }