Advertisement
Guest User

Untitled

a guest
Feb 13th, 2014
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.29 KB | None | 0 0
  1. void ff_hevc_put_hevc_qpel_v4_8_sse (                          
  2.                                     int16_t *dst, ptrdiff_t dststride,        
  3.                                     uint8_t *_src, ptrdiff_t _srcstride,      
  4.                                     int width, int height, int mx, int my) {  
  5.     int x, y;                                                                  
  6.     int shift = 8 - 8;                                                        
  7.     const int8_t *filter_v = ff_hevc_qpel_filters[my - 1];                    
  8.    __m128i x1, x2, x3, x4, r1, r2, r3, r4, c1, c2, c3, c4, t1, t2;            
  9.     const __m128i c0    = _mm_setzero_si128();                                
  10.     uint8_t  *src       = (uint8_t*) _src;                                    
  11.     ptrdiff_t srcstride = _srcstride;                                                          
  12.     c1 = _mm_unpacklo_epi8(_mm_set1_epi8(filter_v[0]), _mm_set1_epi8(filter_v[1]));
  13.     c2 = _mm_unpacklo_epi8(_mm_set1_epi8(filter_v[2]), _mm_set1_epi8(filter_v[3]));
  14.     c3 = _mm_unpacklo_epi8(_mm_set1_epi8(filter_v[4]), _mm_set1_epi8(filter_v[5]));
  15.     c4 = _mm_unpacklo_epi8(_mm_set1_epi8(filter_v[6]), _mm_set1_epi8(filter_v[7]));                                              
  16.     for (y = 0; y < height; y++) {                                            
  17.         for (x = 0; x < width; x += 4) {                                      
  18.             x1 = _mm_loadl_epi64((__m128i *) &src[x - 3 * srcstride]);                
  19.     x2 = _mm_loadl_epi64((__m128i *) &src[x - 2 * srcstride]);                
  20.     x3 = _mm_loadl_epi64((__m128i *) &src[x - 1 * srcstride]);                
  21.     x4 = _mm_loadl_epi64((__m128i *) &src[x                ]);                
  22.     x1 = _mm_unpacklo_epi8(x1, x2);                                            
  23.     x2 = _mm_unpacklo_epi8(x3, x4);                                    
  24.             x1   = _mm_maddubs_epi16(x1, c1);                                          
  25.     x2   = _mm_maddubs_epi16(x2, c2);                                          
  26.     r1 = _mm_add_epi16(x1, x2);                      
  27.             x1 = _mm_loadl_epi64((__m128i *) &src[x +     srcstride]);                
  28.     x2 = _mm_loadl_epi64((__m128i *) &src[x + 2 * srcstride]);                
  29.     x3 = _mm_loadl_epi64((__m128i *) &src[x + 3 * srcstride]);                
  30.     x4 = _mm_loadl_epi64((__m128i *) &src[x + 4 * srcstride]);                
  31.     x1 = _mm_unpacklo_epi8(x1, x2);                                            
  32.     x2 = _mm_unpacklo_epi8(x3, x4);                                    
  33.             x1   = _mm_maddubs_epi16(x1, c3);                                          
  34.     x2   = _mm_maddubs_epi16(x2, c4);                                          
  35.     r3 = _mm_add_epi16(x1, x2);                      
  36.             r1 = _mm_add_epi16(r1, r3);                                      
  37.             _mm_storel_epi64((__m128i *) &dst[x], r1);                                              
  38.         }                                                                      
  39.         src += srcstride;                                                      
  40.         dst += dststride;                                                      
  41.     }                                                                          
  42. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement