Coverage Report

Created: 2026-07-25 07:06

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/vvdec/source/Lib/CommonLib/x86/TrafoX86.h
Line
Count
Source
1
/* -----------------------------------------------------------------------------
2
The copyright in this software is being made available under the Clear BSD
3
License, included below. No patent rights, trademark rights and/or 
4
other Intellectual Property Rights other than the copyrights concerning 
5
the Software are granted under this license.
6
7
The Clear BSD License
8
9
Copyright (c) 2018-2026, Fraunhofer-Gesellschaft zur Förderung der angewandten Forschung e.V. & The VVdeC Authors.
10
All rights reserved.
11
12
Redistribution and use in source and binary forms, with or without modification,
13
are permitted (subject to the limitations in the disclaimer below) provided that
14
the following conditions are met:
15
16
     * Redistributions of source code must retain the above copyright notice,
17
     this list of conditions and the following disclaimer.
18
19
     * Redistributions in binary form must reproduce the above copyright
20
     notice, this list of conditions and the following disclaimer in the
21
     documentation and/or other materials provided with the distribution.
22
23
     * Neither the name of the copyright holder nor the names of its
24
     contributors may be used to endorse or promote products derived from this
25
     software without specific prior written permission.
26
27
NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY
28
THIS LICENSE. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND
29
CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
31
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
32
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
33
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
34
PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
35
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
36
IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
37
ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
38
POSSIBILITY OF SUCH DAMAGE.
39
40
41
------------------------------------------------------------------------------------------- */
42
43
/** \file     TrafoX86.h
44
    \brief    SIMD trafo
45
*/
46
47
//! \ingroup CommonLib
48
//! \{
49
50
51
#include "CommonLib/CommonDef.h"
52
#include "CommonLib/Rom.h"
53
54
#include "CommonDefX86.h"
55
56
#include "TrQuant.h"
57
#include "TrQuant_EMT.h"
58
59
namespace vvdec
60
{
61
62
#if ENABLE_SIMD_TCOEFF_OPS
63
#ifdef TARGET_SIMD_X86
64
65
template< X86_VEXT vext, int trSize >
66
void fastInv_SSE( const TMatrixCoeff* it, const TCoeff* src, TCoeff* dst, unsigned lines, unsigned reducedLines, unsigned rows )
67
108k
{
68
108k
  unsigned maxLoopL = std::min<int>( reducedLines, 4 );
69
70
#if USE_AVX2
71
108k
  if( trSize >= 8 && vext >= AVX2 )
72
105k
  {
73
105k
    if( ( trSize & 15 ) == 0 )
74
79.3k
    {
75
79.3k
      static constexpr unsigned trLoops = trSize >= 16 ? trSize >> 4 : 1;
76
77
361k
      for( int k = 0; k < rows; k += 2 )
78
282k
      {
79
282k
              TCoeff* dstPtr =  dst;
80
81
282k
        const TCoeff* srcPtr0 = &src[ k      * lines];
82
282k
        const TCoeff* srcPtr1 = &src[(k + 1) * lines];
83
84
282k
        __m256i vsrc1v[trLoops][2];
85
        
86
        const TMatrixCoeff*  itPtr0 = &it[ k      * trSize];
87
        const TMatrixCoeff*  itPtr1 = &it[(k + 1) * trSize];
88
89
806k
        for( int col = 0; col < trLoops; col++, itPtr0 += 16, itPtr1 += 16 )
90
524k
        {
91
#if defined( _MSC_VER ) && _MSC_VER > 1900
92
          __m256i vit16_0 = _mm256_permute4x64_epi64( _mm256_stream_load_si256( ( const __m256i * ) itPtr0 ), ( 0 << 0 ) + ( 1 << 4 ) + ( 2 << 2 ) + ( 3 << 6 ) );
93
          __m256i vit16_1 = _mm256_permute4x64_epi64( _mm256_stream_load_si256( ( const __m256i * ) itPtr1 ), ( 0 << 0 ) + ( 1 << 4 ) + ( 2 << 2 ) + ( 3 << 6 ) );
94
#else
95
524k
          __m256i vit16_0 = _mm256_permute4x64_epi64( _mm256_stream_load_si256( (       __m256i * ) itPtr0 ), ( 0 << 0 ) + ( 1 << 4 ) + ( 2 << 2 ) + ( 3 << 6 ) );
96
524k
          __m256i vit16_1 = _mm256_permute4x64_epi64( _mm256_stream_load_si256( (       __m256i * ) itPtr1 ), ( 0 << 0 ) + ( 1 << 4 ) + ( 2 << 2 ) + ( 3 << 6 ) );
97
524k
#endif
98
99
          vsrc1v[col][0] = _mm256_unpacklo_epi16( vit16_0, vit16_1 );
100
          vsrc1v[col][1] = _mm256_unpackhi_epi16( vit16_0, vit16_1 );
101
        }
102
103
1.35M
        for( int i = 0; i < reducedLines; i += 4, srcPtr0 += maxLoopL, srcPtr1 += maxLoopL )
104
1.07M
        {
105
1.07M
          __m128i xscale = maxLoopL == 4
106
1.07M
                         ? _mm_packs_epi32( _mm_load_si128( ( const __m128i* )srcPtr0 ), _mm_load_si128( ( const __m128i* )srcPtr1 ) )
107
1.07M
                         : _mm_packs_epi32( _mm_loadu_si64( ( const __m128i* )srcPtr0 ), _mm_loadu_si64( ( const __m128i* )srcPtr1 ) );
108
109
1.07M
          if( _mm_test_all_zeros( xscale, xscale ) ) { dstPtr += ( trSize * maxLoopL ); continue; }
110
111
898k
          xscale = _mm_shuffle_epi8( xscale, _mm_setr_epi8( 0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15 ) );
112
4.47M
          for( int l = 0; l < maxLoopL; l++ )
113
3.58M
          {
114
3.58M
            __m256i
115
3.58M
            vscale = _mm256_broadcastd_epi32( xscale );
116
3.58M
            xscale = _mm_bsrli_si128( xscale, 4 );
117
118
11.5M
            for( int col = 0; col < trLoops; col++, dstPtr += 16 )
119
7.92M
            {
120
7.92M
              __m256i vsrc0 = _mm256_load_si256       ( ( const __m256i * ) dstPtr );
121
122
7.92M
              __m256i
123
7.92M
              vsrc1 = vsrc1v[col][0];
124
7.92M
              vsrc1 = _mm256_madd_epi16    ( vsrc1, vscale );
125
7.92M
              vsrc0 = _mm256_add_epi32     ( vsrc0, vsrc1 );
126
127
7.92M
              _mm256_store_si256           ( ( __m256i * ) dstPtr, vsrc0 );
128
            
129
7.92M
              vsrc0 = _mm256_load_si256    ( ( const __m256i * ) &dstPtr[8] );
130
131
7.92M
              vsrc1 = vsrc1v[col][1];
132
7.92M
              vsrc1 = _mm256_madd_epi16    ( vsrc1, vscale );
133
7.92M
              vsrc0 = _mm256_add_epi32     ( vsrc0, vsrc1 );
134
135
7.92M
              _mm256_store_si256           ( ( __m256i * ) &dstPtr[8], vsrc0 );
136
7.92M
            }
137
3.58M
          }
138
898k
        }
139
282k
      }
140
79.3k
    }
141
26.1k
    else
142
26.1k
    {
143
103k
      for( int k = 0; k < rows; k += 2 )
144
77.0k
      {
145
77.0k
              TCoeff* dstPtr  =  dst;
146
147
77.0k
        const TCoeff* srcPtr0 = &src[ k      * lines];
148
77.0k
        const TCoeff* srcPtr1 = &src[(k + 1) * lines];
149
150
77.0k
        const TMatrixCoeff*  itPtr0 = &it[  k      * trSize];
151
77.0k
        const TMatrixCoeff*  itPtr1 = &it[( k + 1 ) * trSize];
152
153
77.0k
        __m256i vit;
154
155
77.0k
        {
156
#if defined( _MSC_VER ) && _MSC_VER > 1900
157
          __m256i vsrc1 = _mm256_permute4x64_epi64( _mm256_castsi128_si256( _mm_stream_load_si128( ( const __m128i * ) itPtr0 ) ), ( 0 << 0 ) + ( 1 << 4 ) );
158
#else
159
77.0k
          __m256i vsrc1 = _mm256_permute4x64_epi64( _mm256_castsi128_si256( _mm_stream_load_si128( ( __m128i * ) itPtr0 ) ), ( 0 << 0 ) + ( 1 << 4 ) );
160
77.0k
#endif
161
#if defined( _MSC_VER ) && _MSC_VER > 1900
162
          __m256i vsrc2 = _mm256_permute4x64_epi64( _mm256_castsi128_si256( _mm_stream_load_si128( ( const __m128i * ) itPtr1 ) ), ( 0 << 0 ) + ( 1 << 4 ) );
163
#else
164
77.0k
          __m256i vsrc2 = _mm256_permute4x64_epi64( _mm256_castsi128_si256( _mm_stream_load_si128( ( __m128i * ) itPtr1 ) ), ( 0 << 0 ) + ( 1 << 4 ) );
165
77.0k
#endif
166
167
          vit = _mm256_unpacklo_epi16( vsrc1, vsrc2 );
168
        }
169
        
170
268k
        for( int i = 0; i < reducedLines; i += 4, srcPtr0 += maxLoopL, srcPtr1 += maxLoopL )
171
191k
        {
172
191k
          __m128i xscale = maxLoopL == 4
173
191k
                         ? _mm_packs_epi32( _mm_load_si128( ( const __m128i* )srcPtr0 ), _mm_load_si128( ( const __m128i* )srcPtr1 ) )
174
191k
                         : _mm_packs_epi32( _mm_loadu_si64( ( const __m128i* )srcPtr0 ), _mm_loadu_si64( ( const __m128i* )srcPtr1 ) );
175
176
191k
          if( _mm_test_all_zeros( xscale, xscale ) ) { dstPtr += ( trSize * maxLoopL ); continue; }
177
178
157k
          xscale = _mm_shuffle_epi8( xscale, _mm_setr_epi8( 0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15 ) );
179
783k
          for( int l = 0; l < maxLoopL; l++ )
180
626k
          {
181
626k
            __m256i
182
626k
            vscale = _mm256_broadcastd_epi32( xscale );
183
626k
            xscale = _mm_bsrli_si128( xscale, 4 );
184
185
1.25M
            for( int col = 0; col < trSize; col += 8, dstPtr += 8, itPtr0 += 8, itPtr1 += 8 )
186
626k
            {
187
626k
              __m256i
188
626k
              vsrc0 = _mm256_load_si256    ( ( const __m256i * ) dstPtr );
189
626k
              __m256i
190
626k
              vsrc1 = _mm256_madd_epi16    ( vit, vscale );
191
626k
              vsrc0 = _mm256_add_epi32     ( vsrc0, vsrc1 );
192
193
626k
              _mm256_store_si256           ( ( __m256i * ) dstPtr, vsrc0 );
194
626k
            }
195
626k
          }
196
157k
        }
197
77.0k
      }
198
26.1k
    }
199
105k
  }
200
#else
201
0
  if( trSize >= 8 )
202
0
  {
203
0
    for( int k = 0; k < rows; k += 2 )
204
0
    {
205
0
            TCoeff* dstPtr  =  dst;
206
207
      const TCoeff* srcPtr0 = &src[ k      * lines];
208
      const TCoeff* srcPtr1 = &src[(k + 1) * lines];
209
        
210
0
      for( int i = 0; i < reducedLines; i += 4, srcPtr0 += maxLoopL, srcPtr1 += maxLoopL )
211
0
      {
212
0
        __m128i xscale = maxLoopL == 4
213
0
                        ? _mm_packs_epi32( _mm_load_si128( ( const __m128i* )srcPtr0 ), _mm_load_si128( ( const __m128i* )srcPtr1 ) )
214
0
                        : _mm_packs_epi32( _mm_loadu_si64( ( const __m128i* )srcPtr0 ), _mm_loadu_si64( ( const __m128i* )srcPtr1 ) );
215
216
0
        if( _mm_test_all_zeros( xscale, xscale ) ) { dstPtr += ( trSize * maxLoopL ); continue; }
217
218
0
        xscale = _mm_shuffle_epi8( xscale, _mm_setr_epi8( 0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15 ) );
219
0
        for( int l = 0; l < maxLoopL; l++ )
220
0
        {
221
0
          const TMatrixCoeff*  itPtr0 = &it[k         * trSize];
222
0
          const TMatrixCoeff*  itPtr1 = &it[( k + 1 ) * trSize];
223
224
0
          __m128i
225
0
          vscale = _mm_set1_epi32( _mm_cvtsi128_si32( xscale ) );
226
0
          xscale = _mm_bsrli_si128( xscale, 4 );
227
228
0
          for( int col = 0; col < trSize; col += 8, dstPtr += 8, itPtr0 += 8, itPtr1 += 8 )
229
0
          {
230
0
            __m128i vsrc0   = _mm_load_si128       ( ( const __m128i * ) dstPtr );
231
#if defined( _MSC_VER ) && _MSC_VER > 1900
232
            __m128i vit16_0 = _mm_stream_load_si128( ( const __m128i * ) itPtr0 );
233
            __m128i vit16_1 = _mm_stream_load_si128( ( const __m128i * ) itPtr1 );
234
#else
235
0
            __m128i vit16_0 = _mm_stream_load_si128( (       __m128i * ) itPtr0 );
236
0
            __m128i vit16_1 = _mm_stream_load_si128( (       __m128i * ) itPtr1 );
237
0
#endif
238
239
            __m128i vsrc1 = _mm_unpacklo_epi16( vit16_0, vit16_1 );
240
241
            vsrc1 = _mm_madd_epi16 ( vsrc1, vscale );
242
            vsrc0 = _mm_add_epi32  ( vsrc0, vsrc1 );
243
244
            _mm_store_si128        ( ( __m128i * ) dstPtr, vsrc0 );
245
          
246
            vsrc0 = _mm_load_si128 ( ( const __m128i * ) &dstPtr[4] );
247
          
248
            vsrc1 = _mm_unpackhi_epi16( vit16_0, vit16_1 );
249
250
            vsrc1 = _mm_madd_epi16 ( vsrc1, vscale );
251
            vsrc0 = _mm_add_epi32  ( vsrc0, vsrc1 );
252
          
253
0
            _mm_store_si128        ( ( __m128i * ) &dstPtr[4], vsrc0 );
254
0
          }
255
0
        }
256
0
      }
257
0
    }
258
0
  }
259
0
#endif
260
3.40k
  else if( trSize == 4 )
261
3.40k
  {
262
9.36k
    for( int k = 0; k < rows; k += 2 )
263
5.96k
    {
264
5.96k
            TCoeff* dstPtr  =  dst;
265
266
5.96k
      const TCoeff* srcPtr0 = &src[ k      * lines];
267
5.96k
      const TCoeff* srcPtr1 = &src[(k + 1) * lines];
268
269
5.96k
      const TMatrixCoeff*  itPtr0 = &it[  k       * trSize];
270
5.96k
      const TMatrixCoeff*  itPtr1 = &it[( k + 1 ) * trSize];
271
272
5.96k
      __m128i vit = _mm_unpacklo_epi16( _mm_loadu_si64( ( const __m128i * ) itPtr0 ), _mm_loadu_si64( ( const __m128i * ) itPtr1 ) );
273
 
274
23.5k
      for( int i = 0; i < reducedLines; i += 4, srcPtr0 += maxLoopL, srcPtr1 += maxLoopL )
275
17.5k
      {
276
17.5k
        __m128i xscale = maxLoopL == 4
277
17.5k
                        ? _mm_packs_epi32( _mm_load_si128( ( const __m128i* )srcPtr0 ), _mm_load_si128( ( const __m128i* )srcPtr1 ) )
278
17.5k
                        : _mm_packs_epi32( _mm_loadu_si64( ( const __m128i* )srcPtr0 ), _mm_loadu_si64( ( const __m128i* )srcPtr1 ) );
279
280
17.5k
        if( _mm_test_all_zeros( xscale, xscale ) ) { dstPtr += ( trSize * maxLoopL ); continue; }
281
282
14.4k
        xscale = _mm_shuffle_epi8( xscale, _mm_setr_epi8( 0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15 ) );
283
70.7k
        for( int l = 0; l < maxLoopL; l++ )
284
56.3k
        {
285
56.3k
          __m128i
286
56.3k
          vscale = _mm_set1_epi32( _mm_cvtsi128_si32( xscale ) );
287
56.3k
          xscale = _mm_bsrli_si128( xscale, 4 );
288
289
112k
          for( int col = 0; col < trSize; col += 4, dstPtr += 4 )
290
56.3k
          {
291
56.3k
            __m128i
292
56.3k
            vsrc0 = _mm_load_si128 ( ( const __m128i * ) dstPtr );
293
56.3k
            __m128i 
294
56.3k
            vsrc1 = _mm_madd_epi16 ( vit, vscale );
295
56.3k
            vsrc0 = _mm_add_epi32  ( vsrc0, vsrc1 );
296
297
56.3k
            _mm_store_si128        ( ( __m128i * ) dstPtr, vsrc0 );
298
56.3k
          }
299
56.3k
        }
300
14.4k
      }
301
5.96k
    }
302
3.40k
  }
303
1
  else
304
1
  {
305
1
    THROW_FATAL( "Unsupported size" );
306
1
  }
307
#if USE_AVX2
308
309
108k
  _mm256_zeroupper();
310
108k
#endif
311
108k
}
Unexecuted instantiation: void vvdec::fastInv_SSE<(vvdec::x86_simd::X86_VEXT)1, 4>(short const*, int const*, int*, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: void vvdec::fastInv_SSE<(vvdec::x86_simd::X86_VEXT)1, 8>(short const*, int const*, int*, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: void vvdec::fastInv_SSE<(vvdec::x86_simd::X86_VEXT)1, 16>(short const*, int const*, int*, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: void vvdec::fastInv_SSE<(vvdec::x86_simd::X86_VEXT)1, 32>(short const*, int const*, int*, unsigned int, unsigned int, unsigned int)
Unexecuted instantiation: void vvdec::fastInv_SSE<(vvdec::x86_simd::X86_VEXT)1, 64>(short const*, int const*, int*, unsigned int, unsigned int, unsigned int)
void vvdec::fastInv_SSE<(vvdec::x86_simd::X86_VEXT)4, 4>(short const*, int const*, int*, unsigned int, unsigned int, unsigned int)
Line
Count
Source
67
3.40k
{
68
3.40k
  unsigned maxLoopL = std::min<int>( reducedLines, 4 );
69
70
3.40k
#if USE_AVX2
71
3.40k
  if( trSize >= 8 && vext >= AVX2 )
72
0
  {
73
0
    if( ( trSize & 15 ) == 0 )
74
0
    {
75
0
      static constexpr unsigned trLoops = trSize >= 16 ? trSize >> 4 : 1;
76
77
0
      for( int k = 0; k < rows; k += 2 )
78
0
      {
79
0
              TCoeff* dstPtr =  dst;
80
81
0
        const TCoeff* srcPtr0 = &src[ k      * lines];
82
0
        const TCoeff* srcPtr1 = &src[(k + 1) * lines];
83
84
0
        __m256i vsrc1v[trLoops][2];
85
        
86
0
        const TMatrixCoeff*  itPtr0 = &it[ k      * trSize];
87
0
        const TMatrixCoeff*  itPtr1 = &it[(k + 1) * trSize];
88
89
0
        for( int col = 0; col < trLoops; col++, itPtr0 += 16, itPtr1 += 16 )
90
0
        {
91
#if defined( _MSC_VER ) && _MSC_VER > 1900
92
          __m256i vit16_0 = _mm256_permute4x64_epi64( _mm256_stream_load_si256( ( const __m256i * ) itPtr0 ), ( 0 << 0 ) + ( 1 << 4 ) + ( 2 << 2 ) + ( 3 << 6 ) );
93
          __m256i vit16_1 = _mm256_permute4x64_epi64( _mm256_stream_load_si256( ( const __m256i * ) itPtr1 ), ( 0 << 0 ) + ( 1 << 4 ) + ( 2 << 2 ) + ( 3 << 6 ) );
94
#else
95
0
          __m256i vit16_0 = _mm256_permute4x64_epi64( _mm256_stream_load_si256( (       __m256i * ) itPtr0 ), ( 0 << 0 ) + ( 1 << 4 ) + ( 2 << 2 ) + ( 3 << 6 ) );
96
0
          __m256i vit16_1 = _mm256_permute4x64_epi64( _mm256_stream_load_si256( (       __m256i * ) itPtr1 ), ( 0 << 0 ) + ( 1 << 4 ) + ( 2 << 2 ) + ( 3 << 6 ) );
97
0
#endif
98
99
0
          vsrc1v[col][0] = _mm256_unpacklo_epi16( vit16_0, vit16_1 );
100
0
          vsrc1v[col][1] = _mm256_unpackhi_epi16( vit16_0, vit16_1 );
101
0
        }
102
103
0
        for( int i = 0; i < reducedLines; i += 4, srcPtr0 += maxLoopL, srcPtr1 += maxLoopL )
104
0
        {
105
0
          __m128i xscale = maxLoopL == 4
106
0
                         ? _mm_packs_epi32( _mm_load_si128( ( const __m128i* )srcPtr0 ), _mm_load_si128( ( const __m128i* )srcPtr1 ) )
107
0
                         : _mm_packs_epi32( _mm_loadu_si64( ( const __m128i* )srcPtr0 ), _mm_loadu_si64( ( const __m128i* )srcPtr1 ) );
108
109
0
          if( _mm_test_all_zeros( xscale, xscale ) ) { dstPtr += ( trSize * maxLoopL ); continue; }
110
111
0
          xscale = _mm_shuffle_epi8( xscale, _mm_setr_epi8( 0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15 ) );
112
0
          for( int l = 0; l < maxLoopL; l++ )
113
0
          {
114
0
            __m256i
115
0
            vscale = _mm256_broadcastd_epi32( xscale );
116
0
            xscale = _mm_bsrli_si128( xscale, 4 );
117
118
0
            for( int col = 0; col < trLoops; col++, dstPtr += 16 )
119
0
            {
120
0
              __m256i vsrc0 = _mm256_load_si256       ( ( const __m256i * ) dstPtr );
121
122
0
              __m256i
123
0
              vsrc1 = vsrc1v[col][0];
124
0
              vsrc1 = _mm256_madd_epi16    ( vsrc1, vscale );
125
0
              vsrc0 = _mm256_add_epi32     ( vsrc0, vsrc1 );
126
127
0
              _mm256_store_si256           ( ( __m256i * ) dstPtr, vsrc0 );
128
            
129
0
              vsrc0 = _mm256_load_si256    ( ( const __m256i * ) &dstPtr[8] );
130
131
0
              vsrc1 = vsrc1v[col][1];
132
0
              vsrc1 = _mm256_madd_epi16    ( vsrc1, vscale );
133
0
              vsrc0 = _mm256_add_epi32     ( vsrc0, vsrc1 );
134
135
0
              _mm256_store_si256           ( ( __m256i * ) &dstPtr[8], vsrc0 );
136
0
            }
137
0
          }
138
0
        }
139
0
      }
140
0
    }
141
0
    else
142
0
    {
143
0
      for( int k = 0; k < rows; k += 2 )
144
0
      {
145
0
              TCoeff* dstPtr  =  dst;
146
147
0
        const TCoeff* srcPtr0 = &src[ k      * lines];
148
0
        const TCoeff* srcPtr1 = &src[(k + 1) * lines];
149
150
0
        const TMatrixCoeff*  itPtr0 = &it[  k      * trSize];
151
0
        const TMatrixCoeff*  itPtr1 = &it[( k + 1 ) * trSize];
152
153
0
        __m256i vit;
154
155
0
        {
156
#if defined( _MSC_VER ) && _MSC_VER > 1900
157
          __m256i vsrc1 = _mm256_permute4x64_epi64( _mm256_castsi128_si256( _mm_stream_load_si128( ( const __m128i * ) itPtr0 ) ), ( 0 << 0 ) + ( 1 << 4 ) );
158
#else
159
0
          __m256i vsrc1 = _mm256_permute4x64_epi64( _mm256_castsi128_si256( _mm_stream_load_si128( ( __m128i * ) itPtr0 ) ), ( 0 << 0 ) + ( 1 << 4 ) );
160
0
#endif
161
#if defined( _MSC_VER ) && _MSC_VER > 1900
162
          __m256i vsrc2 = _mm256_permute4x64_epi64( _mm256_castsi128_si256( _mm_stream_load_si128( ( const __m128i * ) itPtr1 ) ), ( 0 << 0 ) + ( 1 << 4 ) );
163
#else
164
0
          __m256i vsrc2 = _mm256_permute4x64_epi64( _mm256_castsi128_si256( _mm_stream_load_si128( ( __m128i * ) itPtr1 ) ), ( 0 << 0 ) + ( 1 << 4 ) );
165
0
#endif
166
167
0
          vit = _mm256_unpacklo_epi16( vsrc1, vsrc2 );
168
0
        }
169
        
170
0
        for( int i = 0; i < reducedLines; i += 4, srcPtr0 += maxLoopL, srcPtr1 += maxLoopL )
171
0
        {
172
0
          __m128i xscale = maxLoopL == 4
173
0
                         ? _mm_packs_epi32( _mm_load_si128( ( const __m128i* )srcPtr0 ), _mm_load_si128( ( const __m128i* )srcPtr1 ) )
174
0
                         : _mm_packs_epi32( _mm_loadu_si64( ( const __m128i* )srcPtr0 ), _mm_loadu_si64( ( const __m128i* )srcPtr1 ) );
175
176
0
          if( _mm_test_all_zeros( xscale, xscale ) ) { dstPtr += ( trSize * maxLoopL ); continue; }
177
178
0
          xscale = _mm_shuffle_epi8( xscale, _mm_setr_epi8( 0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15 ) );
179
0
          for( int l = 0; l < maxLoopL; l++ )
180
0
          {
181
0
            __m256i
182
0
            vscale = _mm256_broadcastd_epi32( xscale );
183
0
            xscale = _mm_bsrli_si128( xscale, 4 );
184
185
0
            for( int col = 0; col < trSize; col += 8, dstPtr += 8, itPtr0 += 8, itPtr1 += 8 )
186
0
            {
187
0
              __m256i
188
0
              vsrc0 = _mm256_load_si256    ( ( const __m256i * ) dstPtr );
189
0
              __m256i
190
0
              vsrc1 = _mm256_madd_epi16    ( vit, vscale );
191
0
              vsrc0 = _mm256_add_epi32     ( vsrc0, vsrc1 );
192
193
0
              _mm256_store_si256           ( ( __m256i * ) dstPtr, vsrc0 );
194
0
            }
195
0
          }
196
0
        }
197
0
      }
198
0
    }
199
0
  }
200
#else
201
  if( trSize >= 8 )
202
  {
203
    for( int k = 0; k < rows; k += 2 )
204
    {
205
            TCoeff* dstPtr  =  dst;
206
207
      const TCoeff* srcPtr0 = &src[ k      * lines];
208
      const TCoeff* srcPtr1 = &src[(k + 1) * lines];
209
        
210
      for( int i = 0; i < reducedLines; i += 4, srcPtr0 += maxLoopL, srcPtr1 += maxLoopL )
211
      {
212
        __m128i xscale = maxLoopL == 4
213
                        ? _mm_packs_epi32( _mm_load_si128( ( const __m128i* )srcPtr0 ), _mm_load_si128( ( const __m128i* )srcPtr1 ) )
214
                        : _mm_packs_epi32( _mm_loadu_si64( ( const __m128i* )srcPtr0 ), _mm_loadu_si64( ( const __m128i* )srcPtr1 ) );
215
216
        if( _mm_test_all_zeros( xscale, xscale ) ) { dstPtr += ( trSize * maxLoopL ); continue; }
217
218
        xscale = _mm_shuffle_epi8( xscale, _mm_setr_epi8( 0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15 ) );
219
        for( int l = 0; l < maxLoopL; l++ )
220
        {
221
          const TMatrixCoeff*  itPtr0 = &it[k         * trSize];
222
          const TMatrixCoeff*  itPtr1 = &it[( k + 1 ) * trSize];
223
224
          __m128i
225
          vscale = _mm_set1_epi32( _mm_cvtsi128_si32( xscale ) );
226
          xscale = _mm_bsrli_si128( xscale, 4 );
227
228
          for( int col = 0; col < trSize; col += 8, dstPtr += 8, itPtr0 += 8, itPtr1 += 8 )
229
          {
230
            __m128i vsrc0   = _mm_load_si128       ( ( const __m128i * ) dstPtr );
231
#if defined( _MSC_VER ) && _MSC_VER > 1900
232
            __m128i vit16_0 = _mm_stream_load_si128( ( const __m128i * ) itPtr0 );
233
            __m128i vit16_1 = _mm_stream_load_si128( ( const __m128i * ) itPtr1 );
234
#else
235
            __m128i vit16_0 = _mm_stream_load_si128( (       __m128i * ) itPtr0 );
236
            __m128i vit16_1 = _mm_stream_load_si128( (       __m128i * ) itPtr1 );
237
#endif
238
239
            __m128i vsrc1 = _mm_unpacklo_epi16( vit16_0, vit16_1 );
240
241
            vsrc1 = _mm_madd_epi16 ( vsrc1, vscale );
242
            vsrc0 = _mm_add_epi32  ( vsrc0, vsrc1 );
243
244
            _mm_store_si128        ( ( __m128i * ) dstPtr, vsrc0 );
245
          
246
            vsrc0 = _mm_load_si128 ( ( const __m128i * ) &dstPtr[4] );
247
          
248
            vsrc1 = _mm_unpackhi_epi16( vit16_0, vit16_1 );
249
250
            vsrc1 = _mm_madd_epi16 ( vsrc1, vscale );
251
            vsrc0 = _mm_add_epi32  ( vsrc0, vsrc1 );
252
          
253
            _mm_store_si128        ( ( __m128i * ) &dstPtr[4], vsrc0 );
254
          }
255
        }
256
      }
257
    }
258
  }
259
#endif
260
3.40k
  else if( trSize == 4 )
261
3.40k
  {
262
9.36k
    for( int k = 0; k < rows; k += 2 )
263
5.96k
    {
264
5.96k
            TCoeff* dstPtr  =  dst;
265
266
5.96k
      const TCoeff* srcPtr0 = &src[ k      * lines];
267
5.96k
      const TCoeff* srcPtr1 = &src[(k + 1) * lines];
268
269
5.96k
      const TMatrixCoeff*  itPtr0 = &it[  k       * trSize];
270
5.96k
      const TMatrixCoeff*  itPtr1 = &it[( k + 1 ) * trSize];
271
272
5.96k
      __m128i vit = _mm_unpacklo_epi16( _mm_loadu_si64( ( const __m128i * ) itPtr0 ), _mm_loadu_si64( ( const __m128i * ) itPtr1 ) );
273
 
274
23.5k
      for( int i = 0; i < reducedLines; i += 4, srcPtr0 += maxLoopL, srcPtr1 += maxLoopL )
275
17.5k
      {
276
17.5k
        __m128i xscale = maxLoopL == 4
277
17.5k
                        ? _mm_packs_epi32( _mm_load_si128( ( const __m128i* )srcPtr0 ), _mm_load_si128( ( const __m128i* )srcPtr1 ) )
278
17.5k
                        : _mm_packs_epi32( _mm_loadu_si64( ( const __m128i* )srcPtr0 ), _mm_loadu_si64( ( const __m128i* )srcPtr1 ) );
279
280
17.5k
        if( _mm_test_all_zeros( xscale, xscale ) ) { dstPtr += ( trSize * maxLoopL ); continue; }
281
282
14.4k
        xscale = _mm_shuffle_epi8( xscale, _mm_setr_epi8( 0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15 ) );
283
70.7k
        for( int l = 0; l < maxLoopL; l++ )
284
56.3k
        {
285
56.3k
          __m128i
286
56.3k
          vscale = _mm_set1_epi32( _mm_cvtsi128_si32( xscale ) );
287
56.3k
          xscale = _mm_bsrli_si128( xscale, 4 );
288
289
112k
          for( int col = 0; col < trSize; col += 4, dstPtr += 4 )
290
56.3k
          {
291
56.3k
            __m128i
292
56.3k
            vsrc0 = _mm_load_si128 ( ( const __m128i * ) dstPtr );
293
56.3k
            __m128i 
294
56.3k
            vsrc1 = _mm_madd_epi16 ( vit, vscale );
295
56.3k
            vsrc0 = _mm_add_epi32  ( vsrc0, vsrc1 );
296
297
56.3k
            _mm_store_si128        ( ( __m128i * ) dstPtr, vsrc0 );
298
56.3k
          }
299
56.3k
        }
300
14.4k
      }
301
5.96k
    }
302
3.40k
  }
303
0
  else
304
0
  {
305
0
    THROW_FATAL( "Unsupported size" );
306
0
  }
307
3.40k
#if USE_AVX2
308
309
3.40k
  _mm256_zeroupper();
310
3.40k
#endif
311
3.40k
}
void vvdec::fastInv_SSE<(vvdec::x86_simd::X86_VEXT)4, 8>(short const*, int const*, int*, unsigned int, unsigned int, unsigned int)
Line
Count
Source
67
26.1k
{
68
26.1k
  unsigned maxLoopL = std::min<int>( reducedLines, 4 );
69
70
26.1k
#if USE_AVX2
71
26.1k
  if( trSize >= 8 && vext >= AVX2 )
72
26.1k
  {
73
26.1k
    if( ( trSize & 15 ) == 0 )
74
0
    {
75
0
      static constexpr unsigned trLoops = trSize >= 16 ? trSize >> 4 : 1;
76
77
0
      for( int k = 0; k < rows; k += 2 )
78
0
      {
79
0
              TCoeff* dstPtr =  dst;
80
81
0
        const TCoeff* srcPtr0 = &src[ k      * lines];
82
0
        const TCoeff* srcPtr1 = &src[(k + 1) * lines];
83
84
0
        __m256i vsrc1v[trLoops][2];
85
        
86
0
        const TMatrixCoeff*  itPtr0 = &it[ k      * trSize];
87
0
        const TMatrixCoeff*  itPtr1 = &it[(k + 1) * trSize];
88
89
0
        for( int col = 0; col < trLoops; col++, itPtr0 += 16, itPtr1 += 16 )
90
0
        {
91
#if defined( _MSC_VER ) && _MSC_VER > 1900
92
          __m256i vit16_0 = _mm256_permute4x64_epi64( _mm256_stream_load_si256( ( const __m256i * ) itPtr0 ), ( 0 << 0 ) + ( 1 << 4 ) + ( 2 << 2 ) + ( 3 << 6 ) );
93
          __m256i vit16_1 = _mm256_permute4x64_epi64( _mm256_stream_load_si256( ( const __m256i * ) itPtr1 ), ( 0 << 0 ) + ( 1 << 4 ) + ( 2 << 2 ) + ( 3 << 6 ) );
94
#else
95
0
          __m256i vit16_0 = _mm256_permute4x64_epi64( _mm256_stream_load_si256( (       __m256i * ) itPtr0 ), ( 0 << 0 ) + ( 1 << 4 ) + ( 2 << 2 ) + ( 3 << 6 ) );
96
0
          __m256i vit16_1 = _mm256_permute4x64_epi64( _mm256_stream_load_si256( (       __m256i * ) itPtr1 ), ( 0 << 0 ) + ( 1 << 4 ) + ( 2 << 2 ) + ( 3 << 6 ) );
97
0
#endif
98
99
0
          vsrc1v[col][0] = _mm256_unpacklo_epi16( vit16_0, vit16_1 );
100
0
          vsrc1v[col][1] = _mm256_unpackhi_epi16( vit16_0, vit16_1 );
101
0
        }
102
103
0
        for( int i = 0; i < reducedLines; i += 4, srcPtr0 += maxLoopL, srcPtr1 += maxLoopL )
104
0
        {
105
0
          __m128i xscale = maxLoopL == 4
106
0
                         ? _mm_packs_epi32( _mm_load_si128( ( const __m128i* )srcPtr0 ), _mm_load_si128( ( const __m128i* )srcPtr1 ) )
107
0
                         : _mm_packs_epi32( _mm_loadu_si64( ( const __m128i* )srcPtr0 ), _mm_loadu_si64( ( const __m128i* )srcPtr1 ) );
108
109
0
          if( _mm_test_all_zeros( xscale, xscale ) ) { dstPtr += ( trSize * maxLoopL ); continue; }
110
111
0
          xscale = _mm_shuffle_epi8( xscale, _mm_setr_epi8( 0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15 ) );
112
0
          for( int l = 0; l < maxLoopL; l++ )
113
0
          {
114
0
            __m256i
115
0
            vscale = _mm256_broadcastd_epi32( xscale );
116
0
            xscale = _mm_bsrli_si128( xscale, 4 );
117
118
0
            for( int col = 0; col < trLoops; col++, dstPtr += 16 )
119
0
            {
120
0
              __m256i vsrc0 = _mm256_load_si256       ( ( const __m256i * ) dstPtr );
121
122
0
              __m256i
123
0
              vsrc1 = vsrc1v[col][0];
124
0
              vsrc1 = _mm256_madd_epi16    ( vsrc1, vscale );
125
0
              vsrc0 = _mm256_add_epi32     ( vsrc0, vsrc1 );
126
127
0
              _mm256_store_si256           ( ( __m256i * ) dstPtr, vsrc0 );
128
            
129
0
              vsrc0 = _mm256_load_si256    ( ( const __m256i * ) &dstPtr[8] );
130
131
0
              vsrc1 = vsrc1v[col][1];
132
0
              vsrc1 = _mm256_madd_epi16    ( vsrc1, vscale );
133
0
              vsrc0 = _mm256_add_epi32     ( vsrc0, vsrc1 );
134
135
0
              _mm256_store_si256           ( ( __m256i * ) &dstPtr[8], vsrc0 );
136
0
            }
137
0
          }
138
0
        }
139
0
      }
140
0
    }
141
26.1k
    else
142
26.1k
    {
143
103k
      for( int k = 0; k < rows; k += 2 )
144
77.0k
      {
145
77.0k
              TCoeff* dstPtr  =  dst;
146
147
77.0k
        const TCoeff* srcPtr0 = &src[ k      * lines];
148
77.0k
        const TCoeff* srcPtr1 = &src[(k + 1) * lines];
149
150
77.0k
        const TMatrixCoeff*  itPtr0 = &it[  k      * trSize];
151
77.0k
        const TMatrixCoeff*  itPtr1 = &it[( k + 1 ) * trSize];
152
153
77.0k
        __m256i vit;
154
155
77.0k
        {
156
#if defined( _MSC_VER ) && _MSC_VER > 1900
157
          __m256i vsrc1 = _mm256_permute4x64_epi64( _mm256_castsi128_si256( _mm_stream_load_si128( ( const __m128i * ) itPtr0 ) ), ( 0 << 0 ) + ( 1 << 4 ) );
158
#else
159
77.0k
          __m256i vsrc1 = _mm256_permute4x64_epi64( _mm256_castsi128_si256( _mm_stream_load_si128( ( __m128i * ) itPtr0 ) ), ( 0 << 0 ) + ( 1 << 4 ) );
160
77.0k
#endif
161
#if defined( _MSC_VER ) && _MSC_VER > 1900
162
          __m256i vsrc2 = _mm256_permute4x64_epi64( _mm256_castsi128_si256( _mm_stream_load_si128( ( const __m128i * ) itPtr1 ) ), ( 0 << 0 ) + ( 1 << 4 ) );
163
#else
164
77.0k
          __m256i vsrc2 = _mm256_permute4x64_epi64( _mm256_castsi128_si256( _mm_stream_load_si128( ( __m128i * ) itPtr1 ) ), ( 0 << 0 ) + ( 1 << 4 ) );
165
77.0k
#endif
166
167
77.0k
          vit = _mm256_unpacklo_epi16( vsrc1, vsrc2 );
168
77.0k
        }
169
        
170
268k
        for( int i = 0; i < reducedLines; i += 4, srcPtr0 += maxLoopL, srcPtr1 += maxLoopL )
171
191k
        {
172
191k
          __m128i xscale = maxLoopL == 4
173
191k
                         ? _mm_packs_epi32( _mm_load_si128( ( const __m128i* )srcPtr0 ), _mm_load_si128( ( const __m128i* )srcPtr1 ) )
174
191k
                         : _mm_packs_epi32( _mm_loadu_si64( ( const __m128i* )srcPtr0 ), _mm_loadu_si64( ( const __m128i* )srcPtr1 ) );
175
176
191k
          if( _mm_test_all_zeros( xscale, xscale ) ) { dstPtr += ( trSize * maxLoopL ); continue; }
177
178
157k
          xscale = _mm_shuffle_epi8( xscale, _mm_setr_epi8( 0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15 ) );
179
783k
          for( int l = 0; l < maxLoopL; l++ )
180
626k
          {
181
626k
            __m256i
182
626k
            vscale = _mm256_broadcastd_epi32( xscale );
183
626k
            xscale = _mm_bsrli_si128( xscale, 4 );
184
185
1.25M
            for( int col = 0; col < trSize; col += 8, dstPtr += 8, itPtr0 += 8, itPtr1 += 8 )
186
626k
            {
187
626k
              __m256i
188
626k
              vsrc0 = _mm256_load_si256    ( ( const __m256i * ) dstPtr );
189
626k
              __m256i
190
626k
              vsrc1 = _mm256_madd_epi16    ( vit, vscale );
191
626k
              vsrc0 = _mm256_add_epi32     ( vsrc0, vsrc1 );
192
193
626k
              _mm256_store_si256           ( ( __m256i * ) dstPtr, vsrc0 );
194
626k
            }
195
626k
          }
196
157k
        }
197
77.0k
      }
198
26.1k
    }
199
26.1k
  }
200
#else
201
  if( trSize >= 8 )
202
  {
203
    for( int k = 0; k < rows; k += 2 )
204
    {
205
            TCoeff* dstPtr  =  dst;
206
207
      const TCoeff* srcPtr0 = &src[ k      * lines];
208
      const TCoeff* srcPtr1 = &src[(k + 1) * lines];
209
        
210
      for( int i = 0; i < reducedLines; i += 4, srcPtr0 += maxLoopL, srcPtr1 += maxLoopL )
211
      {
212
        __m128i xscale = maxLoopL == 4
213
                        ? _mm_packs_epi32( _mm_load_si128( ( const __m128i* )srcPtr0 ), _mm_load_si128( ( const __m128i* )srcPtr1 ) )
214
                        : _mm_packs_epi32( _mm_loadu_si64( ( const __m128i* )srcPtr0 ), _mm_loadu_si64( ( const __m128i* )srcPtr1 ) );
215
216
        if( _mm_test_all_zeros( xscale, xscale ) ) { dstPtr += ( trSize * maxLoopL ); continue; }
217
218
        xscale = _mm_shuffle_epi8( xscale, _mm_setr_epi8( 0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15 ) );
219
        for( int l = 0; l < maxLoopL; l++ )
220
        {
221
          const TMatrixCoeff*  itPtr0 = &it[k         * trSize];
222
          const TMatrixCoeff*  itPtr1 = &it[( k + 1 ) * trSize];
223
224
          __m128i
225
          vscale = _mm_set1_epi32( _mm_cvtsi128_si32( xscale ) );
226
          xscale = _mm_bsrli_si128( xscale, 4 );
227
228
          for( int col = 0; col < trSize; col += 8, dstPtr += 8, itPtr0 += 8, itPtr1 += 8 )
229
          {
230
            __m128i vsrc0   = _mm_load_si128       ( ( const __m128i * ) dstPtr );
231
#if defined( _MSC_VER ) && _MSC_VER > 1900
232
            __m128i vit16_0 = _mm_stream_load_si128( ( const __m128i * ) itPtr0 );
233
            __m128i vit16_1 = _mm_stream_load_si128( ( const __m128i * ) itPtr1 );
234
#else
235
            __m128i vit16_0 = _mm_stream_load_si128( (       __m128i * ) itPtr0 );
236
            __m128i vit16_1 = _mm_stream_load_si128( (       __m128i * ) itPtr1 );
237
#endif
238
239
            __m128i vsrc1 = _mm_unpacklo_epi16( vit16_0, vit16_1 );
240
241
            vsrc1 = _mm_madd_epi16 ( vsrc1, vscale );
242
            vsrc0 = _mm_add_epi32  ( vsrc0, vsrc1 );
243
244
            _mm_store_si128        ( ( __m128i * ) dstPtr, vsrc0 );
245
          
246
            vsrc0 = _mm_load_si128 ( ( const __m128i * ) &dstPtr[4] );
247
          
248
            vsrc1 = _mm_unpackhi_epi16( vit16_0, vit16_1 );
249
250
            vsrc1 = _mm_madd_epi16 ( vsrc1, vscale );
251
            vsrc0 = _mm_add_epi32  ( vsrc0, vsrc1 );
252
          
253
            _mm_store_si128        ( ( __m128i * ) &dstPtr[4], vsrc0 );
254
          }
255
        }
256
      }
257
    }
258
  }
259
#endif
260
1
  else if( trSize == 4 )
261
0
  {
262
0
    for( int k = 0; k < rows; k += 2 )
263
0
    {
264
0
            TCoeff* dstPtr  =  dst;
265
266
0
      const TCoeff* srcPtr0 = &src[ k      * lines];
267
0
      const TCoeff* srcPtr1 = &src[(k + 1) * lines];
268
269
0
      const TMatrixCoeff*  itPtr0 = &it[  k       * trSize];
270
0
      const TMatrixCoeff*  itPtr1 = &it[( k + 1 ) * trSize];
271
272
0
      __m128i vit = _mm_unpacklo_epi16( _mm_loadu_si64( ( const __m128i * ) itPtr0 ), _mm_loadu_si64( ( const __m128i * ) itPtr1 ) );
273
 
274
0
      for( int i = 0; i < reducedLines; i += 4, srcPtr0 += maxLoopL, srcPtr1 += maxLoopL )
275
0
      {
276
0
        __m128i xscale = maxLoopL == 4
277
0
                        ? _mm_packs_epi32( _mm_load_si128( ( const __m128i* )srcPtr0 ), _mm_load_si128( ( const __m128i* )srcPtr1 ) )
278
0
                        : _mm_packs_epi32( _mm_loadu_si64( ( const __m128i* )srcPtr0 ), _mm_loadu_si64( ( const __m128i* )srcPtr1 ) );
279
280
0
        if( _mm_test_all_zeros( xscale, xscale ) ) { dstPtr += ( trSize * maxLoopL ); continue; }
281
282
0
        xscale = _mm_shuffle_epi8( xscale, _mm_setr_epi8( 0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15 ) );
283
0
        for( int l = 0; l < maxLoopL; l++ )
284
0
        {
285
0
          __m128i
286
0
          vscale = _mm_set1_epi32( _mm_cvtsi128_si32( xscale ) );
287
0
          xscale = _mm_bsrli_si128( xscale, 4 );
288
289
0
          for( int col = 0; col < trSize; col += 4, dstPtr += 4 )
290
0
          {
291
0
            __m128i
292
0
            vsrc0 = _mm_load_si128 ( ( const __m128i * ) dstPtr );
293
0
            __m128i 
294
0
            vsrc1 = _mm_madd_epi16 ( vit, vscale );
295
0
            vsrc0 = _mm_add_epi32  ( vsrc0, vsrc1 );
296
297
0
            _mm_store_si128        ( ( __m128i * ) dstPtr, vsrc0 );
298
0
          }
299
0
        }
300
0
      }
301
0
    }
302
0
  }
303
1
  else
304
1
  {
305
1
    THROW_FATAL( "Unsupported size" );
306
1
  }
307
26.1k
#if USE_AVX2
308
309
26.1k
  _mm256_zeroupper();
310
26.1k
#endif
311
26.1k
}
void vvdec::fastInv_SSE<(vvdec::x86_simd::X86_VEXT)4, 16>(short const*, int const*, int*, unsigned int, unsigned int, unsigned int)
Line
Count
Source
67
30.6k
{
68
30.6k
  unsigned maxLoopL = std::min<int>( reducedLines, 4 );
69
70
30.6k
#if USE_AVX2
71
30.6k
  if( trSize >= 8 && vext >= AVX2 )
72
30.6k
  {
73
30.6k
    if( ( trSize & 15 ) == 0 )
74
30.6k
    {
75
30.6k
      static constexpr unsigned trLoops = trSize >= 16 ? trSize >> 4 : 1;
76
77
127k
      for( int k = 0; k < rows; k += 2 )
78
96.6k
      {
79
96.6k
              TCoeff* dstPtr =  dst;
80
81
96.6k
        const TCoeff* srcPtr0 = &src[ k      * lines];
82
96.6k
        const TCoeff* srcPtr1 = &src[(k + 1) * lines];
83
84
96.6k
        __m256i vsrc1v[trLoops][2];
85
        
86
96.6k
        const TMatrixCoeff*  itPtr0 = &it[ k      * trSize];
87
96.6k
        const TMatrixCoeff*  itPtr1 = &it[(k + 1) * trSize];
88
89
193k
        for( int col = 0; col < trLoops; col++, itPtr0 += 16, itPtr1 += 16 )
90
96.6k
        {
91
#if defined( _MSC_VER ) && _MSC_VER > 1900
92
          __m256i vit16_0 = _mm256_permute4x64_epi64( _mm256_stream_load_si256( ( const __m256i * ) itPtr0 ), ( 0 << 0 ) + ( 1 << 4 ) + ( 2 << 2 ) + ( 3 << 6 ) );
93
          __m256i vit16_1 = _mm256_permute4x64_epi64( _mm256_stream_load_si256( ( const __m256i * ) itPtr1 ), ( 0 << 0 ) + ( 1 << 4 ) + ( 2 << 2 ) + ( 3 << 6 ) );
94
#else
95
96.6k
          __m256i vit16_0 = _mm256_permute4x64_epi64( _mm256_stream_load_si256( (       __m256i * ) itPtr0 ), ( 0 << 0 ) + ( 1 << 4 ) + ( 2 << 2 ) + ( 3 << 6 ) );
96
96.6k
          __m256i vit16_1 = _mm256_permute4x64_epi64( _mm256_stream_load_si256( (       __m256i * ) itPtr1 ), ( 0 << 0 ) + ( 1 << 4 ) + ( 2 << 2 ) + ( 3 << 6 ) );
97
96.6k
#endif
98
99
96.6k
          vsrc1v[col][0] = _mm256_unpacklo_epi16( vit16_0, vit16_1 );
100
96.6k
          vsrc1v[col][1] = _mm256_unpackhi_epi16( vit16_0, vit16_1 );
101
96.6k
        }
102
103
380k
        for( int i = 0; i < reducedLines; i += 4, srcPtr0 += maxLoopL, srcPtr1 += maxLoopL )
104
284k
        {
105
284k
          __m128i xscale = maxLoopL == 4
106
284k
                         ? _mm_packs_epi32( _mm_load_si128( ( const __m128i* )srcPtr0 ), _mm_load_si128( ( const __m128i* )srcPtr1 ) )
107
284k
                         : _mm_packs_epi32( _mm_loadu_si64( ( const __m128i* )srcPtr0 ), _mm_loadu_si64( ( const __m128i* )srcPtr1 ) );
108
109
284k
          if( _mm_test_all_zeros( xscale, xscale ) ) { dstPtr += ( trSize * maxLoopL ); continue; }
110
111
235k
          xscale = _mm_shuffle_epi8( xscale, _mm_setr_epi8( 0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15 ) );
112
1.17M
          for( int l = 0; l < maxLoopL; l++ )
113
935k
          {
114
935k
            __m256i
115
935k
            vscale = _mm256_broadcastd_epi32( xscale );
116
935k
            xscale = _mm_bsrli_si128( xscale, 4 );
117
118
1.87M
            for( int col = 0; col < trLoops; col++, dstPtr += 16 )
119
935k
            {
120
935k
              __m256i vsrc0 = _mm256_load_si256       ( ( const __m256i * ) dstPtr );
121
122
935k
              __m256i
123
935k
              vsrc1 = vsrc1v[col][0];
124
935k
              vsrc1 = _mm256_madd_epi16    ( vsrc1, vscale );
125
935k
              vsrc0 = _mm256_add_epi32     ( vsrc0, vsrc1 );
126
127
935k
              _mm256_store_si256           ( ( __m256i * ) dstPtr, vsrc0 );
128
            
129
935k
              vsrc0 = _mm256_load_si256    ( ( const __m256i * ) &dstPtr[8] );
130
131
935k
              vsrc1 = vsrc1v[col][1];
132
935k
              vsrc1 = _mm256_madd_epi16    ( vsrc1, vscale );
133
935k
              vsrc0 = _mm256_add_epi32     ( vsrc0, vsrc1 );
134
135
935k
              _mm256_store_si256           ( ( __m256i * ) &dstPtr[8], vsrc0 );
136
935k
            }
137
935k
          }
138
235k
        }
139
96.6k
      }
140
30.6k
    }
141
0
    else
142
0
    {
143
0
      for( int k = 0; k < rows; k += 2 )
144
0
      {
145
0
              TCoeff* dstPtr  =  dst;
146
147
0
        const TCoeff* srcPtr0 = &src[ k      * lines];
148
0
        const TCoeff* srcPtr1 = &src[(k + 1) * lines];
149
150
0
        const TMatrixCoeff*  itPtr0 = &it[  k      * trSize];
151
0
        const TMatrixCoeff*  itPtr1 = &it[( k + 1 ) * trSize];
152
153
0
        __m256i vit;
154
155
0
        {
156
#if defined( _MSC_VER ) && _MSC_VER > 1900
157
          __m256i vsrc1 = _mm256_permute4x64_epi64( _mm256_castsi128_si256( _mm_stream_load_si128( ( const __m128i * ) itPtr0 ) ), ( 0 << 0 ) + ( 1 << 4 ) );
158
#else
159
0
          __m256i vsrc1 = _mm256_permute4x64_epi64( _mm256_castsi128_si256( _mm_stream_load_si128( ( __m128i * ) itPtr0 ) ), ( 0 << 0 ) + ( 1 << 4 ) );
160
0
#endif
161
#if defined( _MSC_VER ) && _MSC_VER > 1900
162
          __m256i vsrc2 = _mm256_permute4x64_epi64( _mm256_castsi128_si256( _mm_stream_load_si128( ( const __m128i * ) itPtr1 ) ), ( 0 << 0 ) + ( 1 << 4 ) );
163
#else
164
0
          __m256i vsrc2 = _mm256_permute4x64_epi64( _mm256_castsi128_si256( _mm_stream_load_si128( ( __m128i * ) itPtr1 ) ), ( 0 << 0 ) + ( 1 << 4 ) );
165
0
#endif
166
167
0
          vit = _mm256_unpacklo_epi16( vsrc1, vsrc2 );
168
0
        }
169
        
170
0
        for( int i = 0; i < reducedLines; i += 4, srcPtr0 += maxLoopL, srcPtr1 += maxLoopL )
171
0
        {
172
0
          __m128i xscale = maxLoopL == 4
173
0
                         ? _mm_packs_epi32( _mm_load_si128( ( const __m128i* )srcPtr0 ), _mm_load_si128( ( const __m128i* )srcPtr1 ) )
174
0
                         : _mm_packs_epi32( _mm_loadu_si64( ( const __m128i* )srcPtr0 ), _mm_loadu_si64( ( const __m128i* )srcPtr1 ) );
175
176
0
          if( _mm_test_all_zeros( xscale, xscale ) ) { dstPtr += ( trSize * maxLoopL ); continue; }
177
178
0
          xscale = _mm_shuffle_epi8( xscale, _mm_setr_epi8( 0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15 ) );
179
0
          for( int l = 0; l < maxLoopL; l++ )
180
0
          {
181
0
            __m256i
182
0
            vscale = _mm256_broadcastd_epi32( xscale );
183
0
            xscale = _mm_bsrli_si128( xscale, 4 );
184
185
0
            for( int col = 0; col < trSize; col += 8, dstPtr += 8, itPtr0 += 8, itPtr1 += 8 )
186
0
            {
187
0
              __m256i
188
0
              vsrc0 = _mm256_load_si256    ( ( const __m256i * ) dstPtr );
189
0
              __m256i
190
0
              vsrc1 = _mm256_madd_epi16    ( vit, vscale );
191
0
              vsrc0 = _mm256_add_epi32     ( vsrc0, vsrc1 );
192
193
0
              _mm256_store_si256           ( ( __m256i * ) dstPtr, vsrc0 );
194
0
            }
195
0
          }
196
0
        }
197
0
      }
198
0
    }
199
30.6k
  }
200
#else
201
  if( trSize >= 8 )
202
  {
203
    for( int k = 0; k < rows; k += 2 )
204
    {
205
            TCoeff* dstPtr  =  dst;
206
207
      const TCoeff* srcPtr0 = &src[ k      * lines];
208
      const TCoeff* srcPtr1 = &src[(k + 1) * lines];
209
        
210
      for( int i = 0; i < reducedLines; i += 4, srcPtr0 += maxLoopL, srcPtr1 += maxLoopL )
211
      {
212
        __m128i xscale = maxLoopL == 4
213
                        ? _mm_packs_epi32( _mm_load_si128( ( const __m128i* )srcPtr0 ), _mm_load_si128( ( const __m128i* )srcPtr1 ) )
214
                        : _mm_packs_epi32( _mm_loadu_si64( ( const __m128i* )srcPtr0 ), _mm_loadu_si64( ( const __m128i* )srcPtr1 ) );
215
216
        if( _mm_test_all_zeros( xscale, xscale ) ) { dstPtr += ( trSize * maxLoopL ); continue; }
217
218
        xscale = _mm_shuffle_epi8( xscale, _mm_setr_epi8( 0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15 ) );
219
        for( int l = 0; l < maxLoopL; l++ )
220
        {
221
          const TMatrixCoeff*  itPtr0 = &it[k         * trSize];
222
          const TMatrixCoeff*  itPtr1 = &it[( k + 1 ) * trSize];
223
224
          __m128i
225
          vscale = _mm_set1_epi32( _mm_cvtsi128_si32( xscale ) );
226
          xscale = _mm_bsrli_si128( xscale, 4 );
227
228
          for( int col = 0; col < trSize; col += 8, dstPtr += 8, itPtr0 += 8, itPtr1 += 8 )
229
          {
230
            __m128i vsrc0   = _mm_load_si128       ( ( const __m128i * ) dstPtr );
231
#if defined( _MSC_VER ) && _MSC_VER > 1900
232
            __m128i vit16_0 = _mm_stream_load_si128( ( const __m128i * ) itPtr0 );
233
            __m128i vit16_1 = _mm_stream_load_si128( ( const __m128i * ) itPtr1 );
234
#else
235
            __m128i vit16_0 = _mm_stream_load_si128( (       __m128i * ) itPtr0 );
236
            __m128i vit16_1 = _mm_stream_load_si128( (       __m128i * ) itPtr1 );
237
#endif
238
239
            __m128i vsrc1 = _mm_unpacklo_epi16( vit16_0, vit16_1 );
240
241
            vsrc1 = _mm_madd_epi16 ( vsrc1, vscale );
242
            vsrc0 = _mm_add_epi32  ( vsrc0, vsrc1 );
243
244
            _mm_store_si128        ( ( __m128i * ) dstPtr, vsrc0 );
245
          
246
            vsrc0 = _mm_load_si128 ( ( const __m128i * ) &dstPtr[4] );
247
          
248
            vsrc1 = _mm_unpackhi_epi16( vit16_0, vit16_1 );
249
250
            vsrc1 = _mm_madd_epi16 ( vsrc1, vscale );
251
            vsrc0 = _mm_add_epi32  ( vsrc0, vsrc1 );
252
          
253
            _mm_store_si128        ( ( __m128i * ) &dstPtr[4], vsrc0 );
254
          }
255
        }
256
      }
257
    }
258
  }
259
#endif
260
0
  else if( trSize == 4 )
261
0
  {
262
0
    for( int k = 0; k < rows; k += 2 )
263
0
    {
264
0
            TCoeff* dstPtr  =  dst;
265
266
0
      const TCoeff* srcPtr0 = &src[ k      * lines];
267
0
      const TCoeff* srcPtr1 = &src[(k + 1) * lines];
268
269
0
      const TMatrixCoeff*  itPtr0 = &it[  k       * trSize];
270
0
      const TMatrixCoeff*  itPtr1 = &it[( k + 1 ) * trSize];
271
272
0
      __m128i vit = _mm_unpacklo_epi16( _mm_loadu_si64( ( const __m128i * ) itPtr0 ), _mm_loadu_si64( ( const __m128i * ) itPtr1 ) );
273
 
274
0
      for( int i = 0; i < reducedLines; i += 4, srcPtr0 += maxLoopL, srcPtr1 += maxLoopL )
275
0
      {
276
0
        __m128i xscale = maxLoopL == 4
277
0
                        ? _mm_packs_epi32( _mm_load_si128( ( const __m128i* )srcPtr0 ), _mm_load_si128( ( const __m128i* )srcPtr1 ) )
278
0
                        : _mm_packs_epi32( _mm_loadu_si64( ( const __m128i* )srcPtr0 ), _mm_loadu_si64( ( const __m128i* )srcPtr1 ) );
279
280
0
        if( _mm_test_all_zeros( xscale, xscale ) ) { dstPtr += ( trSize * maxLoopL ); continue; }
281
282
0
        xscale = _mm_shuffle_epi8( xscale, _mm_setr_epi8( 0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15 ) );
283
0
        for( int l = 0; l < maxLoopL; l++ )
284
0
        {
285
0
          __m128i
286
0
          vscale = _mm_set1_epi32( _mm_cvtsi128_si32( xscale ) );
287
0
          xscale = _mm_bsrli_si128( xscale, 4 );
288
289
0
          for( int col = 0; col < trSize; col += 4, dstPtr += 4 )
290
0
          {
291
0
            __m128i
292
0
            vsrc0 = _mm_load_si128 ( ( const __m128i * ) dstPtr );
293
0
            __m128i 
294
0
            vsrc1 = _mm_madd_epi16 ( vit, vscale );
295
0
            vsrc0 = _mm_add_epi32  ( vsrc0, vsrc1 );
296
297
0
            _mm_store_si128        ( ( __m128i * ) dstPtr, vsrc0 );
298
0
          }
299
0
        }
300
0
      }
301
0
    }
302
0
  }
303
0
  else
304
0
  {
305
0
    THROW_FATAL( "Unsupported size" );
306
0
  }
307
30.6k
#if USE_AVX2
308
309
30.6k
  _mm256_zeroupper();
310
30.6k
#endif
311
30.6k
}
void vvdec::fastInv_SSE<(vvdec::x86_simd::X86_VEXT)4, 32>(short const*, int const*, int*, unsigned int, unsigned int, unsigned int)
Line
Count
Source
67
41.1k
{
68
41.1k
  unsigned maxLoopL = std::min<int>( reducedLines, 4 );
69
70
41.1k
#if USE_AVX2
71
41.1k
  if( trSize >= 8 && vext >= AVX2 )
72
41.1k
  {
73
41.1k
    if( ( trSize & 15 ) == 0 )
74
41.1k
    {
75
41.1k
      static constexpr unsigned trLoops = trSize >= 16 ? trSize >> 4 : 1;
76
77
198k
      for( int k = 0; k < rows; k += 2 )
78
157k
      {
79
157k
              TCoeff* dstPtr =  dst;
80
81
157k
        const TCoeff* srcPtr0 = &src[ k      * lines];
82
157k
        const TCoeff* srcPtr1 = &src[(k + 1) * lines];
83
84
157k
        __m256i vsrc1v[trLoops][2];
85
        
86
157k
        const TMatrixCoeff*  itPtr0 = &it[ k      * trSize];
87
157k
        const TMatrixCoeff*  itPtr1 = &it[(k + 1) * trSize];
88
89
471k
        for( int col = 0; col < trLoops; col++, itPtr0 += 16, itPtr1 += 16 )
90
314k
        {
91
#if defined( _MSC_VER ) && _MSC_VER > 1900
92
          __m256i vit16_0 = _mm256_permute4x64_epi64( _mm256_stream_load_si256( ( const __m256i * ) itPtr0 ), ( 0 << 0 ) + ( 1 << 4 ) + ( 2 << 2 ) + ( 3 << 6 ) );
93
          __m256i vit16_1 = _mm256_permute4x64_epi64( _mm256_stream_load_si256( ( const __m256i * ) itPtr1 ), ( 0 << 0 ) + ( 1 << 4 ) + ( 2 << 2 ) + ( 3 << 6 ) );
94
#else
95
314k
          __m256i vit16_0 = _mm256_permute4x64_epi64( _mm256_stream_load_si256( (       __m256i * ) itPtr0 ), ( 0 << 0 ) + ( 1 << 4 ) + ( 2 << 2 ) + ( 3 << 6 ) );
96
314k
          __m256i vit16_1 = _mm256_permute4x64_epi64( _mm256_stream_load_si256( (       __m256i * ) itPtr1 ), ( 0 << 0 ) + ( 1 << 4 ) + ( 2 << 2 ) + ( 3 << 6 ) );
97
314k
#endif
98
99
314k
          vsrc1v[col][0] = _mm256_unpacklo_epi16( vit16_0, vit16_1 );
100
314k
          vsrc1v[col][1] = _mm256_unpackhi_epi16( vit16_0, vit16_1 );
101
314k
        }
102
103
697k
        for( int i = 0; i < reducedLines; i += 4, srcPtr0 += maxLoopL, srcPtr1 += maxLoopL )
104
540k
        {
105
540k
          __m128i xscale = maxLoopL == 4
106
540k
                         ? _mm_packs_epi32( _mm_load_si128( ( const __m128i* )srcPtr0 ), _mm_load_si128( ( const __m128i* )srcPtr1 ) )
107
540k
                         : _mm_packs_epi32( _mm_loadu_si64( ( const __m128i* )srcPtr0 ), _mm_loadu_si64( ( const __m128i* )srcPtr1 ) );
108
109
540k
          if( _mm_test_all_zeros( xscale, xscale ) ) { dstPtr += ( trSize * maxLoopL ); continue; }
110
111
450k
          xscale = _mm_shuffle_epi8( xscale, _mm_setr_epi8( 0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15 ) );
112
2.24M
          for( int l = 0; l < maxLoopL; l++ )
113
1.79M
          {
114
1.79M
            __m256i
115
1.79M
            vscale = _mm256_broadcastd_epi32( xscale );
116
1.79M
            xscale = _mm_bsrli_si128( xscale, 4 );
117
118
5.38M
            for( int col = 0; col < trLoops; col++, dstPtr += 16 )
119
3.58M
            {
120
3.58M
              __m256i vsrc0 = _mm256_load_si256       ( ( const __m256i * ) dstPtr );
121
122
3.58M
              __m256i
123
3.58M
              vsrc1 = vsrc1v[col][0];
124
3.58M
              vsrc1 = _mm256_madd_epi16    ( vsrc1, vscale );
125
3.58M
              vsrc0 = _mm256_add_epi32     ( vsrc0, vsrc1 );
126
127
3.58M
              _mm256_store_si256           ( ( __m256i * ) dstPtr, vsrc0 );
128
            
129
3.58M
              vsrc0 = _mm256_load_si256    ( ( const __m256i * ) &dstPtr[8] );
130
131
3.58M
              vsrc1 = vsrc1v[col][1];
132
3.58M
              vsrc1 = _mm256_madd_epi16    ( vsrc1, vscale );
133
3.58M
              vsrc0 = _mm256_add_epi32     ( vsrc0, vsrc1 );
134
135
3.58M
              _mm256_store_si256           ( ( __m256i * ) &dstPtr[8], vsrc0 );
136
3.58M
            }
137
1.79M
          }
138
450k
        }
139
157k
      }
140
41.1k
    }
141
0
    else
142
0
    {
143
0
      for( int k = 0; k < rows; k += 2 )
144
0
      {
145
0
              TCoeff* dstPtr  =  dst;
146
147
0
        const TCoeff* srcPtr0 = &src[ k      * lines];
148
0
        const TCoeff* srcPtr1 = &src[(k + 1) * lines];
149
150
0
        const TMatrixCoeff*  itPtr0 = &it[  k      * trSize];
151
0
        const TMatrixCoeff*  itPtr1 = &it[( k + 1 ) * trSize];
152
153
0
        __m256i vit;
154
155
0
        {
156
#if defined( _MSC_VER ) && _MSC_VER > 1900
157
          __m256i vsrc1 = _mm256_permute4x64_epi64( _mm256_castsi128_si256( _mm_stream_load_si128( ( const __m128i * ) itPtr0 ) ), ( 0 << 0 ) + ( 1 << 4 ) );
158
#else
159
0
          __m256i vsrc1 = _mm256_permute4x64_epi64( _mm256_castsi128_si256( _mm_stream_load_si128( ( __m128i * ) itPtr0 ) ), ( 0 << 0 ) + ( 1 << 4 ) );
160
0
#endif
161
#if defined( _MSC_VER ) && _MSC_VER > 1900
162
          __m256i vsrc2 = _mm256_permute4x64_epi64( _mm256_castsi128_si256( _mm_stream_load_si128( ( const __m128i * ) itPtr1 ) ), ( 0 << 0 ) + ( 1 << 4 ) );
163
#else
164
0
          __m256i vsrc2 = _mm256_permute4x64_epi64( _mm256_castsi128_si256( _mm_stream_load_si128( ( __m128i * ) itPtr1 ) ), ( 0 << 0 ) + ( 1 << 4 ) );
165
0
#endif
166
167
0
          vit = _mm256_unpacklo_epi16( vsrc1, vsrc2 );
168
0
        }
169
        
170
0
        for( int i = 0; i < reducedLines; i += 4, srcPtr0 += maxLoopL, srcPtr1 += maxLoopL )
171
0
        {
172
0
          __m128i xscale = maxLoopL == 4
173
0
                         ? _mm_packs_epi32( _mm_load_si128( ( const __m128i* )srcPtr0 ), _mm_load_si128( ( const __m128i* )srcPtr1 ) )
174
0
                         : _mm_packs_epi32( _mm_loadu_si64( ( const __m128i* )srcPtr0 ), _mm_loadu_si64( ( const __m128i* )srcPtr1 ) );
175
176
0
          if( _mm_test_all_zeros( xscale, xscale ) ) { dstPtr += ( trSize * maxLoopL ); continue; }
177
178
0
          xscale = _mm_shuffle_epi8( xscale, _mm_setr_epi8( 0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15 ) );
179
0
          for( int l = 0; l < maxLoopL; l++ )
180
0
          {
181
0
            __m256i
182
0
            vscale = _mm256_broadcastd_epi32( xscale );
183
0
            xscale = _mm_bsrli_si128( xscale, 4 );
184
185
0
            for( int col = 0; col < trSize; col += 8, dstPtr += 8, itPtr0 += 8, itPtr1 += 8 )
186
0
            {
187
0
              __m256i
188
0
              vsrc0 = _mm256_load_si256    ( ( const __m256i * ) dstPtr );
189
0
              __m256i
190
0
              vsrc1 = _mm256_madd_epi16    ( vit, vscale );
191
0
              vsrc0 = _mm256_add_epi32     ( vsrc0, vsrc1 );
192
193
0
              _mm256_store_si256           ( ( __m256i * ) dstPtr, vsrc0 );
194
0
            }
195
0
          }
196
0
        }
197
0
      }
198
0
    }
199
41.1k
  }
200
#else
201
  if( trSize >= 8 )
202
  {
203
    for( int k = 0; k < rows; k += 2 )
204
    {
205
            TCoeff* dstPtr  =  dst;
206
207
      const TCoeff* srcPtr0 = &src[ k      * lines];
208
      const TCoeff* srcPtr1 = &src[(k + 1) * lines];
209
        
210
      for( int i = 0; i < reducedLines; i += 4, srcPtr0 += maxLoopL, srcPtr1 += maxLoopL )
211
      {
212
        __m128i xscale = maxLoopL == 4
213
                        ? _mm_packs_epi32( _mm_load_si128( ( const __m128i* )srcPtr0 ), _mm_load_si128( ( const __m128i* )srcPtr1 ) )
214
                        : _mm_packs_epi32( _mm_loadu_si64( ( const __m128i* )srcPtr0 ), _mm_loadu_si64( ( const __m128i* )srcPtr1 ) );
215
216
        if( _mm_test_all_zeros( xscale, xscale ) ) { dstPtr += ( trSize * maxLoopL ); continue; }
217
218
        xscale = _mm_shuffle_epi8( xscale, _mm_setr_epi8( 0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15 ) );
219
        for( int l = 0; l < maxLoopL; l++ )
220
        {
221
          const TMatrixCoeff*  itPtr0 = &it[k         * trSize];
222
          const TMatrixCoeff*  itPtr1 = &it[( k + 1 ) * trSize];
223
224
          __m128i
225
          vscale = _mm_set1_epi32( _mm_cvtsi128_si32( xscale ) );
226
          xscale = _mm_bsrli_si128( xscale, 4 );
227
228
          for( int col = 0; col < trSize; col += 8, dstPtr += 8, itPtr0 += 8, itPtr1 += 8 )
229
          {
230
            __m128i vsrc0   = _mm_load_si128       ( ( const __m128i * ) dstPtr );
231
#if defined( _MSC_VER ) && _MSC_VER > 1900
232
            __m128i vit16_0 = _mm_stream_load_si128( ( const __m128i * ) itPtr0 );
233
            __m128i vit16_1 = _mm_stream_load_si128( ( const __m128i * ) itPtr1 );
234
#else
235
            __m128i vit16_0 = _mm_stream_load_si128( (       __m128i * ) itPtr0 );
236
            __m128i vit16_1 = _mm_stream_load_si128( (       __m128i * ) itPtr1 );
237
#endif
238
239
            __m128i vsrc1 = _mm_unpacklo_epi16( vit16_0, vit16_1 );
240
241
            vsrc1 = _mm_madd_epi16 ( vsrc1, vscale );
242
            vsrc0 = _mm_add_epi32  ( vsrc0, vsrc1 );
243
244
            _mm_store_si128        ( ( __m128i * ) dstPtr, vsrc0 );
245
          
246
            vsrc0 = _mm_load_si128 ( ( const __m128i * ) &dstPtr[4] );
247
          
248
            vsrc1 = _mm_unpackhi_epi16( vit16_0, vit16_1 );
249
250
            vsrc1 = _mm_madd_epi16 ( vsrc1, vscale );
251
            vsrc0 = _mm_add_epi32  ( vsrc0, vsrc1 );
252
          
253
            _mm_store_si128        ( ( __m128i * ) &dstPtr[4], vsrc0 );
254
          }
255
        }
256
      }
257
    }
258
  }
259
#endif
260
0
  else if( trSize == 4 )
261
0
  {
262
0
    for( int k = 0; k < rows; k += 2 )
263
0
    {
264
0
            TCoeff* dstPtr  =  dst;
265
266
0
      const TCoeff* srcPtr0 = &src[ k      * lines];
267
0
      const TCoeff* srcPtr1 = &src[(k + 1) * lines];
268
269
0
      const TMatrixCoeff*  itPtr0 = &it[  k       * trSize];
270
0
      const TMatrixCoeff*  itPtr1 = &it[( k + 1 ) * trSize];
271
272
0
      __m128i vit = _mm_unpacklo_epi16( _mm_loadu_si64( ( const __m128i * ) itPtr0 ), _mm_loadu_si64( ( const __m128i * ) itPtr1 ) );
273
 
274
0
      for( int i = 0; i < reducedLines; i += 4, srcPtr0 += maxLoopL, srcPtr1 += maxLoopL )
275
0
      {
276
0
        __m128i xscale = maxLoopL == 4
277
0
                        ? _mm_packs_epi32( _mm_load_si128( ( const __m128i* )srcPtr0 ), _mm_load_si128( ( const __m128i* )srcPtr1 ) )
278
0
                        : _mm_packs_epi32( _mm_loadu_si64( ( const __m128i* )srcPtr0 ), _mm_loadu_si64( ( const __m128i* )srcPtr1 ) );
279
280
0
        if( _mm_test_all_zeros( xscale, xscale ) ) { dstPtr += ( trSize * maxLoopL ); continue; }
281
282
0
        xscale = _mm_shuffle_epi8( xscale, _mm_setr_epi8( 0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15 ) );
283
0
        for( int l = 0; l < maxLoopL; l++ )
284
0
        {
285
0
          __m128i
286
0
          vscale = _mm_set1_epi32( _mm_cvtsi128_si32( xscale ) );
287
0
          xscale = _mm_bsrli_si128( xscale, 4 );
288
289
0
          for( int col = 0; col < trSize; col += 4, dstPtr += 4 )
290
0
          {
291
0
            __m128i
292
0
            vsrc0 = _mm_load_si128 ( ( const __m128i * ) dstPtr );
293
0
            __m128i 
294
0
            vsrc1 = _mm_madd_epi16 ( vit, vscale );
295
0
            vsrc0 = _mm_add_epi32  ( vsrc0, vsrc1 );
296
297
0
            _mm_store_si128        ( ( __m128i * ) dstPtr, vsrc0 );
298
0
          }
299
0
        }
300
0
      }
301
0
    }
302
0
  }
303
0
  else
304
0
  {
305
0
    THROW_FATAL( "Unsupported size" );
306
0
  }
307
41.1k
#if USE_AVX2
308
309
41.1k
  _mm256_zeroupper();
310
41.1k
#endif
311
41.1k
}
void vvdec::fastInv_SSE<(vvdec::x86_simd::X86_VEXT)4, 64>(short const*, int const*, int*, unsigned int, unsigned int, unsigned int)
Line
Count
Source
67
7.55k
{
68
7.55k
  unsigned maxLoopL = std::min<int>( reducedLines, 4 );
69
70
7.55k
#if USE_AVX2
71
7.55k
  if( trSize >= 8 && vext >= AVX2 )
72
7.55k
  {
73
7.55k
    if( ( trSize & 15 ) == 0 )
74
7.55k
    {
75
7.55k
      static constexpr unsigned trLoops = trSize >= 16 ? trSize >> 4 : 1;
76
77
35.8k
      for( int k = 0; k < rows; k += 2 )
78
28.2k
      {
79
28.2k
              TCoeff* dstPtr =  dst;
80
81
28.2k
        const TCoeff* srcPtr0 = &src[ k      * lines];
82
28.2k
        const TCoeff* srcPtr1 = &src[(k + 1) * lines];
83
84
28.2k
        __m256i vsrc1v[trLoops][2];
85
        
86
28.2k
        const TMatrixCoeff*  itPtr0 = &it[ k      * trSize];
87
28.2k
        const TMatrixCoeff*  itPtr1 = &it[(k + 1) * trSize];
88
89
141k
        for( int col = 0; col < trLoops; col++, itPtr0 += 16, itPtr1 += 16 )
90
113k
        {
91
#if defined( _MSC_VER ) && _MSC_VER > 1900
92
          __m256i vit16_0 = _mm256_permute4x64_epi64( _mm256_stream_load_si256( ( const __m256i * ) itPtr0 ), ( 0 << 0 ) + ( 1 << 4 ) + ( 2 << 2 ) + ( 3 << 6 ) );
93
          __m256i vit16_1 = _mm256_permute4x64_epi64( _mm256_stream_load_si256( ( const __m256i * ) itPtr1 ), ( 0 << 0 ) + ( 1 << 4 ) + ( 2 << 2 ) + ( 3 << 6 ) );
94
#else
95
113k
          __m256i vit16_0 = _mm256_permute4x64_epi64( _mm256_stream_load_si256( (       __m256i * ) itPtr0 ), ( 0 << 0 ) + ( 1 << 4 ) + ( 2 << 2 ) + ( 3 << 6 ) );
96
113k
          __m256i vit16_1 = _mm256_permute4x64_epi64( _mm256_stream_load_si256( (       __m256i * ) itPtr1 ), ( 0 << 0 ) + ( 1 << 4 ) + ( 2 << 2 ) + ( 3 << 6 ) );
97
113k
#endif
98
99
113k
          vsrc1v[col][0] = _mm256_unpacklo_epi16( vit16_0, vit16_1 );
100
113k
          vsrc1v[col][1] = _mm256_unpackhi_epi16( vit16_0, vit16_1 );
101
113k
        }
102
103
275k
        for( int i = 0; i < reducedLines; i += 4, srcPtr0 += maxLoopL, srcPtr1 += maxLoopL )
104
247k
        {
105
247k
          __m128i xscale = maxLoopL == 4
106
247k
                         ? _mm_packs_epi32( _mm_load_si128( ( const __m128i* )srcPtr0 ), _mm_load_si128( ( const __m128i* )srcPtr1 ) )
107
247k
                         : _mm_packs_epi32( _mm_loadu_si64( ( const __m128i* )srcPtr0 ), _mm_loadu_si64( ( const __m128i* )srcPtr1 ) );
108
109
247k
          if( _mm_test_all_zeros( xscale, xscale ) ) { dstPtr += ( trSize * maxLoopL ); continue; }
110
111
212k
          xscale = _mm_shuffle_epi8( xscale, _mm_setr_epi8( 0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15 ) );
112
1.06M
          for( int l = 0; l < maxLoopL; l++ )
113
849k
          {
114
849k
            __m256i
115
849k
            vscale = _mm256_broadcastd_epi32( xscale );
116
849k
            xscale = _mm_bsrli_si128( xscale, 4 );
117
118
4.24M
            for( int col = 0; col < trLoops; col++, dstPtr += 16 )
119
3.39M
            {
120
3.39M
              __m256i vsrc0 = _mm256_load_si256       ( ( const __m256i * ) dstPtr );
121
122
3.39M
              __m256i
123
3.39M
              vsrc1 = vsrc1v[col][0];
124
3.39M
              vsrc1 = _mm256_madd_epi16    ( vsrc1, vscale );
125
3.39M
              vsrc0 = _mm256_add_epi32     ( vsrc0, vsrc1 );
126
127
3.39M
              _mm256_store_si256           ( ( __m256i * ) dstPtr, vsrc0 );
128
            
129
3.39M
              vsrc0 = _mm256_load_si256    ( ( const __m256i * ) &dstPtr[8] );
130
131
3.39M
              vsrc1 = vsrc1v[col][1];
132
3.39M
              vsrc1 = _mm256_madd_epi16    ( vsrc1, vscale );
133
3.39M
              vsrc0 = _mm256_add_epi32     ( vsrc0, vsrc1 );
134
135
3.39M
              _mm256_store_si256           ( ( __m256i * ) &dstPtr[8], vsrc0 );
136
3.39M
            }
137
849k
          }
138
212k
        }
139
28.2k
      }
140
7.55k
    }
141
0
    else
142
0
    {
143
0
      for( int k = 0; k < rows; k += 2 )
144
0
      {
145
0
              TCoeff* dstPtr  =  dst;
146
147
0
        const TCoeff* srcPtr0 = &src[ k      * lines];
148
0
        const TCoeff* srcPtr1 = &src[(k + 1) * lines];
149
150
0
        const TMatrixCoeff*  itPtr0 = &it[  k      * trSize];
151
0
        const TMatrixCoeff*  itPtr1 = &it[( k + 1 ) * trSize];
152
153
0
        __m256i vit;
154
155
0
        {
156
#if defined( _MSC_VER ) && _MSC_VER > 1900
157
          __m256i vsrc1 = _mm256_permute4x64_epi64( _mm256_castsi128_si256( _mm_stream_load_si128( ( const __m128i * ) itPtr0 ) ), ( 0 << 0 ) + ( 1 << 4 ) );
158
#else
159
0
          __m256i vsrc1 = _mm256_permute4x64_epi64( _mm256_castsi128_si256( _mm_stream_load_si128( ( __m128i * ) itPtr0 ) ), ( 0 << 0 ) + ( 1 << 4 ) );
160
0
#endif
161
#if defined( _MSC_VER ) && _MSC_VER > 1900
162
          __m256i vsrc2 = _mm256_permute4x64_epi64( _mm256_castsi128_si256( _mm_stream_load_si128( ( const __m128i * ) itPtr1 ) ), ( 0 << 0 ) + ( 1 << 4 ) );
163
#else
164
0
          __m256i vsrc2 = _mm256_permute4x64_epi64( _mm256_castsi128_si256( _mm_stream_load_si128( ( __m128i * ) itPtr1 ) ), ( 0 << 0 ) + ( 1 << 4 ) );
165
0
#endif
166
167
0
          vit = _mm256_unpacklo_epi16( vsrc1, vsrc2 );
168
0
        }
169
        
170
0
        for( int i = 0; i < reducedLines; i += 4, srcPtr0 += maxLoopL, srcPtr1 += maxLoopL )
171
0
        {
172
0
          __m128i xscale = maxLoopL == 4
173
0
                         ? _mm_packs_epi32( _mm_load_si128( ( const __m128i* )srcPtr0 ), _mm_load_si128( ( const __m128i* )srcPtr1 ) )
174
0
                         : _mm_packs_epi32( _mm_loadu_si64( ( const __m128i* )srcPtr0 ), _mm_loadu_si64( ( const __m128i* )srcPtr1 ) );
175
176
0
          if( _mm_test_all_zeros( xscale, xscale ) ) { dstPtr += ( trSize * maxLoopL ); continue; }
177
178
0
          xscale = _mm_shuffle_epi8( xscale, _mm_setr_epi8( 0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15 ) );
179
0
          for( int l = 0; l < maxLoopL; l++ )
180
0
          {
181
0
            __m256i
182
0
            vscale = _mm256_broadcastd_epi32( xscale );
183
0
            xscale = _mm_bsrli_si128( xscale, 4 );
184
185
0
            for( int col = 0; col < trSize; col += 8, dstPtr += 8, itPtr0 += 8, itPtr1 += 8 )
186
0
            {
187
0
              __m256i
188
0
              vsrc0 = _mm256_load_si256    ( ( const __m256i * ) dstPtr );
189
0
              __m256i
190
0
              vsrc1 = _mm256_madd_epi16    ( vit, vscale );
191
0
              vsrc0 = _mm256_add_epi32     ( vsrc0, vsrc1 );
192
193
0
              _mm256_store_si256           ( ( __m256i * ) dstPtr, vsrc0 );
194
0
            }
195
0
          }
196
0
        }
197
0
      }
198
0
    }
199
7.55k
  }
200
#else
201
  if( trSize >= 8 )
202
  {
203
    for( int k = 0; k < rows; k += 2 )
204
    {
205
            TCoeff* dstPtr  =  dst;
206
207
      const TCoeff* srcPtr0 = &src[ k      * lines];
208
      const TCoeff* srcPtr1 = &src[(k + 1) * lines];
209
        
210
      for( int i = 0; i < reducedLines; i += 4, srcPtr0 += maxLoopL, srcPtr1 += maxLoopL )
211
      {
212
        __m128i xscale = maxLoopL == 4
213
                        ? _mm_packs_epi32( _mm_load_si128( ( const __m128i* )srcPtr0 ), _mm_load_si128( ( const __m128i* )srcPtr1 ) )
214
                        : _mm_packs_epi32( _mm_loadu_si64( ( const __m128i* )srcPtr0 ), _mm_loadu_si64( ( const __m128i* )srcPtr1 ) );
215
216
        if( _mm_test_all_zeros( xscale, xscale ) ) { dstPtr += ( trSize * maxLoopL ); continue; }
217
218
        xscale = _mm_shuffle_epi8( xscale, _mm_setr_epi8( 0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15 ) );
219
        for( int l = 0; l < maxLoopL; l++ )
220
        {
221
          const TMatrixCoeff*  itPtr0 = &it[k         * trSize];
222
          const TMatrixCoeff*  itPtr1 = &it[( k + 1 ) * trSize];
223
224
          __m128i
225
          vscale = _mm_set1_epi32( _mm_cvtsi128_si32( xscale ) );
226
          xscale = _mm_bsrli_si128( xscale, 4 );
227
228
          for( int col = 0; col < trSize; col += 8, dstPtr += 8, itPtr0 += 8, itPtr1 += 8 )
229
          {
230
            __m128i vsrc0   = _mm_load_si128       ( ( const __m128i * ) dstPtr );
231
#if defined( _MSC_VER ) && _MSC_VER > 1900
232
            __m128i vit16_0 = _mm_stream_load_si128( ( const __m128i * ) itPtr0 );
233
            __m128i vit16_1 = _mm_stream_load_si128( ( const __m128i * ) itPtr1 );
234
#else
235
            __m128i vit16_0 = _mm_stream_load_si128( (       __m128i * ) itPtr0 );
236
            __m128i vit16_1 = _mm_stream_load_si128( (       __m128i * ) itPtr1 );
237
#endif
238
239
            __m128i vsrc1 = _mm_unpacklo_epi16( vit16_0, vit16_1 );
240
241
            vsrc1 = _mm_madd_epi16 ( vsrc1, vscale );
242
            vsrc0 = _mm_add_epi32  ( vsrc0, vsrc1 );
243
244
            _mm_store_si128        ( ( __m128i * ) dstPtr, vsrc0 );
245
          
246
            vsrc0 = _mm_load_si128 ( ( const __m128i * ) &dstPtr[4] );
247
          
248
            vsrc1 = _mm_unpackhi_epi16( vit16_0, vit16_1 );
249
250
            vsrc1 = _mm_madd_epi16 ( vsrc1, vscale );
251
            vsrc0 = _mm_add_epi32  ( vsrc0, vsrc1 );
252
          
253
            _mm_store_si128        ( ( __m128i * ) &dstPtr[4], vsrc0 );
254
          }
255
        }
256
      }
257
    }
258
  }
259
#endif
260
0
  else if( trSize == 4 )
261
0
  {
262
0
    for( int k = 0; k < rows; k += 2 )
263
0
    {
264
0
            TCoeff* dstPtr  =  dst;
265
266
0
      const TCoeff* srcPtr0 = &src[ k      * lines];
267
0
      const TCoeff* srcPtr1 = &src[(k + 1) * lines];
268
269
0
      const TMatrixCoeff*  itPtr0 = &it[  k       * trSize];
270
0
      const TMatrixCoeff*  itPtr1 = &it[( k + 1 ) * trSize];
271
272
0
      __m128i vit = _mm_unpacklo_epi16( _mm_loadu_si64( ( const __m128i * ) itPtr0 ), _mm_loadu_si64( ( const __m128i * ) itPtr1 ) );
273
 
274
0
      for( int i = 0; i < reducedLines; i += 4, srcPtr0 += maxLoopL, srcPtr1 += maxLoopL )
275
0
      {
276
0
        __m128i xscale = maxLoopL == 4
277
0
                        ? _mm_packs_epi32( _mm_load_si128( ( const __m128i* )srcPtr0 ), _mm_load_si128( ( const __m128i* )srcPtr1 ) )
278
0
                        : _mm_packs_epi32( _mm_loadu_si64( ( const __m128i* )srcPtr0 ), _mm_loadu_si64( ( const __m128i* )srcPtr1 ) );
279
280
0
        if( _mm_test_all_zeros( xscale, xscale ) ) { dstPtr += ( trSize * maxLoopL ); continue; }
281
282
0
        xscale = _mm_shuffle_epi8( xscale, _mm_setr_epi8( 0, 1, 8, 9, 2, 3, 10, 11, 4, 5, 12, 13, 6, 7, 14, 15 ) );
283
0
        for( int l = 0; l < maxLoopL; l++ )
284
0
        {
285
0
          __m128i
286
0
          vscale = _mm_set1_epi32( _mm_cvtsi128_si32( xscale ) );
287
0
          xscale = _mm_bsrli_si128( xscale, 4 );
288
289
0
          for( int col = 0; col < trSize; col += 4, dstPtr += 4 )
290
0
          {
291
0
            __m128i
292
0
            vsrc0 = _mm_load_si128 ( ( const __m128i * ) dstPtr );
293
0
            __m128i 
294
0
            vsrc1 = _mm_madd_epi16 ( vit, vscale );
295
0
            vsrc0 = _mm_add_epi32  ( vsrc0, vsrc1 );
296
297
0
            _mm_store_si128        ( ( __m128i * ) dstPtr, vsrc0 );
298
0
          }
299
0
        }
300
0
      }
301
0
    }
302
0
  }
303
0
  else
304
0
  {
305
0
    THROW_FATAL( "Unsupported size" );
306
0
  }
307
7.55k
#if USE_AVX2
308
309
7.55k
  _mm256_zeroupper();
310
7.55k
#endif
311
7.55k
}
312
313
template< X86_VEXT vext, int W >
314
void roundClip_SSE( TCoeff *dst, unsigned width, unsigned height, unsigned stride, const TCoeff outputMin, const TCoeff outputMax, const TCoeff round, const TCoeff shift )
315
58.7k
{
316
#if USE_AVX2
317
58.7k
  if( W >= 8 && vext >= AVX2 )
318
51.9k
  {
319
51.9k
    __m256i vmin = _mm256_set1_epi32( outputMin );
320
51.9k
    __m256i vmax = _mm256_set1_epi32( outputMax );
321
51.9k
    __m256i vrnd = _mm256_set1_epi32( round );
322
323
364k
    while( height-- )
324
312k
    {
325
1.28M
      for( int col = 0; col < width; col += 8 )
326
967k
      {
327
967k
        __m256i
328
967k
        vdst = _mm256_load_si256( ( __m256i * ) &dst[col] );
329
967k
        vdst = _mm256_add_epi32 ( vdst, vrnd );
330
967k
        vdst = _mm256_srai_epi32( vdst, shift );
331
967k
        vdst = _mm256_max_epi32 ( vdst, vmin );
332
967k
        vdst = _mm256_min_epi32 ( vdst, vmax );
333
967k
        _mm256_store_si256      ( ( __m256i * ) &dst[col], vdst );
334
967k
      }
335
336
312k
      dst += stride;
337
312k
    }
338
51.9k
  }
339
6.87k
  else
340
6.87k
#endif
341
6.87k
  if( W >= 4 )
342
6.87k
  {
343
6.87k
    __m128i vmin = _mm_set1_epi32( outputMin );
344
6.87k
    __m128i vmax = _mm_set1_epi32( outputMax );
345
6.87k
    __m128i vrnd = _mm_set1_epi32( round );
346
347
46.5k
    while( height-- )
348
39.6k
    {
349
79.3k
      for( int col = 0; col < width; col += 4 )
350
39.6k
      {
351
39.6k
        __m128i
352
39.6k
        vdst = _mm_load_si128 ( ( __m128i * ) &dst[col] );
353
39.6k
        vdst = _mm_add_epi32  ( vdst, vrnd );
354
39.6k
        vdst = _mm_srai_epi32 ( vdst, shift );
355
39.6k
        vdst = _mm_max_epi32  ( vdst, vmin );
356
39.6k
        vdst = _mm_min_epi32  ( vdst, vmax );
357
39.6k
        _mm_store_si128       ( ( __m128i * ) &dst[col], vdst );
358
39.6k
      }
359
360
39.6k
      dst += stride;
361
39.6k
    }
362
6.87k
  }
363
0
  else
364
0
  {
365
0
    THROW_FATAL( "Unsupported size" );
366
0
  }
367
#if USE_AVX2
368
369
58.7k
  _mm256_zeroupper();
370
58.7k
#endif
371
58.7k
}
Unexecuted instantiation: void vvdec::roundClip_SSE<(vvdec::x86_simd::X86_VEXT)1, 4>(int*, unsigned int, unsigned int, unsigned int, int, int, int, int)
Unexecuted instantiation: void vvdec::roundClip_SSE<(vvdec::x86_simd::X86_VEXT)1, 8>(int*, unsigned int, unsigned int, unsigned int, int, int, int, int)
void vvdec::roundClip_SSE<(vvdec::x86_simd::X86_VEXT)4, 4>(int*, unsigned int, unsigned int, unsigned int, int, int, int, int)
Line
Count
Source
315
6.87k
{
316
6.87k
#if USE_AVX2
317
6.87k
  if( W >= 8 && vext >= AVX2 )
318
0
  {
319
0
    __m256i vmin = _mm256_set1_epi32( outputMin );
320
0
    __m256i vmax = _mm256_set1_epi32( outputMax );
321
0
    __m256i vrnd = _mm256_set1_epi32( round );
322
323
0
    while( height-- )
324
0
    {
325
0
      for( int col = 0; col < width; col += 8 )
326
0
      {
327
0
        __m256i
328
0
        vdst = _mm256_load_si256( ( __m256i * ) &dst[col] );
329
0
        vdst = _mm256_add_epi32 ( vdst, vrnd );
330
0
        vdst = _mm256_srai_epi32( vdst, shift );
331
0
        vdst = _mm256_max_epi32 ( vdst, vmin );
332
0
        vdst = _mm256_min_epi32 ( vdst, vmax );
333
0
        _mm256_store_si256      ( ( __m256i * ) &dst[col], vdst );
334
0
      }
335
336
0
      dst += stride;
337
0
    }
338
0
  }
339
6.87k
  else
340
6.87k
#endif
341
6.87k
  if( W >= 4 )
342
6.87k
  {
343
6.87k
    __m128i vmin = _mm_set1_epi32( outputMin );
344
6.87k
    __m128i vmax = _mm_set1_epi32( outputMax );
345
6.87k
    __m128i vrnd = _mm_set1_epi32( round );
346
347
46.5k
    while( height-- )
348
39.6k
    {
349
79.3k
      for( int col = 0; col < width; col += 4 )
350
39.6k
      {
351
39.6k
        __m128i
352
39.6k
        vdst = _mm_load_si128 ( ( __m128i * ) &dst[col] );
353
39.6k
        vdst = _mm_add_epi32  ( vdst, vrnd );
354
39.6k
        vdst = _mm_srai_epi32 ( vdst, shift );
355
39.6k
        vdst = _mm_max_epi32  ( vdst, vmin );
356
39.6k
        vdst = _mm_min_epi32  ( vdst, vmax );
357
39.6k
        _mm_store_si128       ( ( __m128i * ) &dst[col], vdst );
358
39.6k
      }
359
360
39.6k
      dst += stride;
361
39.6k
    }
362
6.87k
  }
363
0
  else
364
0
  {
365
0
    THROW_FATAL( "Unsupported size" );
366
0
  }
367
6.87k
#if USE_AVX2
368
369
6.87k
  _mm256_zeroupper();
370
6.87k
#endif
371
6.87k
}
void vvdec::roundClip_SSE<(vvdec::x86_simd::X86_VEXT)4, 8>(int*, unsigned int, unsigned int, unsigned int, int, int, int, int)
Line
Count
Source
315
51.9k
{
316
51.9k
#if USE_AVX2
317
51.9k
  if( W >= 8 && vext >= AVX2 )
318
51.9k
  {
319
51.9k
    __m256i vmin = _mm256_set1_epi32( outputMin );
320
51.9k
    __m256i vmax = _mm256_set1_epi32( outputMax );
321
51.9k
    __m256i vrnd = _mm256_set1_epi32( round );
322
323
364k
    while( height-- )
324
312k
    {
325
1.28M
      for( int col = 0; col < width; col += 8 )
326
967k
      {
327
967k
        __m256i
328
967k
        vdst = _mm256_load_si256( ( __m256i * ) &dst[col] );
329
967k
        vdst = _mm256_add_epi32 ( vdst, vrnd );
330
967k
        vdst = _mm256_srai_epi32( vdst, shift );
331
967k
        vdst = _mm256_max_epi32 ( vdst, vmin );
332
967k
        vdst = _mm256_min_epi32 ( vdst, vmax );
333
967k
        _mm256_store_si256      ( ( __m256i * ) &dst[col], vdst );
334
967k
      }
335
336
312k
      dst += stride;
337
312k
    }
338
51.9k
  }
339
0
  else
340
0
#endif
341
0
  if( W >= 4 )
342
0
  {
343
0
    __m128i vmin = _mm_set1_epi32( outputMin );
344
0
    __m128i vmax = _mm_set1_epi32( outputMax );
345
0
    __m128i vrnd = _mm_set1_epi32( round );
346
347
0
    while( height-- )
348
0
    {
349
0
      for( int col = 0; col < width; col += 4 )
350
0
      {
351
0
        __m128i
352
0
        vdst = _mm_load_si128 ( ( __m128i * ) &dst[col] );
353
0
        vdst = _mm_add_epi32  ( vdst, vrnd );
354
0
        vdst = _mm_srai_epi32 ( vdst, shift );
355
0
        vdst = _mm_max_epi32  ( vdst, vmin );
356
0
        vdst = _mm_min_epi32  ( vdst, vmax );
357
0
        _mm_store_si128       ( ( __m128i * ) &dst[col], vdst );
358
0
      }
359
360
0
      dst += stride;
361
0
    }
362
0
  }
363
0
  else
364
0
  {
365
0
    THROW_FATAL( "Unsupported size" );
366
0
  }
367
51.9k
#if USE_AVX2
368
369
51.9k
  _mm256_zeroupper();
370
51.9k
#endif
371
51.9k
}
372
373
template< X86_VEXT vext, int W >
374
void cpyResiClip_SSE( const TCoeff* src, Pel* dst, ptrdiff_t stride, unsigned width, unsigned height, const TCoeff outputMin, const TCoeff outputMax, const TCoeff round, const TCoeff shift )
375
59.7k
{
376
#if USE_AVX2
377
59.7k
  if( W >= 16 )
378
40.6k
  {
379
40.6k
    __m256i vmin = _mm256_set1_epi32( outputMin );
380
40.6k
    __m256i vmax = _mm256_set1_epi32( outputMax );
381
40.6k
    __m256i vrnd = _mm256_set1_epi32( round );
382
383
1.02M
    while( height-- )
384
980k
    {
385
3.10M
      for( int col = 0; col < width; col += 16 )
386
2.12M
      {
387
2.12M
        __m256i
388
2.12M
        vsrc1 = _mm256_load_si256 ( ( const __m256i * ) &src[col] );
389
2.12M
        vsrc1 = _mm256_add_epi32  ( vsrc1, vrnd );
390
2.12M
        vsrc1 = _mm256_srai_epi32 ( vsrc1, shift );
391
2.12M
        vsrc1 = _mm256_max_epi32  ( _mm256_min_epi32( vsrc1, vmax ), vmin );
392
393
2.12M
        __m256i                
394
2.12M
        vsrc2 = _mm256_load_si256 ( ( const __m256i * ) &src[col+8] );
395
2.12M
        vsrc2 = _mm256_add_epi32  ( vsrc2, vrnd );
396
2.12M
        vsrc2 = _mm256_srai_epi32 ( vsrc2, shift );
397
2.12M
        vsrc2 = _mm256_max_epi32  ( _mm256_min_epi32( vsrc2, vmax ), vmin );
398
399
2.12M
        __m256i
400
2.12M
        vdst  = _mm256_packs_epi32( vsrc1, vsrc2 );
401
2.12M
        vdst  = _mm256_permute4x64_epi64( vdst, ( 0 << 0 ) + ( 1 << 4 ) + ( 2 << 2 ) + ( 3 << 6 ) );
402
2.12M
        _mm256_storeu_si256       ( ( __m256i * ) &dst[col], vdst );
403
2.12M
      }
404
405
980k
      src += width;
406
980k
      dst += stride;
407
980k
    }
408
40.6k
  }
409
19.0k
  else
410
19.0k
#endif
411
19.0k
  if( W >= 8 )
412
12.8k
  {
413
12.8k
    __m128i vmin = _mm_set1_epi32( outputMin );
414
12.8k
    __m128i vmax = _mm_set1_epi32( outputMax );
415
12.8k
    __m128i vrnd = _mm_set1_epi32( round );
416
417
190k
    while( height-- )
418
177k
    {
419
355k
      for( int col = 0; col < width; col += 8 )
420
177k
      {
421
177k
        __m128i
422
177k
        vsrc1 = _mm_load_si128 ( ( const __m128i * ) &src[col] );
423
177k
        vsrc1 = _mm_add_epi32  ( vsrc1, vrnd );
424
177k
        vsrc1 = _mm_srai_epi32 ( vsrc1, shift );
425
177k
        vsrc1 = _mm_max_epi32  ( _mm_min_epi32( vsrc1, vmax ), vmin );
426
177k
        __m128i                
427
177k
        vsrc2 = _mm_load_si128 ( ( const __m128i * ) &src[col+4] );
428
177k
        vsrc2 = _mm_add_epi32  ( vsrc2, vrnd );
429
177k
        vsrc2 = _mm_srai_epi32 ( vsrc2, shift );
430
177k
        vsrc2 = _mm_max_epi32  ( _mm_min_epi32( vsrc2, vmax ), vmin );
431
177k
        __m128i
432
177k
        vdst  = _mm_packs_epi32( vsrc1, vsrc2 );
433
177k
        _mm_storeu_si128       ( ( __m128i * ) &dst[col], vdst );
434
177k
      }
435
436
177k
      src += width;
437
177k
      dst += stride;
438
177k
    }
439
12.8k
  }
440
6.27k
  else if( W >= 4 )
441
6.27k
  {
442
6.27k
    __m128i vmin = _mm_set1_epi32( outputMin );
443
6.27k
    __m128i vmax = _mm_set1_epi32( outputMax );
444
6.27k
    __m128i vrnd = _mm_set1_epi32( round );
445
446
6.27k
    __m128i vzero = _mm_setzero_si128();
447
6.27k
    __m128i vdst;
448
449
89.1k
    while( height-- )
450
82.9k
    {
451
165k
      for( int col = 0; col < width; col += 4 )
452
82.9k
      {
453
82.9k
        vdst = _mm_load_si128 ( ( const __m128i * ) &src[col] );
454
82.9k
        vdst = _mm_add_epi32  ( vdst, vrnd );
455
82.9k
        vdst = _mm_srai_epi32 ( vdst, shift );
456
82.9k
        vdst = _mm_max_epi32  ( _mm_min_epi32( vdst, vmax ), vmin );
457
82.9k
        vdst = _mm_packs_epi32( vdst, vzero );
458
82.9k
        _mm_storeu_si64       ( ( __m128i * ) &dst[col], vdst );
459
82.9k
      }
460
461
82.9k
      src += width;
462
82.9k
      dst += stride;
463
82.9k
    }
464
6.27k
  }
465
0
  else
466
0
  {
467
0
    THROW_FATAL( "Unsupported size" );
468
0
  }
469
59.7k
}
Unexecuted instantiation: void vvdec::cpyResiClip_SSE<(vvdec::x86_simd::X86_VEXT)1, 4>(int const*, short*, long, unsigned int, unsigned int, int, int, int, int)
Unexecuted instantiation: void vvdec::cpyResiClip_SSE<(vvdec::x86_simd::X86_VEXT)1, 8>(int const*, short*, long, unsigned int, unsigned int, int, int, int, int)
Unexecuted instantiation: void vvdec::cpyResiClip_SSE<(vvdec::x86_simd::X86_VEXT)1, 16>(int const*, short*, long, unsigned int, unsigned int, int, int, int, int)
Unexecuted instantiation: void vvdec::cpyResiClip_SSE<(vvdec::x86_simd::X86_VEXT)1, 32>(int const*, short*, long, unsigned int, unsigned int, int, int, int, int)
Unexecuted instantiation: void vvdec::cpyResiClip_SSE<(vvdec::x86_simd::X86_VEXT)1, 64>(int const*, short*, long, unsigned int, unsigned int, int, int, int, int)
void vvdec::cpyResiClip_SSE<(vvdec::x86_simd::X86_VEXT)4, 4>(int const*, short*, long, unsigned int, unsigned int, int, int, int, int)
Line
Count
Source
375
6.27k
{
376
6.27k
#if USE_AVX2
377
6.27k
  if( W >= 16 )
378
0
  {
379
0
    __m256i vmin = _mm256_set1_epi32( outputMin );
380
0
    __m256i vmax = _mm256_set1_epi32( outputMax );
381
0
    __m256i vrnd = _mm256_set1_epi32( round );
382
383
0
    while( height-- )
384
0
    {
385
0
      for( int col = 0; col < width; col += 16 )
386
0
      {
387
0
        __m256i
388
0
        vsrc1 = _mm256_load_si256 ( ( const __m256i * ) &src[col] );
389
0
        vsrc1 = _mm256_add_epi32  ( vsrc1, vrnd );
390
0
        vsrc1 = _mm256_srai_epi32 ( vsrc1, shift );
391
0
        vsrc1 = _mm256_max_epi32  ( _mm256_min_epi32( vsrc1, vmax ), vmin );
392
393
0
        __m256i                
394
0
        vsrc2 = _mm256_load_si256 ( ( const __m256i * ) &src[col+8] );
395
0
        vsrc2 = _mm256_add_epi32  ( vsrc2, vrnd );
396
0
        vsrc2 = _mm256_srai_epi32 ( vsrc2, shift );
397
0
        vsrc2 = _mm256_max_epi32  ( _mm256_min_epi32( vsrc2, vmax ), vmin );
398
399
0
        __m256i
400
0
        vdst  = _mm256_packs_epi32( vsrc1, vsrc2 );
401
0
        vdst  = _mm256_permute4x64_epi64( vdst, ( 0 << 0 ) + ( 1 << 4 ) + ( 2 << 2 ) + ( 3 << 6 ) );
402
0
        _mm256_storeu_si256       ( ( __m256i * ) &dst[col], vdst );
403
0
      }
404
405
0
      src += width;
406
0
      dst += stride;
407
0
    }
408
0
  }
409
6.27k
  else
410
6.27k
#endif
411
6.27k
  if( W >= 8 )
412
0
  {
413
0
    __m128i vmin = _mm_set1_epi32( outputMin );
414
0
    __m128i vmax = _mm_set1_epi32( outputMax );
415
0
    __m128i vrnd = _mm_set1_epi32( round );
416
417
0
    while( height-- )
418
0
    {
419
0
      for( int col = 0; col < width; col += 8 )
420
0
      {
421
0
        __m128i
422
0
        vsrc1 = _mm_load_si128 ( ( const __m128i * ) &src[col] );
423
0
        vsrc1 = _mm_add_epi32  ( vsrc1, vrnd );
424
0
        vsrc1 = _mm_srai_epi32 ( vsrc1, shift );
425
0
        vsrc1 = _mm_max_epi32  ( _mm_min_epi32( vsrc1, vmax ), vmin );
426
0
        __m128i                
427
0
        vsrc2 = _mm_load_si128 ( ( const __m128i * ) &src[col+4] );
428
0
        vsrc2 = _mm_add_epi32  ( vsrc2, vrnd );
429
0
        vsrc2 = _mm_srai_epi32 ( vsrc2, shift );
430
0
        vsrc2 = _mm_max_epi32  ( _mm_min_epi32( vsrc2, vmax ), vmin );
431
0
        __m128i
432
0
        vdst  = _mm_packs_epi32( vsrc1, vsrc2 );
433
0
        _mm_storeu_si128       ( ( __m128i * ) &dst[col], vdst );
434
0
      }
435
436
0
      src += width;
437
0
      dst += stride;
438
0
    }
439
0
  }
440
6.27k
  else if( W >= 4 )
441
6.27k
  {
442
6.27k
    __m128i vmin = _mm_set1_epi32( outputMin );
443
6.27k
    __m128i vmax = _mm_set1_epi32( outputMax );
444
6.27k
    __m128i vrnd = _mm_set1_epi32( round );
445
446
6.27k
    __m128i vzero = _mm_setzero_si128();
447
6.27k
    __m128i vdst;
448
449
89.1k
    while( height-- )
450
82.9k
    {
451
165k
      for( int col = 0; col < width; col += 4 )
452
82.9k
      {
453
82.9k
        vdst = _mm_load_si128 ( ( const __m128i * ) &src[col] );
454
82.9k
        vdst = _mm_add_epi32  ( vdst, vrnd );
455
82.9k
        vdst = _mm_srai_epi32 ( vdst, shift );
456
82.9k
        vdst = _mm_max_epi32  ( _mm_min_epi32( vdst, vmax ), vmin );
457
82.9k
        vdst = _mm_packs_epi32( vdst, vzero );
458
82.9k
        _mm_storeu_si64       ( ( __m128i * ) &dst[col], vdst );
459
82.9k
      }
460
461
82.9k
      src += width;
462
82.9k
      dst += stride;
463
82.9k
    }
464
6.27k
  }
465
0
  else
466
0
  {
467
0
    THROW_FATAL( "Unsupported size" );
468
0
  }
469
6.27k
}
void vvdec::cpyResiClip_SSE<(vvdec::x86_simd::X86_VEXT)4, 8>(int const*, short*, long, unsigned int, unsigned int, int, int, int, int)
Line
Count
Source
375
12.8k
{
376
12.8k
#if USE_AVX2
377
12.8k
  if( W >= 16 )
378
0
  {
379
0
    __m256i vmin = _mm256_set1_epi32( outputMin );
380
0
    __m256i vmax = _mm256_set1_epi32( outputMax );
381
0
    __m256i vrnd = _mm256_set1_epi32( round );
382
383
0
    while( height-- )
384
0
    {
385
0
      for( int col = 0; col < width; col += 16 )
386
0
      {
387
0
        __m256i
388
0
        vsrc1 = _mm256_load_si256 ( ( const __m256i * ) &src[col] );
389
0
        vsrc1 = _mm256_add_epi32  ( vsrc1, vrnd );
390
0
        vsrc1 = _mm256_srai_epi32 ( vsrc1, shift );
391
0
        vsrc1 = _mm256_max_epi32  ( _mm256_min_epi32( vsrc1, vmax ), vmin );
392
393
0
        __m256i                
394
0
        vsrc2 = _mm256_load_si256 ( ( const __m256i * ) &src[col+8] );
395
0
        vsrc2 = _mm256_add_epi32  ( vsrc2, vrnd );
396
0
        vsrc2 = _mm256_srai_epi32 ( vsrc2, shift );
397
0
        vsrc2 = _mm256_max_epi32  ( _mm256_min_epi32( vsrc2, vmax ), vmin );
398
399
0
        __m256i
400
0
        vdst  = _mm256_packs_epi32( vsrc1, vsrc2 );
401
0
        vdst  = _mm256_permute4x64_epi64( vdst, ( 0 << 0 ) + ( 1 << 4 ) + ( 2 << 2 ) + ( 3 << 6 ) );
402
0
        _mm256_storeu_si256       ( ( __m256i * ) &dst[col], vdst );
403
0
      }
404
405
0
      src += width;
406
0
      dst += stride;
407
0
    }
408
0
  }
409
12.8k
  else
410
12.8k
#endif
411
12.8k
  if( W >= 8 )
412
12.8k
  {
413
12.8k
    __m128i vmin = _mm_set1_epi32( outputMin );
414
12.8k
    __m128i vmax = _mm_set1_epi32( outputMax );
415
12.8k
    __m128i vrnd = _mm_set1_epi32( round );
416
417
190k
    while( height-- )
418
177k
    {
419
355k
      for( int col = 0; col < width; col += 8 )
420
177k
      {
421
177k
        __m128i
422
177k
        vsrc1 = _mm_load_si128 ( ( const __m128i * ) &src[col] );
423
177k
        vsrc1 = _mm_add_epi32  ( vsrc1, vrnd );
424
177k
        vsrc1 = _mm_srai_epi32 ( vsrc1, shift );
425
177k
        vsrc1 = _mm_max_epi32  ( _mm_min_epi32( vsrc1, vmax ), vmin );
426
177k
        __m128i                
427
177k
        vsrc2 = _mm_load_si128 ( ( const __m128i * ) &src[col+4] );
428
177k
        vsrc2 = _mm_add_epi32  ( vsrc2, vrnd );
429
177k
        vsrc2 = _mm_srai_epi32 ( vsrc2, shift );
430
177k
        vsrc2 = _mm_max_epi32  ( _mm_min_epi32( vsrc2, vmax ), vmin );
431
177k
        __m128i
432
177k
        vdst  = _mm_packs_epi32( vsrc1, vsrc2 );
433
177k
        _mm_storeu_si128       ( ( __m128i * ) &dst[col], vdst );
434
177k
      }
435
436
177k
      src += width;
437
177k
      dst += stride;
438
177k
    }
439
12.8k
  }
440
0
  else if( W >= 4 )
441
0
  {
442
0
    __m128i vmin = _mm_set1_epi32( outputMin );
443
0
    __m128i vmax = _mm_set1_epi32( outputMax );
444
0
    __m128i vrnd = _mm_set1_epi32( round );
445
446
0
    __m128i vzero = _mm_setzero_si128();
447
0
    __m128i vdst;
448
449
0
    while( height-- )
450
0
    {
451
0
      for( int col = 0; col < width; col += 4 )
452
0
      {
453
0
        vdst = _mm_load_si128 ( ( const __m128i * ) &src[col] );
454
0
        vdst = _mm_add_epi32  ( vdst, vrnd );
455
0
        vdst = _mm_srai_epi32 ( vdst, shift );
456
0
        vdst = _mm_max_epi32  ( _mm_min_epi32( vdst, vmax ), vmin );
457
0
        vdst = _mm_packs_epi32( vdst, vzero );
458
0
        _mm_storeu_si64       ( ( __m128i * ) &dst[col], vdst );
459
0
      }
460
461
0
      src += width;
462
0
      dst += stride;
463
0
    }
464
0
  }
465
0
  else
466
0
  {
467
0
    THROW_FATAL( "Unsupported size" );
468
0
  }
469
12.8k
}
void vvdec::cpyResiClip_SSE<(vvdec::x86_simd::X86_VEXT)4, 16>(int const*, short*, long, unsigned int, unsigned int, int, int, int, int)
Line
Count
Source
375
15.9k
{
376
15.9k
#if USE_AVX2
377
15.9k
  if( W >= 16 )
378
15.9k
  {
379
15.9k
    __m256i vmin = _mm256_set1_epi32( outputMin );
380
15.9k
    __m256i vmax = _mm256_set1_epi32( outputMax );
381
15.9k
    __m256i vrnd = _mm256_set1_epi32( round );
382
383
282k
    while( height-- )
384
266k
    {
385
533k
      for( int col = 0; col < width; col += 16 )
386
266k
      {
387
266k
        __m256i
388
266k
        vsrc1 = _mm256_load_si256 ( ( const __m256i * ) &src[col] );
389
266k
        vsrc1 = _mm256_add_epi32  ( vsrc1, vrnd );
390
266k
        vsrc1 = _mm256_srai_epi32 ( vsrc1, shift );
391
266k
        vsrc1 = _mm256_max_epi32  ( _mm256_min_epi32( vsrc1, vmax ), vmin );
392
393
266k
        __m256i                
394
266k
        vsrc2 = _mm256_load_si256 ( ( const __m256i * ) &src[col+8] );
395
266k
        vsrc2 = _mm256_add_epi32  ( vsrc2, vrnd );
396
266k
        vsrc2 = _mm256_srai_epi32 ( vsrc2, shift );
397
266k
        vsrc2 = _mm256_max_epi32  ( _mm256_min_epi32( vsrc2, vmax ), vmin );
398
399
266k
        __m256i
400
266k
        vdst  = _mm256_packs_epi32( vsrc1, vsrc2 );
401
266k
        vdst  = _mm256_permute4x64_epi64( vdst, ( 0 << 0 ) + ( 1 << 4 ) + ( 2 << 2 ) + ( 3 << 6 ) );
402
266k
        _mm256_storeu_si256       ( ( __m256i * ) &dst[col], vdst );
403
266k
      }
404
405
266k
      src += width;
406
266k
      dst += stride;
407
266k
    }
408
15.9k
  }
409
0
  else
410
0
#endif
411
0
  if( W >= 8 )
412
0
  {
413
0
    __m128i vmin = _mm_set1_epi32( outputMin );
414
0
    __m128i vmax = _mm_set1_epi32( outputMax );
415
0
    __m128i vrnd = _mm_set1_epi32( round );
416
417
0
    while( height-- )
418
0
    {
419
0
      for( int col = 0; col < width; col += 8 )
420
0
      {
421
0
        __m128i
422
0
        vsrc1 = _mm_load_si128 ( ( const __m128i * ) &src[col] );
423
0
        vsrc1 = _mm_add_epi32  ( vsrc1, vrnd );
424
0
        vsrc1 = _mm_srai_epi32 ( vsrc1, shift );
425
0
        vsrc1 = _mm_max_epi32  ( _mm_min_epi32( vsrc1, vmax ), vmin );
426
0
        __m128i                
427
0
        vsrc2 = _mm_load_si128 ( ( const __m128i * ) &src[col+4] );
428
0
        vsrc2 = _mm_add_epi32  ( vsrc2, vrnd );
429
0
        vsrc2 = _mm_srai_epi32 ( vsrc2, shift );
430
0
        vsrc2 = _mm_max_epi32  ( _mm_min_epi32( vsrc2, vmax ), vmin );
431
0
        __m128i
432
0
        vdst  = _mm_packs_epi32( vsrc1, vsrc2 );
433
0
        _mm_storeu_si128       ( ( __m128i * ) &dst[col], vdst );
434
0
      }
435
436
0
      src += width;
437
0
      dst += stride;
438
0
    }
439
0
  }
440
0
  else if( W >= 4 )
441
0
  {
442
0
    __m128i vmin = _mm_set1_epi32( outputMin );
443
0
    __m128i vmax = _mm_set1_epi32( outputMax );
444
0
    __m128i vrnd = _mm_set1_epi32( round );
445
446
0
    __m128i vzero = _mm_setzero_si128();
447
0
    __m128i vdst;
448
449
0
    while( height-- )
450
0
    {
451
0
      for( int col = 0; col < width; col += 4 )
452
0
      {
453
0
        vdst = _mm_load_si128 ( ( const __m128i * ) &src[col] );
454
0
        vdst = _mm_add_epi32  ( vdst, vrnd );
455
0
        vdst = _mm_srai_epi32 ( vdst, shift );
456
0
        vdst = _mm_max_epi32  ( _mm_min_epi32( vdst, vmax ), vmin );
457
0
        vdst = _mm_packs_epi32( vdst, vzero );
458
0
        _mm_storeu_si64       ( ( __m128i * ) &dst[col], vdst );
459
0
      }
460
461
0
      src += width;
462
0
      dst += stride;
463
0
    }
464
0
  }
465
0
  else
466
0
  {
467
0
    THROW_FATAL( "Unsupported size" );
468
0
  }
469
15.9k
}
void vvdec::cpyResiClip_SSE<(vvdec::x86_simd::X86_VEXT)4, 32>(int const*, short*, long, unsigned int, unsigned int, int, int, int, int)
Line
Count
Source
375
21.0k
{
376
21.0k
#if USE_AVX2
377
21.0k
  if( W >= 16 )
378
21.0k
  {
379
21.0k
    __m256i vmin = _mm256_set1_epi32( outputMin );
380
21.0k
    __m256i vmax = _mm256_set1_epi32( outputMax );
381
21.0k
    __m256i vrnd = _mm256_set1_epi32( round );
382
383
519k
    while( height-- )
384
498k
    {
385
1.49M
      for( int col = 0; col < width; col += 16 )
386
995k
      {
387
995k
        __m256i
388
995k
        vsrc1 = _mm256_load_si256 ( ( const __m256i * ) &src[col] );
389
995k
        vsrc1 = _mm256_add_epi32  ( vsrc1, vrnd );
390
995k
        vsrc1 = _mm256_srai_epi32 ( vsrc1, shift );
391
995k
        vsrc1 = _mm256_max_epi32  ( _mm256_min_epi32( vsrc1, vmax ), vmin );
392
393
995k
        __m256i                
394
995k
        vsrc2 = _mm256_load_si256 ( ( const __m256i * ) &src[col+8] );
395
995k
        vsrc2 = _mm256_add_epi32  ( vsrc2, vrnd );
396
995k
        vsrc2 = _mm256_srai_epi32 ( vsrc2, shift );
397
995k
        vsrc2 = _mm256_max_epi32  ( _mm256_min_epi32( vsrc2, vmax ), vmin );
398
399
995k
        __m256i
400
995k
        vdst  = _mm256_packs_epi32( vsrc1, vsrc2 );
401
995k
        vdst  = _mm256_permute4x64_epi64( vdst, ( 0 << 0 ) + ( 1 << 4 ) + ( 2 << 2 ) + ( 3 << 6 ) );
402
995k
        _mm256_storeu_si256       ( ( __m256i * ) &dst[col], vdst );
403
995k
      }
404
405
498k
      src += width;
406
498k
      dst += stride;
407
498k
    }
408
21.0k
  }
409
0
  else
410
0
#endif
411
0
  if( W >= 8 )
412
0
  {
413
0
    __m128i vmin = _mm_set1_epi32( outputMin );
414
0
    __m128i vmax = _mm_set1_epi32( outputMax );
415
0
    __m128i vrnd = _mm_set1_epi32( round );
416
417
0
    while( height-- )
418
0
    {
419
0
      for( int col = 0; col < width; col += 8 )
420
0
      {
421
0
        __m128i
422
0
        vsrc1 = _mm_load_si128 ( ( const __m128i * ) &src[col] );
423
0
        vsrc1 = _mm_add_epi32  ( vsrc1, vrnd );
424
0
        vsrc1 = _mm_srai_epi32 ( vsrc1, shift );
425
0
        vsrc1 = _mm_max_epi32  ( _mm_min_epi32( vsrc1, vmax ), vmin );
426
0
        __m128i                
427
0
        vsrc2 = _mm_load_si128 ( ( const __m128i * ) &src[col+4] );
428
0
        vsrc2 = _mm_add_epi32  ( vsrc2, vrnd );
429
0
        vsrc2 = _mm_srai_epi32 ( vsrc2, shift );
430
0
        vsrc2 = _mm_max_epi32  ( _mm_min_epi32( vsrc2, vmax ), vmin );
431
0
        __m128i
432
0
        vdst  = _mm_packs_epi32( vsrc1, vsrc2 );
433
0
        _mm_storeu_si128       ( ( __m128i * ) &dst[col], vdst );
434
0
      }
435
436
0
      src += width;
437
0
      dst += stride;
438
0
    }
439
0
  }
440
0
  else if( W >= 4 )
441
0
  {
442
0
    __m128i vmin = _mm_set1_epi32( outputMin );
443
0
    __m128i vmax = _mm_set1_epi32( outputMax );
444
0
    __m128i vrnd = _mm_set1_epi32( round );
445
446
0
    __m128i vzero = _mm_setzero_si128();
447
0
    __m128i vdst;
448
449
0
    while( height-- )
450
0
    {
451
0
      for( int col = 0; col < width; col += 4 )
452
0
      {
453
0
        vdst = _mm_load_si128 ( ( const __m128i * ) &src[col] );
454
0
        vdst = _mm_add_epi32  ( vdst, vrnd );
455
0
        vdst = _mm_srai_epi32 ( vdst, shift );
456
0
        vdst = _mm_max_epi32  ( _mm_min_epi32( vdst, vmax ), vmin );
457
0
        vdst = _mm_packs_epi32( vdst, vzero );
458
0
        _mm_storeu_si64       ( ( __m128i * ) &dst[col], vdst );
459
0
      }
460
461
0
      src += width;
462
0
      dst += stride;
463
0
    }
464
0
  }
465
0
  else
466
0
  {
467
0
    THROW_FATAL( "Unsupported size" );
468
0
  }
469
21.0k
}
void vvdec::cpyResiClip_SSE<(vvdec::x86_simd::X86_VEXT)4, 64>(int const*, short*, long, unsigned int, unsigned int, int, int, int, int)
Line
Count
Source
375
3.68k
{
376
3.68k
#if USE_AVX2
377
3.68k
  if( W >= 16 )
378
3.68k
  {
379
3.68k
    __m256i vmin = _mm256_set1_epi32( outputMin );
380
3.68k
    __m256i vmax = _mm256_set1_epi32( outputMax );
381
3.68k
    __m256i vrnd = _mm256_set1_epi32( round );
382
383
218k
    while( height-- )
384
215k
    {
385
1.07M
      for( int col = 0; col < width; col += 16 )
386
861k
      {
387
861k
        __m256i
388
861k
        vsrc1 = _mm256_load_si256 ( ( const __m256i * ) &src[col] );
389
861k
        vsrc1 = _mm256_add_epi32  ( vsrc1, vrnd );
390
861k
        vsrc1 = _mm256_srai_epi32 ( vsrc1, shift );
391
861k
        vsrc1 = _mm256_max_epi32  ( _mm256_min_epi32( vsrc1, vmax ), vmin );
392
393
861k
        __m256i                
394
861k
        vsrc2 = _mm256_load_si256 ( ( const __m256i * ) &src[col+8] );
395
861k
        vsrc2 = _mm256_add_epi32  ( vsrc2, vrnd );
396
861k
        vsrc2 = _mm256_srai_epi32 ( vsrc2, shift );
397
861k
        vsrc2 = _mm256_max_epi32  ( _mm256_min_epi32( vsrc2, vmax ), vmin );
398
399
861k
        __m256i
400
861k
        vdst  = _mm256_packs_epi32( vsrc1, vsrc2 );
401
861k
        vdst  = _mm256_permute4x64_epi64( vdst, ( 0 << 0 ) + ( 1 << 4 ) + ( 2 << 2 ) + ( 3 << 6 ) );
402
861k
        _mm256_storeu_si256       ( ( __m256i * ) &dst[col], vdst );
403
861k
      }
404
405
215k
      src += width;
406
215k
      dst += stride;
407
215k
    }
408
3.68k
  }
409
0
  else
410
0
#endif
411
0
  if( W >= 8 )
412
0
  {
413
0
    __m128i vmin = _mm_set1_epi32( outputMin );
414
0
    __m128i vmax = _mm_set1_epi32( outputMax );
415
0
    __m128i vrnd = _mm_set1_epi32( round );
416
417
0
    while( height-- )
418
0
    {
419
0
      for( int col = 0; col < width; col += 8 )
420
0
      {
421
0
        __m128i
422
0
        vsrc1 = _mm_load_si128 ( ( const __m128i * ) &src[col] );
423
0
        vsrc1 = _mm_add_epi32  ( vsrc1, vrnd );
424
0
        vsrc1 = _mm_srai_epi32 ( vsrc1, shift );
425
0
        vsrc1 = _mm_max_epi32  ( _mm_min_epi32( vsrc1, vmax ), vmin );
426
0
        __m128i                
427
0
        vsrc2 = _mm_load_si128 ( ( const __m128i * ) &src[col+4] );
428
0
        vsrc2 = _mm_add_epi32  ( vsrc2, vrnd );
429
0
        vsrc2 = _mm_srai_epi32 ( vsrc2, shift );
430
0
        vsrc2 = _mm_max_epi32  ( _mm_min_epi32( vsrc2, vmax ), vmin );
431
0
        __m128i
432
0
        vdst  = _mm_packs_epi32( vsrc1, vsrc2 );
433
0
        _mm_storeu_si128       ( ( __m128i * ) &dst[col], vdst );
434
0
      }
435
436
0
      src += width;
437
0
      dst += stride;
438
0
    }
439
0
  }
440
0
  else if( W >= 4 )
441
0
  {
442
0
    __m128i vmin = _mm_set1_epi32( outputMin );
443
0
    __m128i vmax = _mm_set1_epi32( outputMax );
444
0
    __m128i vrnd = _mm_set1_epi32( round );
445
446
0
    __m128i vzero = _mm_setzero_si128();
447
0
    __m128i vdst;
448
449
0
    while( height-- )
450
0
    {
451
0
      for( int col = 0; col < width; col += 4 )
452
0
      {
453
0
        vdst = _mm_load_si128 ( ( const __m128i * ) &src[col] );
454
0
        vdst = _mm_add_epi32  ( vdst, vrnd );
455
0
        vdst = _mm_srai_epi32 ( vdst, shift );
456
0
        vdst = _mm_max_epi32  ( _mm_min_epi32( vdst, vmax ), vmin );
457
0
        vdst = _mm_packs_epi32( vdst, vzero );
458
0
        _mm_storeu_si64       ( ( __m128i * ) &dst[col], vdst );
459
0
      }
460
461
0
      src += width;
462
0
      dst += stride;
463
0
    }
464
0
  }
465
0
  else
466
0
  {
467
0
    THROW_FATAL( "Unsupported size" );
468
0
  }
469
3.68k
}
470
471
template<X86_VEXT vext>
472
static void simdInvLfnstNxNCore( int* src, int* dst, const uint32_t mode, const uint32_t index, const uint32_t size, int zeroOutSize )
473
18.3k
{
474
18.3k
  CHECK( index > 2 || ( zeroOutSize != 8 && zeroOutSize != 16 ), "Wrong parameters" );
475
476
18.3k
  static constexpr int maxLog2TrDynamicRange = 15;
477
18.3k
  const TCoeff    outputMinimum = -( 1 << maxLog2TrDynamicRange );
478
18.3k
  const TCoeff    outputMaximum =  ( 1 << maxLog2TrDynamicRange ) - 1;
479
18.3k
  const int8_t*   trMat         = ( size > 4 ) ? g_lfnst8x8[mode][index][0] : g_lfnst4x4[mode][index][0];
480
18.3k
  const int       trSize        = ( size > 4 ) ? 48 : 16;
481
18.3k
  int*            out           = dst;
482
483
18.3k
  const __m128i vzero = _mm_setzero_si128();
484
18.3k
  const __m128i vmin  = _mm_set1_epi32( outputMinimum );
485
18.3k
  const __m128i vmax  = _mm_set1_epi32( outputMaximum );
486
487
196k
  for( int j = 0; j < trSize; j += 4, out += 4 )
488
178k
  {
489
178k
    __m128i       vsum[4];
490
491
891k
    for( int k = 0; k < 4; k++, trMat += 16 )
492
712k
    {
493
712k
      const int8_t* trMatTmp = trMat;
494
712k
      int* srcPtr = src;
495
496
712k
      __m128i vsrc;
497
712k
      __m128i vtr;
498
712k
      __m128i vtmp;
499
712k
      __m128i vcur = vzero;
500
501
2.05M
      for( int i = 0; i < zeroOutSize; i += 8, srcPtr += 8, trMatTmp += 8 )
502
1.33M
      {
503
1.33M
        vsrc = _mm_loadu_si128( ( const __m128i* ) srcPtr );
504
1.33M
        vtr  = _mm_loadu_si64( ( const __m128i* ) trMatTmp );
505
1.33M
        vtr  = _mm_cvtepi8_epi16( vtr );
506
1.33M
        vtmp = _mm_cvtepi16_epi32( vtr );
507
508
1.33M
        vtmp = _mm_mullo_epi32( vsrc, vtmp );
509
1.33M
        vcur = _mm_add_epi32( vtmp, vcur );
510
511
1.33M
        vsrc = _mm_loadu_si128( ( const __m128i* ) &srcPtr[4] );
512
1.33M
        vtmp = _mm_cvtepi16_epi32( _mm_unpackhi_epi64( vtr, vzero ) );
513
      
514
1.33M
        vtmp = _mm_mullo_epi32( vsrc, vtmp );
515
1.33M
        vcur = _mm_add_epi32( vtmp, vcur );
516
1.33M
      }
517
518
712k
      vsum[k] = vcur;
519
712k
    }
520
521
178k
    __m128i vout = _mm_hadd_epi32( _mm_hadd_epi32( vsum[0], vsum[1] ), _mm_hadd_epi32( vsum[2], vsum[3] ) );
522
178k
    vout = _mm_add_epi32( vout, _mm_set1_epi32( 64 ) );
523
178k
    vout = _mm_srai_epi32( vout, 7 );
524
178k
    vout = _mm_min_epi32( _mm_max_epi32( vmin, vout ), vmax );
525
526
178k
    _mm_storeu_si128( ( __m128i* ) out, vout );
527
178k
  }
528
18.3k
}
Unexecuted instantiation: Trafo_sse41.cpp:void vvdec::simdInvLfnstNxNCore<(vvdec::x86_simd::X86_VEXT)1>(int*, int*, unsigned int, unsigned int, unsigned int, int)
Trafo_avx2.cpp:void vvdec::simdInvLfnstNxNCore<(vvdec::x86_simd::X86_VEXT)4>(int*, int*, unsigned int, unsigned int, unsigned int, int)
Line
Count
Source
473
18.3k
{
474
18.3k
  CHECK( index > 2 || ( zeroOutSize != 8 && zeroOutSize != 16 ), "Wrong parameters" );
475
476
18.3k
  static constexpr int maxLog2TrDynamicRange = 15;
477
18.3k
  const TCoeff    outputMinimum = -( 1 << maxLog2TrDynamicRange );
478
18.3k
  const TCoeff    outputMaximum =  ( 1 << maxLog2TrDynamicRange ) - 1;
479
18.3k
  const int8_t*   trMat         = ( size > 4 ) ? g_lfnst8x8[mode][index][0] : g_lfnst4x4[mode][index][0];
480
18.3k
  const int       trSize        = ( size > 4 ) ? 48 : 16;
481
18.3k
  int*            out           = dst;
482
483
18.3k
  const __m128i vzero = _mm_setzero_si128();
484
18.3k
  const __m128i vmin  = _mm_set1_epi32( outputMinimum );
485
18.3k
  const __m128i vmax  = _mm_set1_epi32( outputMaximum );
486
487
196k
  for( int j = 0; j < trSize; j += 4, out += 4 )
488
178k
  {
489
178k
    __m128i       vsum[4];
490
491
891k
    for( int k = 0; k < 4; k++, trMat += 16 )
492
712k
    {
493
712k
      const int8_t* trMatTmp = trMat;
494
712k
      int* srcPtr = src;
495
496
712k
      __m128i vsrc;
497
712k
      __m128i vtr;
498
712k
      __m128i vtmp;
499
712k
      __m128i vcur = vzero;
500
501
2.05M
      for( int i = 0; i < zeroOutSize; i += 8, srcPtr += 8, trMatTmp += 8 )
502
1.33M
      {
503
1.33M
        vsrc = _mm_loadu_si128( ( const __m128i* ) srcPtr );
504
1.33M
        vtr  = _mm_loadu_si64( ( const __m128i* ) trMatTmp );
505
1.33M
        vtr  = _mm_cvtepi8_epi16( vtr );
506
1.33M
        vtmp = _mm_cvtepi16_epi32( vtr );
507
508
1.33M
        vtmp = _mm_mullo_epi32( vsrc, vtmp );
509
1.33M
        vcur = _mm_add_epi32( vtmp, vcur );
510
511
1.33M
        vsrc = _mm_loadu_si128( ( const __m128i* ) &srcPtr[4] );
512
1.33M
        vtmp = _mm_cvtepi16_epi32( _mm_unpackhi_epi64( vtr, vzero ) );
513
      
514
1.33M
        vtmp = _mm_mullo_epi32( vsrc, vtmp );
515
1.33M
        vcur = _mm_add_epi32( vtmp, vcur );
516
1.33M
      }
517
518
712k
      vsum[k] = vcur;
519
712k
    }
520
521
178k
    __m128i vout = _mm_hadd_epi32( _mm_hadd_epi32( vsum[0], vsum[1] ), _mm_hadd_epi32( vsum[2], vsum[3] ) );
522
178k
    vout = _mm_add_epi32( vout, _mm_set1_epi32( 64 ) );
523
178k
    vout = _mm_srai_epi32( vout, 7 );
524
178k
    vout = _mm_min_epi32( _mm_max_epi32( vmin, vout ), vmax );
525
526
178k
    _mm_storeu_si128( ( __m128i* ) out, vout );
527
178k
  }
528
18.3k
}
529
530
template<X86_VEXT vext>
531
void TCoeffOps::_initTCoeffOpsX86()
532
5.61k
{
533
5.61k
  cpyResiClip[2] = cpyResiClip_SSE<vext,  4>;
534
5.61k
  cpyResiClip[3] = cpyResiClip_SSE<vext,  8>;
535
5.61k
  cpyResiClip[4] = cpyResiClip_SSE<vext, 16>;
536
5.61k
  cpyResiClip[5] = cpyResiClip_SSE<vext, 32>;
537
5.61k
  cpyResiClip[6] = cpyResiClip_SSE<vext, 64>;
538
5.61k
  roundClip4     = roundClip_SSE<vext,  4>;
539
5.61k
  roundClip8     = roundClip_SSE<vext,  8>;
540
5.61k
  fastInvCore[0] = fastInv_SSE  <vext,  4>;
541
5.61k
  fastInvCore[1] = fastInv_SSE  <vext,  8>;
542
5.61k
  fastInvCore[2] = fastInv_SSE  <vext, 16>;
543
5.61k
  fastInvCore[3] = fastInv_SSE  <vext, 32>;
544
5.61k
  fastInvCore[4] = fastInv_SSE  <vext, 64>;
545
5.61k
}
Unexecuted instantiation: void vvdec::TCoeffOps::_initTCoeffOpsX86<(vvdec::x86_simd::X86_VEXT)1>()
void vvdec::TCoeffOps::_initTCoeffOpsX86<(vvdec::x86_simd::X86_VEXT)4>()
Line
Count
Source
532
5.61k
{
533
5.61k
  cpyResiClip[2] = cpyResiClip_SSE<vext,  4>;
534
5.61k
  cpyResiClip[3] = cpyResiClip_SSE<vext,  8>;
535
5.61k
  cpyResiClip[4] = cpyResiClip_SSE<vext, 16>;
536
5.61k
  cpyResiClip[5] = cpyResiClip_SSE<vext, 32>;
537
5.61k
  cpyResiClip[6] = cpyResiClip_SSE<vext, 64>;
538
5.61k
  roundClip4     = roundClip_SSE<vext,  4>;
539
5.61k
  roundClip8     = roundClip_SSE<vext,  8>;
540
5.61k
  fastInvCore[0] = fastInv_SSE  <vext,  4>;
541
5.61k
  fastInvCore[1] = fastInv_SSE  <vext,  8>;
542
5.61k
  fastInvCore[2] = fastInv_SSE  <vext, 16>;
543
5.61k
  fastInvCore[3] = fastInv_SSE  <vext, 32>;
544
5.61k
  fastInvCore[4] = fastInv_SSE  <vext, 64>;
545
5.61k
}
546
547
template<X86_VEXT vext>
548
void TrQuant::_initTrQuantX86()
549
59.8k
{
550
59.8k
  m_invLfnstNxN = simdInvLfnstNxNCore<vext>;
551
59.8k
}
Unexecuted instantiation: void vvdec::TrQuant::_initTrQuantX86<(vvdec::x86_simd::X86_VEXT)1>()
void vvdec::TrQuant::_initTrQuantX86<(vvdec::x86_simd::X86_VEXT)4>()
Line
Count
Source
549
59.8k
{
550
59.8k
  m_invLfnstNxN = simdInvLfnstNxNCore<vext>;
551
59.8k
}
552
553
template void TCoeffOps::_initTCoeffOpsX86<SIMDX86>();
554
template void TrQuant::_initTrQuantX86<SIMDX86>();
555
556
#endif // TARGET_SIMD_X86
557
#endif
558
559
}