]> git.sesse.net Git - ffmpeg/blob - libavcodec/x86/bswapdsp.asm
ffv1: Pass correct pointers to av_free()
[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      r3, r2
32     sar      r2, 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      r2
61     jnz      .loop8_%1
62 .left4_%1:
63     mov      r2, r3
64     and      r3, 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     mov      r3, r1
88     mova     m2, [pb_bswap32]
89 %else
90 cglobal bswap32_buf, 3,4,5
91     mov      r3, r1
92 %endif
93     and      r3, 15
94     jz       .start_align
95     BSWAP_LOOPS  u
96     jmp      .left
97 .start_align:
98     BSWAP_LOOPS  a
99 .left:
100 %if cpuflag(ssse3)
101     mov      r3, r2
102     and      r2, 2
103     jz       .left1
104     movq     m0, [r1]
105     pshufb   m0, m2
106     movq     [r0], m0
107     add      r1, 8
108     add      r0, 8
109 .left1:
110     and      r3, 1
111     jz       .end
112     mov      r2d, [r1]
113     bswap    r2d
114     mov      [r0], r2d
115 %else
116     and      r2, 3
117     jz       .end
118 .loop2:
119     mov      r3d, [r1]
120     bswap    r3d
121     mov      [r0], r3d
122     add      r1, 4
123     add      r0, 4
124     dec      r2
125     jnz      .loop2
126 %endif
127 .end:
128     RET
129 %endmacro
130
131 INIT_XMM sse2
132 BSWAP32_BUF
133
134 INIT_XMM ssse3
135 BSWAP32_BUF