Home | History | Annotate | Download | only in simd
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "media/base/vector_math_testing.h"
      6 
      7 #include <xmmintrin.h>  // NOLINT
      8 
      9 namespace media {
     10 namespace vector_math {
     11 
     12 void FMUL_SSE(const float src[], float scale, int len, float dest[]) {
     13   const int rem = len % 4;
     14   const int last_index = len - rem;
     15   __m128 m_scale = _mm_set_ps1(scale);
     16   for (int i = 0; i < last_index; i += 4)
     17     _mm_store_ps(dest + i, _mm_mul_ps(_mm_load_ps(src + i), m_scale));
     18 
     19   // Handle any remaining values that wouldn't fit in an SSE pass.
     20   for (int i = last_index; i < len; ++i)
     21     dest[i] = src[i] * scale;
     22 }
     23 
     24 void FMAC_SSE(const float src[], float scale, int len, float dest[]) {
     25   const int rem = len % 4;
     26   const int last_index = len - rem;
     27   __m128 m_scale = _mm_set_ps1(scale);
     28   for (int i = 0; i < last_index; i += 4) {
     29     _mm_store_ps(dest + i, _mm_add_ps(_mm_load_ps(dest + i),
     30                  _mm_mul_ps(_mm_load_ps(src + i), m_scale)));
     31   }
     32 
     33   // Handle any remaining values that wouldn't fit in an SSE pass.
     34   for (int i = last_index; i < len; ++i)
     35     dest[i] += src[i] * scale;
     36 }
     37 
     38 }  // namespace vector_math
     39 }  // namespace media
     40