configure: add --extra-cxxflags option
[platform/upstream/libvpx.git] / vpx_dsp / x86 / vpx_subpixel_8t_ssse3.asm
1 ;
2 ;  Copyright (c) 2015 The WebM project authors. All Rights Reserved.
3 ;
4 ;  Use of this source code is governed by a BSD-style license
5 ;  that can be found in the LICENSE file in the root of the source
6 ;  tree. An additional intellectual property rights grant can be found
7 ;  in the file PATENTS.  All contributing project authors may
8 ;  be found in the AUTHORS file in the root of the source tree.
9 ;
10
11 %include "third_party/x86inc/x86inc.asm"
12
13 SECTION_RODATA
14 pw_64:    times 8 dw 64
15
16 ; %define USE_PMULHRSW
17 ; NOTE: pmulhrsw has a latency of 5 cycles.  Tests showed a performance loss
18 ; when using this instruction.
19
20 SECTION .text
21 %if ARCH_X86_64
22   %define LOCAL_VARS_SIZE 16*4
23 %else
24   %define LOCAL_VARS_SIZE 16*6
25 %endif
26
27 %macro SETUP_LOCAL_VARS 0
28     ; TODO(slavarnway): using xmm registers for these on ARCH_X86_64 +
29     ; pmaddubsw has a higher latency on some platforms, this might be eased by
30     ; interleaving the instructions.
31     %define    k0k1  [rsp + 16*0]
32     %define    k2k3  [rsp + 16*1]
33     %define    k4k5  [rsp + 16*2]
34     %define    k6k7  [rsp + 16*3]
35     packsswb     m4, m4
36     ; TODO(slavarnway): multiple pshufb instructions had a higher latency on
37     ; some platforms.
38     pshuflw      m0, m4, 0b              ;k0_k1
39     pshuflw      m1, m4, 01010101b       ;k2_k3
40     pshuflw      m2, m4, 10101010b       ;k4_k5
41     pshuflw      m3, m4, 11111111b       ;k6_k7
42     punpcklqdq   m0, m0
43     punpcklqdq   m1, m1
44     punpcklqdq   m2, m2
45     punpcklqdq   m3, m3
46     mova       k0k1, m0
47     mova       k2k3, m1
48     mova       k4k5, m2
49     mova       k6k7, m3
50 %if ARCH_X86_64
51     %define     krd  m12
52     %define     tmp  m13
53     mova        krd, [GLOBAL(pw_64)]
54 %else
55     %define     tmp  [rsp + 16*4]
56     %define     krd  [rsp + 16*5]
57 %if CONFIG_PIC=0
58     mova         m6, [GLOBAL(pw_64)]
59 %else
60     ; build constants without accessing global memory
61     pcmpeqb      m6, m6                  ;all ones
62     psrlw        m6, 15
63     psllw        m6, 6                   ;aka pw_64
64 %endif
65     mova        krd, m6
66 %endif
67 %endm
68
69 %macro HORIZx4_ROW 2
70     mova      %2, %1
71     punpcklbw %1, %1
72     punpckhbw %2, %2
73
74     mova      m3, %2
75     palignr   %2, %1, 1
76     palignr   m3, %1, 5
77
78     pmaddubsw %2, k0k1k4k5
79     pmaddubsw m3, k2k3k6k7
80
81     mova      m4, %2
82     mova      m5, m3
83     psrldq    %2, 8
84     psrldq    m3, 8
85     mova      m6, m5
86
87     paddsw    m4, m3
88     pmaxsw    m5, %2
89     pminsw    %2, m6
90     paddsw    %2, m4
91     paddsw    %2, m5
92     paddsw    %2, krd
93     psraw     %2, 7
94     packuswb  %2, %2
95 %endm
96
97 ;-------------------------------------------------------------------------------
98 %macro SUBPIX_HFILTER4 1
99 cglobal filter_block1d4_%1, 6, 6+(ARCH_X86_64*2), 11, LOCAL_VARS_SIZE, \
100                             src, sstride, dst, dstride, height, filter
101     mova                m4, [filterq]
102     packsswb            m4, m4
103 %if ARCH_X86_64
104     %define       k0k1k4k5 m8
105     %define       k2k3k6k7 m9
106     %define            krd m10
107     %define    orig_height r7
108     mova               krd, [GLOBAL(pw_64)]
109     pshuflw       k0k1k4k5, m4, 0b              ;k0_k1
110     pshufhw       k0k1k4k5, k0k1k4k5, 10101010b ;k0_k1_k4_k5
111     pshuflw       k2k3k6k7, m4, 01010101b       ;k2_k3
112     pshufhw       k2k3k6k7, k2k3k6k7, 11111111b ;k2_k3_k6_k7
113 %else
114     %define       k0k1k4k5 [rsp + 16*0]
115     %define       k2k3k6k7 [rsp + 16*1]
116     %define            krd [rsp + 16*2]
117     %define    orig_height [rsp + 16*3]
118     pshuflw             m6, m4, 0b              ;k0_k1
119     pshufhw             m6, m6, 10101010b       ;k0_k1_k4_k5
120     pshuflw             m7, m4, 01010101b       ;k2_k3
121     pshufhw             m7, m7, 11111111b       ;k2_k3_k6_k7
122 %if CONFIG_PIC=0
123     mova                m1, [GLOBAL(pw_64)]
124 %else
125     ; build constants without accessing global memory
126     pcmpeqb             m1, m1                  ;all ones
127     psrlw               m1, 15
128     psllw               m1, 6                   ;aka pw_64
129 %endif
130     mova          k0k1k4k5, m6
131     mova          k2k3k6k7, m7
132     mova               krd, m1
133 %endif
134     mov        orig_height, heightq
135     shr            heightq, 1
136 .loop:
137     ;Do two rows at once
138     movh                m0, [srcq - 3]
139     movh                m1, [srcq + 5]
140     punpcklqdq          m0, m1
141     mova                m1, m0
142     movh                m2, [srcq + sstrideq - 3]
143     movh                m3, [srcq + sstrideq + 5]
144     punpcklqdq          m2, m3
145     mova                m3, m2
146     punpcklbw           m0, m0
147     punpckhbw           m1, m1
148     punpcklbw           m2, m2
149     punpckhbw           m3, m3
150     mova                m4, m1
151     palignr             m4, m0,  1
152     pmaddubsw           m4, k0k1k4k5
153     palignr             m1, m0,  5
154     pmaddubsw           m1, k2k3k6k7
155     mova                m7, m3
156     palignr             m7, m2,  1
157     pmaddubsw           m7, k0k1k4k5
158     palignr             m3, m2,  5
159     pmaddubsw           m3, k2k3k6k7
160     mova                m0, m4
161     mova                m5, m1
162     mova                m2, m7
163     psrldq              m4, 8
164     psrldq              m1, 8
165     mova                m6, m5
166     paddsw              m0, m1
167     mova                m1, m3
168     psrldq              m7, 8
169     psrldq              m3, 8
170     paddsw              m2, m3
171     mova                m3, m1
172     pmaxsw              m5, m4
173     pminsw              m4, m6
174     paddsw              m4, m0
175     paddsw              m4, m5
176     pmaxsw              m1, m7
177     pminsw              m7, m3
178     paddsw              m7, m2
179     paddsw              m7, m1
180
181     paddsw              m4, krd
182     psraw               m4, 7
183     packuswb            m4, m4
184     paddsw              m7, krd
185     psraw               m7, 7
186     packuswb            m7, m7
187
188 %ifidn %1, h8_avg
189     movd                m0, [dstq]
190     pavgb               m4, m0
191     movd                m2, [dstq + dstrideq]
192     pavgb               m7, m2
193 %endif
194     movd            [dstq], m4
195     movd [dstq + dstrideq], m7
196
197     lea               srcq, [srcq + sstrideq        ]
198     prefetcht0              [srcq + 4 * sstrideq - 3]
199     lea               srcq, [srcq + sstrideq        ]
200     lea               dstq, [dstq + 2 * dstrideq    ]
201     prefetcht0              [srcq + 2 * sstrideq - 3]
202
203     dec            heightq
204     jnz              .loop
205
206     ; Do last row if output_height is odd
207     mov            heightq, orig_height
208     and            heightq, 1
209     je               .done
210
211     movh                m0, [srcq - 3]    ; load src
212     movh                m1, [srcq + 5]
213     punpcklqdq          m0, m1
214
215     HORIZx4_ROW         m0, m1
216 %ifidn %1, h8_avg
217     movd                m0, [dstq]
218     pavgb               m1, m0
219 %endif
220     movd            [dstq], m1
221 .done
222     RET
223 %endm
224
225 %macro HORIZx8_ROW 5
226     mova        %2, %1
227     punpcklbw   %1, %1
228     punpckhbw   %2, %2
229
230     mova        %3, %2
231     mova        %4, %2
232     mova        %5, %2
233
234     palignr     %2, %1, 1
235     palignr     %3, %1, 5
236     palignr     %4, %1, 9
237     palignr     %5, %1, 13
238
239     pmaddubsw   %2, k0k1
240     pmaddubsw   %3, k2k3
241     pmaddubsw   %4, k4k5
242     pmaddubsw   %5, k6k7
243
244     paddsw      %2, %5
245     mova        %1, %3
246     pminsw      %3, %4
247     pmaxsw      %1, %4
248     paddsw      %2, %3
249     paddsw      %1, %2
250     paddsw      %1, krd
251     psraw       %1, 7
252     packuswb    %1, %1
253 %endm
254
255 ;-------------------------------------------------------------------------------
256 %macro SUBPIX_HFILTER8 1
257 cglobal filter_block1d8_%1, 6, 6+(ARCH_X86_64*1), 13, LOCAL_VARS_SIZE, \
258                             src, sstride, dst, dstride, height, filter
259     mova                 m4, [filterq]
260     SETUP_LOCAL_VARS
261 %if ARCH_X86_64
262     %define     orig_height r7
263 %else
264     %define     orig_height heightmp
265 %endif
266     mov         orig_height, heightq
267     shr             heightq, 1
268
269 .loop:
270     movh                 m0, [srcq - 3]
271     movh                 m3, [srcq + 5]
272     movh                 m4, [srcq + sstrideq - 3]
273     movh                 m7, [srcq + sstrideq + 5]
274     punpcklqdq           m0, m3
275     mova                 m1, m0
276     punpcklbw            m0, m0
277     punpckhbw            m1, m1
278     mova                 m5, m1
279     palignr              m5, m0, 13
280     pmaddubsw            m5, k6k7
281     mova                 m2, m1
282     mova                 m3, m1
283     palignr              m1, m0, 1
284     pmaddubsw            m1, k0k1
285     punpcklqdq           m4, m7
286     mova                 m6, m4
287     punpcklbw            m4, m4
288     palignr              m2, m0, 5
289     punpckhbw            m6, m6
290     palignr              m3, m0, 9
291     mova                 m7, m6
292     pmaddubsw            m2, k2k3
293     pmaddubsw            m3, k4k5
294
295     palignr              m7, m4, 13
296     paddsw               m1, m5
297     mova                 m5, m6
298     mova                 m0, m2
299     palignr              m5, m4, 5
300     pminsw               m2, m3
301     pmaddubsw            m7, k6k7
302     pmaxsw               m3, m0
303     paddsw               m1, m2
304     mova                 m0, m6
305     palignr              m6, m4, 1
306     pmaddubsw            m5, k2k3
307     paddsw               m1, m3
308     pmaddubsw            m6, k0k1
309     palignr              m0, m4, 9
310     paddsw               m1, krd
311     pmaddubsw            m0, k4k5
312     mova                 m4, m5
313     psraw                m1, 7
314     pminsw               m5, m0
315     paddsw               m6, m7
316     packuswb             m1, m1
317
318     paddsw               m6, m5
319     pmaxsw               m0, m4
320     paddsw               m6, m0
321     paddsw               m6, krd
322     psraw                m6, 7
323     packuswb             m6, m6
324
325 %ifidn %1, h8_avg
326     movh                 m0, [dstq]
327     movh                 m2, [dstq + dstrideq]
328     pavgb                m1, m0
329     pavgb                m6, m2
330 %endif
331     movh             [dstq], m1
332     movh  [dstq + dstrideq], m6
333
334     lea                srcq, [srcq + sstrideq        ]
335     prefetcht0               [srcq + 4 * sstrideq - 3]
336     lea                srcq, [srcq + sstrideq        ]
337     lea                dstq, [dstq + 2 * dstrideq    ]
338     prefetcht0               [srcq + 2 * sstrideq - 3]
339     dec             heightq
340     jnz             .loop
341
342     ;Do last row if output_height is odd
343     mov             heightq, orig_height
344     and             heightq, 1
345     je                .done
346
347     movh                 m0, [srcq - 3]
348     movh                 m3, [srcq + 5]
349     punpcklqdq           m0, m3
350
351     HORIZx8_ROW          m0, m1, m2, m3, m4
352
353 %ifidn %1, h8_avg
354     movh                 m1, [dstq]
355     pavgb                m0, m1
356 %endif
357     movh             [dstq], m0
358 .done:
359     RET
360 %endm
361
362 ;-------------------------------------------------------------------------------
363 %macro SUBPIX_HFILTER16 1
364 cglobal filter_block1d16_%1, 6, 6+(ARCH_X86_64*0), 13, LOCAL_VARS_SIZE, \
365                              src, sstride, dst, dstride, height, filter
366     mova          m4, [filterq]
367     SETUP_LOCAL_VARS
368 .loop:
369     prefetcht0        [srcq + 2 * sstrideq -3]
370
371     movh          m0, [srcq -  3]
372     movh          m4, [srcq +  5]
373     movh          m6, [srcq + 13]
374     punpcklqdq    m0, m4
375     mova          m7, m0
376     punpckhbw     m0, m0
377     mova          m1, m0
378     punpcklqdq    m4, m6
379     mova          m3, m0
380     punpcklbw     m7, m7
381
382     palignr       m3, m7, 13
383     mova          m2, m0
384     pmaddubsw     m3, k6k7
385     palignr       m0, m7, 1
386     pmaddubsw     m0, k0k1
387     palignr       m1, m7, 5
388     pmaddubsw     m1, k2k3
389     palignr       m2, m7, 9
390     pmaddubsw     m2, k4k5
391     paddsw        m0, m3
392     mova          m3, m4
393     punpckhbw     m4, m4
394     mova          m5, m4
395     punpcklbw     m3, m3
396     mova          m7, m4
397     palignr       m5, m3, 5
398     mova          m6, m4
399     palignr       m4, m3, 1
400     pmaddubsw     m4, k0k1
401     pmaddubsw     m5, k2k3
402     palignr       m6, m3, 9
403     pmaddubsw     m6, k4k5
404     palignr       m7, m3, 13
405     pmaddubsw     m7, k6k7
406
407     mova          m3, m1
408     pmaxsw        m1, m2
409     pminsw        m2, m3
410     paddsw        m0, m2
411     paddsw        m0, m1
412     paddsw        m4, m7
413     mova          m7, m5
414     pmaxsw        m5, m6
415     pminsw        m6, m7
416     paddsw        m4, m6
417     paddsw        m4, m5
418     paddsw        m0, krd
419     paddsw        m4, krd
420     psraw         m0, 7
421     psraw         m4, 7
422     packuswb      m0, m4
423 %ifidn %1, h8_avg
424     mova          m1, [dstq]
425     pavgb         m0, m1
426 %endif
427     lea         srcq, [srcq + sstrideq]
428     mova      [dstq], m0
429     lea         dstq, [dstq + dstrideq]
430     dec      heightq
431     jnz        .loop
432     RET
433 %endm
434
435 INIT_XMM ssse3
436 SUBPIX_HFILTER16 h8
437 SUBPIX_HFILTER16 h8_avg
438 SUBPIX_HFILTER8  h8
439 SUBPIX_HFILTER8  h8_avg
440 SUBPIX_HFILTER4  h8
441 SUBPIX_HFILTER4  h8_avg
442
443 ;-------------------------------------------------------------------------------
444 %macro SUBPIX_VFILTER 2
445 cglobal filter_block1d%2_%1, 6, 6+(ARCH_X86_64*3), 14, LOCAL_VARS_SIZE, \
446                              src, sstride, dst, dstride, height, filter
447     mova          m4, [filterq]
448     SETUP_LOCAL_VARS
449 %if ARCH_X86_64
450     %define      src1q r7
451     %define  sstride6q r8
452     %define dst_stride dstrideq
453 %else
454     %define      src1q filterq
455     %define  sstride6q dstrideq
456     %define dst_stride dstridemp
457 %endif
458     mov       src1q, srcq
459     add       src1q, sstrideq
460     lea   sstride6q, [sstrideq + sstrideq * 4]
461     add   sstride6q, sstrideq                   ;pitch * 6
462
463 %ifidn %2, 8
464     %define movx movh
465 %else
466     %define movx movd
467 %endif
468 .loop:
469     movx         m0, [srcq                ]     ;A
470     movx         m1, [srcq + sstrideq     ]     ;B
471     punpcklbw    m0, m1                         ;A B
472     movx         m2, [srcq + sstrideq * 2 ]     ;C
473     pmaddubsw    m0, k0k1
474     mova         m6, m2
475     movx         m3, [src1q + sstrideq * 2]     ;D
476     punpcklbw    m2, m3                         ;C D
477     pmaddubsw    m2, k2k3
478     movx         m4, [srcq + sstrideq * 4 ]     ;E
479     mova         m7, m4
480     movx         m5, [src1q + sstrideq * 4]     ;F
481     punpcklbw    m4, m5                         ;E F
482     pmaddubsw    m4, k4k5
483     punpcklbw    m1, m6                         ;A B next iter
484     movx         m6, [srcq + sstride6q    ]     ;G
485     punpcklbw    m5, m6                         ;E F next iter
486     punpcklbw    m3, m7                         ;C D next iter
487     pmaddubsw    m5, k4k5
488     movx         m7, [src1q + sstride6q   ]     ;H
489     punpcklbw    m6, m7                         ;G H
490     pmaddubsw    m6, k6k7
491     mova        tmp, m2
492     pmaddubsw    m3, k2k3
493     pmaddubsw    m1, k0k1
494     pmaxsw       m2, m4
495     paddsw       m0, m6
496     movx         m6, [srcq + sstrideq * 8 ]     ;H next iter
497     punpcklbw    m7, m6
498     pmaddubsw    m7, k6k7
499     pminsw       m4, tmp
500     paddsw       m0, m4
501     mova         m4, m3
502     paddsw       m0, m2
503     pminsw       m3, m5
504     pmaxsw       m5, m4
505     paddsw       m0, krd
506     psraw        m0, 7
507     paddsw       m1, m7
508     packuswb     m0, m0
509
510     paddsw       m1, m3
511     paddsw       m1, m5
512     paddsw       m1, krd
513     psraw        m1, 7
514     lea        srcq, [srcq + sstrideq * 2 ]
515     lea       src1q, [src1q + sstrideq * 2]
516     packuswb     m1, m1
517
518 %ifidn %1, v8_avg
519     movx         m2, [dstq]
520     pavgb        m0, m2
521 %endif
522     movx     [dstq], m0
523     add        dstq, dst_stride
524 %ifidn %1, v8_avg
525     movx         m3, [dstq]
526     pavgb        m1, m3
527 %endif
528     movx     [dstq], m1
529     add        dstq, dst_stride
530     sub     heightq, 2
531     cmp     heightq, 1
532     jg        .loop
533
534     cmp     heightq, 0
535     je        .done
536
537     movx         m0, [srcq                ]     ;A
538     movx         m1, [srcq + sstrideq     ]     ;B
539     movx         m6, [srcq + sstride6q    ]     ;G
540     punpcklbw    m0, m1                         ;A B
541     movx         m7, [rax + sstride6q     ]     ;H
542     pmaddubsw    m0, k0k1
543     movx         m2, [srcq + sstrideq * 2 ]     ;C
544     punpcklbw    m6, m7                         ;G H
545     movx         m3, [rax + sstrideq * 2  ]     ;D
546     pmaddubsw    m6, k6k7
547     movx         m4, [srcq + sstrideq * 4 ]     ;E
548     punpcklbw    m2, m3                         ;C D
549     movx         m5, [src1q + sstrideq * 4]     ;F
550     punpcklbw    m4, m5                         ;E F
551     pmaddubsw    m2, k2k3
552     pmaddubsw    m4, k4k5
553     paddsw       m0, m6
554     mova         m1, m2
555     pmaxsw       m2, m4
556     pminsw       m4, m1
557     paddsw       m0, m4
558     paddsw       m0, m2
559     paddsw       m0, krd
560     psraw        m0, 7
561     packuswb     m0, m0
562 %ifidn %1, v8_avg
563     movx         m1, [dstq]
564     pavgb        m0, m1
565 %endif
566     movx     [dstq], m0
567 .done:
568     RET
569 %endm
570
571 ;-------------------------------------------------------------------------------
572 %macro SUBPIX_VFILTER16 1
573 cglobal filter_block1d16_%1, 6, 6+(ARCH_X86_64*2), 13, LOCAL_VARS_SIZE, \
574                              src, sstride, dst, dstride, height, filter
575
576     mova          m4, [filterq]
577     SETUP_LOCAL_VARS
578 %if ARCH_X86_64
579     %define      src1q r7
580     %define  sstride6q r8
581     %define dst_stride dstrideq
582 %else
583     %define      src1q filterq
584     %define  sstride6q dstrideq
585     %define dst_stride dstridemp
586 %endif
587     mov        src1q, srcq
588     add        src1q, sstrideq
589     lea    sstride6q, [sstrideq + sstrideq * 4]
590     add    sstride6q, sstrideq                   ;pitch * 6
591
592 .loop:
593     movh          m0, [srcq                ]     ;A
594     movh          m1, [srcq + sstrideq     ]     ;B
595     movh          m2, [srcq + sstrideq * 2 ]     ;C
596     movh          m3, [src1q + sstrideq * 2]     ;D
597     movh          m4, [srcq + sstrideq * 4 ]     ;E
598     movh          m5, [src1q + sstrideq * 4]     ;F
599
600     punpcklbw     m0, m1                         ;A B
601     movh          m6, [srcq + sstride6q]         ;G
602     punpcklbw     m2, m3                         ;C D
603     movh          m7, [src1q + sstride6q]        ;H
604     punpcklbw     m4, m5                         ;E F
605     pmaddubsw     m0, k0k1
606     movh          m3, [srcq + 8]                 ;A
607     pmaddubsw     m2, k2k3
608     punpcklbw     m6, m7                         ;G H
609     movh          m5, [srcq + sstrideq + 8]      ;B
610     pmaddubsw     m4, k4k5
611     punpcklbw     m3, m5                         ;A B
612     movh          m7, [srcq + sstrideq * 2 + 8]  ;C
613     pmaddubsw     m6, k6k7
614     mova          m1, m2
615     movh          m5, [src1q + sstrideq * 2 + 8] ;D
616     pmaxsw        m2, m4
617     punpcklbw     m7, m5                         ;C D
618     pminsw        m4, m1
619     paddsw        m0, m6
620     pmaddubsw     m3, k0k1
621     movh          m1, [srcq + sstrideq * 4 + 8]  ;E
622     paddsw        m0, m4
623     pmaddubsw     m7, k2k3
624     movh          m6, [src1q + sstrideq * 4 + 8] ;F
625     punpcklbw     m1, m6                         ;E F
626     paddsw        m0, m2
627     paddsw        m0, krd
628     movh          m2, [srcq + sstride6q + 8]     ;G
629     pmaddubsw     m1, k4k5
630     movh          m5, [src1q + sstride6q + 8]    ;H
631     psraw         m0, 7
632     punpcklbw     m2, m5                         ;G H
633     packuswb      m0, m0
634     pmaddubsw     m2, k6k7
635 %ifidn %1, v8_avg
636     movh          m4, [dstq]
637     pavgb         m0, m4
638 %endif
639     movh      [dstq], m0
640     mova          m6, m7
641     pmaxsw        m7, m1
642     pminsw        m1, m6
643     paddsw        m3, m2
644     paddsw        m3, m1
645     paddsw        m3, m7
646     paddsw        m3, krd
647     psraw         m3, 7
648     packuswb      m3, m3
649
650     add         srcq, sstrideq
651     add        src1q, sstrideq
652 %ifidn %1, v8_avg
653     movh          m1, [dstq + 8]
654     pavgb         m3, m1
655 %endif
656     movh  [dstq + 8], m3
657     add         dstq, dst_stride
658     dec      heightq
659     jnz        .loop
660     RET
661 %endm
662
663 INIT_XMM ssse3
664 SUBPIX_VFILTER16     v8
665 SUBPIX_VFILTER16 v8_avg
666 SUBPIX_VFILTER       v8, 8
667 SUBPIX_VFILTER   v8_avg, 8
668 SUBPIX_VFILTER       v8, 4
669 SUBPIX_VFILTER   v8_avg, 4