]> git.sesse.net Git - ffmpeg/blob - libavfilter/x86/vf_hflip.asm
d14cc086e564cdf381d27c2b73680da2534a451d
[ffmpeg] / libavfilter / x86 / vf_hflip.asm
1 ;*****************************************************************************
2 ;* x86-optimized functions for hflip filter
3 ;*
4 ;* Copyright (C) 2017 Paul B Mahol
5 ;*
6 ;* This file is part of FFmpeg.
7 ;*
8 ;* FFmpeg is free software; you can redistribute it and/or
9 ;* modify it under the terms of the GNU Lesser General Public
10 ;* License as published by the Free Software Foundation; either
11 ;* version 2.1 of the License, or (at your option) any later version.
12 ;*
13 ;* FFmpeg is distributed in the hope that it will be useful,
14 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
15 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16 ;* Lesser General Public License for more details.
17 ;*
18 ;* You should have received a copy of the GNU Lesser General Public
19 ;* License along with FFmpeg; if not, write to the Free Software
20 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 ;*****************************************************************************
22
23 %include "libavutil/x86/x86util.asm"
24
25 SECTION_RODATA
26
27 pb_flip_byte:  db 15,14,13,12,11,10,9,8,7,6,5,4,3,2,1,0
28 pb_flip_short: db 14,15,12,13,10,11,8,9,6,7,4,5,2,3,0,1
29
30 SECTION .text
31
32 INIT_XMM ssse3
33 cglobal hflip_byte, 3, 5, 3, src, dst, w, r, x
34     mova    m0, [pb_flip_byte]
35     mov     xq, 0
36     mov     wd, dword wm
37     mov     rq, wq
38     and     rq, 2 * mmsize - 1
39     cmp     wq, 2 * mmsize
40     jl .loop1
41     sub     wq, rq
42
43     .loop0:
44         neg     xq
45         movu    m1, [srcq + xq -     mmsize + 1]
46         movu    m2, [srcq + xq - 2 * mmsize + 1]
47         pshufb  m1, m0
48         pshufb  m2, m0
49         neg     xq
50         movu    [dstq + xq         ], m1
51         movu    [dstq + xq + mmsize], m2
52         add     xq, mmsize * 2
53         cmp     xq, wq
54         jl .loop0
55
56         cmp    rq, 0
57         je .end
58         add    wq, rq
59
60     .loop1:
61         neg    xq
62         mov    rb, [srcq + xq]
63         neg    xq
64         mov    [dstq + xq], rb
65         add    xq, 1
66         cmp    xq, wq
67         jl .loop1
68     .end:
69 RET
70
71 cglobal hflip_short, 3, 5, 3, src, dst, w, r, x
72     mova    m0, [pb_flip_short]
73     mov     xq, 0
74     mov     wd, dword wm
75     add     wq, wq
76     mov     rq, wq
77     and     rq, 2 * mmsize - 1
78     cmp     wq, 2 * mmsize
79     jl .loop1
80     sub     wq, rq
81
82     .loop0:
83         neg     xq
84         movu    m1, [srcq + xq -     mmsize + 2]
85         movu    m2, [srcq + xq - 2 * mmsize + 2]
86         pshufb  m1, m0
87         pshufb  m2, m0
88         neg     xq
89         movu    [dstq + xq         ], m1
90         movu    [dstq + xq + mmsize], m2
91         add     xq, mmsize * 2
92         cmp     xq, wq
93         jl .loop0
94
95         cmp    rq, 0
96         je .end
97         add    wq, rq
98
99     .loop1:
100         neg    xq
101         mov    rw, [srcq + xq]
102         neg    xq
103         mov    [dstq + xq], rw
104         add    xq, 2
105         cmp    xq, wq
106         jl .loop1
107     .end:
108 RET