]> git.sesse.net Git - ffmpeg/blob - libavcodec/x86/bswapdsp.asm
lavc: AV-prefix all codec flags
[ffmpeg] / libavcodec / x86 / bswapdsp.asm
1 ;******************************************************************************
2 ;* optimized bswap buffer functions
3 ;* Copyright (c) 2008 Loren Merritt
4 ;*
5 ;* This file is part of Libav.
6 ;*
7 ;* Libav is free software; you can redistribute it and/or
8 ;* modify it under the terms of the GNU Lesser General Public
9 ;* License as published by the Free Software Foundation; either
10 ;* version 2.1 of the License, or (at your option) any later version.
11 ;*
12 ;* Libav is distributed in the hope that it will be useful,
13 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
14 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15 ;* Lesser General Public License for more details.
16 ;*
17 ;* You should have received a copy of the GNU Lesser General Public
18 ;* License along with Libav; if not, write to the Free Software
19 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 ;******************************************************************************
21
22 %include "libavutil/x86/x86util.asm"
23
24 SECTION_RODATA
25 pb_bswap32: db 3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 15, 14, 13, 12
26
27 SECTION_TEXT
28
29 ; %1 = aligned/unaligned
30 %macro BSWAP_LOOPS  1
31     mov      r3d, r2d
32     sar      r2d, 3
33     jz       .left4_%1
34 .loop8_%1:
35     mov%1    m0, [r1 +  0]
36     mov%1    m1, [r1 + 16]
37 %if cpuflag(ssse3)
38     pshufb   m0, m2
39     pshufb   m1, m2
40     mov%1    [r0 +  0], m0
41     mov%1    [r0 + 16], m1
42 %else
43     pshuflw  m0, m0, 10110001b
44     pshuflw  m1, m1, 10110001b
45     pshufhw  m0, m0, 10110001b
46     pshufhw  m1, m1, 10110001b
47     mova     m2, m0
48     mova     m3, m1
49     psllw    m0, 8
50     psllw    m1, 8
51     psrlw    m2, 8
52     psrlw    m3, 8
53     por      m2, m0
54     por      m3, m1
55     mov%1    [r0 +  0], m2
56     mov%1    [r0 + 16], m3
57 %endif
58     add      r0, 32
59     add      r1, 32
60     dec      r2d
61     jnz      .loop8_%1
62 .left4_%1:
63     mov      r2d, r3d
64     test     r3d, 4
65     jz       .left
66     mov%1    m0, [r1]
67 %if cpuflag(ssse3)
68     pshufb   m0, m2
69     mov%1    [r0], m0
70 %else
71     pshuflw  m0, m0, 10110001b
72     pshufhw  m0, m0, 10110001b
73     mova     m2, m0
74     psllw    m0, 8
75     psrlw    m2, 8
76     por      m2, m0
77     mov%1    [r0], m2
78 %endif
79     add      r1, 16
80     add      r0, 16
81 %endmacro
82
83 ; void ff_bswap_buf(uint32_t *dst, const uint32_t *src, int w);
84 %macro BSWAP32_BUF 0
85 %if cpuflag(ssse3)
86 cglobal bswap32_buf, 3,4,3
87     mova     m2, [pb_bswap32]
88 %else
89 cglobal bswap32_buf, 3,4,5
90 %endif
91     test     r1, 15
92     jz       .start_align
93     BSWAP_LOOPS  u
94     jmp      .left
95 .start_align:
96     BSWAP_LOOPS  a
97 .left:
98 %if cpuflag(ssse3)
99     test     r2d, 2
100     jz       .left1
101     movq     m0, [r1]
102     pshufb   m0, m2
103     movq     [r0], m0
104     add      r1, 8
105     add      r0, 8
106 .left1:
107     test     r2d, 1
108     jz       .end
109     mov      r2d, [r1]
110     bswap    r2d
111     mov      [r0], r2d
112 %else
113     and      r2d, 3
114     jz       .end
115 .loop2:
116     mov      r3d, [r1]
117     bswap    r3d
118     mov      [r0], r3d
119     add      r1, 4
120     add      r0, 4
121     dec      r2d
122     jnz      .loop2
123 %endif
124 .end:
125     RET
126 %endmacro
127
128 INIT_XMM sse2
129 BSWAP32_BUF
130
131 INIT_XMM ssse3
132 BSWAP32_BUF