text: // Copyright 2015 Google Inc. All Rights Reserved.
  //
  // Use of this source code is governed by a BSD-style license
  // that can be found in the COPYING file in the root of the source
  // tree. An additional intellectual property rights grant can be found
  // in the file PATENTS. All contributing project authors may
  // be found in the AUTHORS file in the root of the source tree.
  // -----------------------------------------------------------------------------
  //
  // SSE4.1 variant of methods for lossless encoder
  //
  // Author: Skal (pascal.massimino@gmail.com)
  
  #include "src/dsp/dsp.h"
  
  #if defined(WEBP_USE_SSE41)
  #include <assert.h>
  #include <smmintrin.h>
  #include "src/dsp/lossless.h"
  
  //------------------------------------------------------------------------------
  // Subtract-Green Transform
  
  static void SubtractGreenFromBlueAndRed_SSE41(uint32_t* argb_data,
                                                int num_pixels) {
    int i;
    const __m128i kCstShuffle = _mm_set_epi8(-1, 13, -1, 13, -1, 9, -1, 9,
                                             -1,  5, -1,  5, -1, 1, -1, 1);
    for (i = 0; i + 4 <= num_pixels; i += 4) {
      const __m128i in = _mm_loadu_si128((__m128i*)&argb_data[i]);
      const __m128i in_0g0g = _mm_shuffle_epi8(in, kCstShuffle);
      const __m128i out = _mm_sub_epi8(in, in_0g0g);
      _mm_storeu_si128((__m128i*)&argb_data[i], out);
    }
    // fallthrough and finish off with plain-C
    if (i != num_pixels) {
      VP8LSubtractGreenFromBlueAndRed_C(argb_data + i, num_pixels - i);
    }
  }
  
  //------------------------------------------------------------------------------
  // Entry point
  
  extern void VP8LEncDspInitSSE41(void);
  
  WEBP_TSAN_IGNORE_FUNCTION void VP8LEncDspInitSSE41(void) {
    VP8LSubtractGreenFromBlueAndRed = SubtractGreenFromBlueAndRed_SSE41;
  }
  
  #else  // !WEBP_USE_SSE41
  
  WEBP_DSP_INIT_STUB(VP8LEncDspInitSSE41)
  
  #endif  // WEBP_USE_SSE41
  