---
Needs to be tested on PPC and ARM.

 libavcodec/ac3enc_fixed.c           |    4 +-
 libavcodec/ac3enc_float.c           |    4 +-
 libavcodec/ac3enc_template.c        |    6 ++--
 libavcodec/arm/dsputil_init_neon.c  |    3 --
 libavcodec/arm/dsputil_neon.S       |   26 ---------------
 libavcodec/cook.c                   |    9 +++--
 libavcodec/dsputil.c                |   46 ---------------------------
 libavcodec/dsputil.h                |    2 -
 libavcodec/x86/dsputil_mmx.c        |   36 ---------------------
 libavutil/arm/float_dsp_init_neon.c |    4 ++
 libavutil/arm/float_dsp_neon.S      |   26 +++++++++++++++
 libavutil/float_dsp.c               |   59 +++++++++++++++++++++++++++++++++++
 libavutil/float_dsp.h               |   16 +++++++++
 libavutil/x86/float_dsp_init.c      |   39 +++++++++++++++++++++++
 14 files changed, 156 insertions(+), 124 deletions(-)

diff --git a/libavcodec/ac3enc_fixed.c b/libavcodec/ac3enc_fixed.c
index e471edf..ce306cb 100644
--- a/libavcodec/ac3enc_fixed.c
+++ b/libavcodec/ac3enc_fixed.c
@@ -111,9 +111,9 @@ static void scale_coefficients(AC3EncodeContext *s)
 /*
  * Clip MDCT coefficients to allowable range.
  */
-static void clip_coefficients(DSPContext *dsp, int32_t *coef, unsigned int len)
+static void clip_coefficients(AC3EncodeContext *s, int32_t *coef, unsigned int 
len)
 {
-    dsp->vector_clip_int32(coef, coef, COEF_MIN, COEF_MAX, len);
+    s->dsp.vector_clip_int32(coef, coef, COEF_MIN, COEF_MAX, len);
 }
 
 
diff --git a/libavcodec/ac3enc_float.c b/libavcodec/ac3enc_float.c
index a225d9b..1ef635f 100644
--- a/libavcodec/ac3enc_float.c
+++ b/libavcodec/ac3enc_float.c
@@ -121,9 +121,9 @@ static void scale_coefficients(AC3EncodeContext *s)
 /*
  * Clip MDCT coefficients to allowable range.
  */
-static void clip_coefficients(DSPContext *dsp, float *coef, unsigned int len)
+static void clip_coefficients(AC3EncodeContext *s, float *coef, unsigned int 
len)
 {
-    dsp->vector_clipf(coef, coef, COEF_MIN, COEF_MAX, len);
+    s->fdsp.vector_clipf(coef, coef, COEF_MIN, COEF_MAX, len);
 }
 
 
diff --git a/libavcodec/ac3enc_template.c b/libavcodec/ac3enc_template.c
index 388d753..b445f01 100644
--- a/libavcodec/ac3enc_template.c
+++ b/libavcodec/ac3enc_template.c
@@ -39,7 +39,7 @@ static void apply_window(void *dsp, SampleType *output,
 
 static int normalize_samples(AC3EncodeContext *s);
 
-static void clip_coefficients(DSPContext *dsp, CoefType *coef, unsigned int 
len);
+static void clip_coefficients(AC3EncodeContext *s, CoefType *coef, unsigned 
int len);
 
 static CoefType calc_cpl_coord(CoefSumType energy_ch, CoefSumType energy_cpl);
 
@@ -160,7 +160,7 @@ static void apply_channel_coupling(AC3EncodeContext *s)
         }
 
         /* coefficients must be clipped in order to be encoded */
-        clip_coefficients(&s->dsp, cpl_coef, num_cpl_coefs);
+        clip_coefficients(s, cpl_coef, num_cpl_coefs);
     }
 
     /* calculate energy in each band in coupling channel and each fbw channel 
*/
@@ -411,7 +411,7 @@ int AC3_NAME(encode_frame)(AVCodecContext *avctx, AVPacket 
*avpkt,
     if (s->fixed_point)
         scale_coefficients(s);
 
-    clip_coefficients(&s->dsp, s->blocks[0].mdct_coef[1],
+    clip_coefficients(s, s->blocks[0].mdct_coef[1],
                       AC3_MAX_COEFS * s->num_blocks * s->channels);
 
     s->cpl_on = s->cpl_enabled;
diff --git a/libavcodec/arm/dsputil_init_neon.c 
b/libavcodec/arm/dsputil_init_neon.c
index 34bb619..c8eb56b 100644
--- a/libavcodec/arm/dsputil_init_neon.c
+++ b/libavcodec/arm/dsputil_init_neon.c
@@ -149,8 +149,6 @@ void ff_vector_fmul_reverse_neon(float *dst, const float 
*src0,
 void ff_vector_fmul_add_neon(float *dst, const float *src0, const float *src1,
                              const float *src2, int len);
 
-void ff_vector_clipf_neon(float *dst, const float *src, float min, float max,
-                          int len);
 void ff_vector_clip_int32_neon(int32_t *dst, const int32_t *src, int32_t min,
                                int32_t max, unsigned int len);
 
@@ -304,7 +302,6 @@ void ff_dsputil_init_neon(DSPContext *c, AVCodecContext 
*avctx)
     c->scalarproduct_float        = ff_scalarproduct_float_neon;
     c->vector_fmul_reverse        = ff_vector_fmul_reverse_neon;
     c->vector_fmul_add            = ff_vector_fmul_add_neon;
-    c->vector_clipf               = ff_vector_clipf_neon;
     c->vector_clip_int32          = ff_vector_clip_int32_neon;
 
     if (CONFIG_VORBIS_DECODER)
diff --git a/libavcodec/arm/dsputil_neon.S b/libavcodec/arm/dsputil_neon.S
index a0d201c..5d588b0 100644
--- a/libavcodec/arm/dsputil_neon.S
+++ b/libavcodec/arm/dsputil_neon.S
@@ -671,32 +671,6 @@ function ff_vector_fmul_add_neon, export=1
         bx              lr
 endfunc
 
-function ff_vector_clipf_neon, export=1
-VFP     vdup.32         q1,  d0[1]
-VFP     vdup.32         q0,  d0[0]
-NOVFP   vdup.32         q0,  r2
-NOVFP   vdup.32         q1,  r3
-NOVFP   ldr             r2,  [sp]
-        vld1.f32        {q2},[r1,:128]!
-        vmin.f32        q10, q2,  q1
-        vld1.f32        {q3},[r1,:128]!
-        vmin.f32        q11, q3,  q1
-1:      vmax.f32        q8,  q10, q0
-        vmax.f32        q9,  q11, q0
-        subs            r2,  r2,  #8
-        beq             2f
-        vld1.f32        {q2},[r1,:128]!
-        vmin.f32        q10, q2,  q1
-        vld1.f32        {q3},[r1,:128]!
-        vmin.f32        q11, q3,  q1
-        vst1.f32        {q8},[r0,:128]!
-        vst1.f32        {q9},[r0,:128]!
-        b               1b
-2:      vst1.f32        {q8},[r0,:128]!
-        vst1.f32        {q9},[r0,:128]!
-        bx              lr
-endfunc
-
 function ff_apply_window_int16_neon, export=1
         push            {r4,lr}
         add             r4,  r1,  r3,  lsl #1
diff --git a/libavcodec/cook.c b/libavcodec/cook.c
index 0bc3f37..2bc33f9 100644
--- a/libavcodec/cook.c
+++ b/libavcodec/cook.c
@@ -43,6 +43,7 @@
  */
 
 #include "libavutil/channel_layout.h"
+#include "libavutil/float_dsp.h"
 #include "libavutil/lfg.h"
 #include "avcodec.h"
 #include "get_bits.h"
@@ -122,7 +123,7 @@ typedef struct cook {
     void (*saturate_output)(struct cook *q, float *out);
 
     AVCodecContext*     avctx;
-    DSPContext          dsp;
+    AVFloatDSPContext   fdsp;
     AVFrame             frame;
     GetBitContext       gb;
     /* stream data */
@@ -866,8 +867,8 @@ static inline void decode_bytes_and_gain(COOKContext *q, 
COOKSubpacket *p,
  */
 static void saturate_output_float(COOKContext *q, float *out)
 {
-    q->dsp.vector_clipf(out, q->mono_mdct_output + q->samples_per_channel,
-                        -1.0f, 1.0f, FFALIGN(q->samples_per_channel, 16));
+    q->fdsp.vector_clipf(out, q->mono_mdct_output + q->samples_per_channel,
+                         -1.0f, 1.0f, FFALIGN(q->samples_per_channel, 16));
 }
 
 
@@ -1066,7 +1067,7 @@ static av_cold int cook_decode_init(AVCodecContext *avctx)
     /* Initialize RNG. */
     av_lfg_init(&q->random_state, 0);
 
-    ff_dsputil_init(&q->dsp, avctx);
+    avpriv_float_dsp_init(&q->fdsp, avctx->flags & CODEC_FLAG_BITEXACT);
 
     while (edata_ptr < edata_ptr_end) {
         /* 8 for mono, 16 for stereo, ? for multichannel
diff --git a/libavcodec/dsputil.c b/libavcodec/dsputil.c
index 91a4da5..659a197 100644
--- a/libavcodec/dsputil.c
+++ b/libavcodec/dsputil.c
@@ -2401,51 +2401,6 @@ float ff_scalarproduct_float_c(const float *v1, const 
float *v2, int len)
     return p;
 }
 
-static inline uint32_t clipf_c_one(uint32_t a, uint32_t mini,
-                   uint32_t maxi, uint32_t maxisign)
-{
-
-    if(a > mini) return mini;
-    else if((a^(1U<<31)) > maxisign) return maxi;
-    else return a;
-}
-
-static void vector_clipf_c_opposite_sign(float *dst, const float *src, float 
*min, float *max, int len){
-    int i;
-    uint32_t mini = *(uint32_t*)min;
-    uint32_t maxi = *(uint32_t*)max;
-    uint32_t maxisign = maxi ^ (1U<<31);
-    uint32_t *dsti = (uint32_t*)dst;
-    const uint32_t *srci = (const uint32_t*)src;
-    for(i=0; i<len; i+=8) {
-        dsti[i + 0] = clipf_c_one(srci[i + 0], mini, maxi, maxisign);
-        dsti[i + 1] = clipf_c_one(srci[i + 1], mini, maxi, maxisign);
-        dsti[i + 2] = clipf_c_one(srci[i + 2], mini, maxi, maxisign);
-        dsti[i + 3] = clipf_c_one(srci[i + 3], mini, maxi, maxisign);
-        dsti[i + 4] = clipf_c_one(srci[i + 4], mini, maxi, maxisign);
-        dsti[i + 5] = clipf_c_one(srci[i + 5], mini, maxi, maxisign);
-        dsti[i + 6] = clipf_c_one(srci[i + 6], mini, maxi, maxisign);
-        dsti[i + 7] = clipf_c_one(srci[i + 7], mini, maxi, maxisign);
-    }
-}
-static void vector_clipf_c(float *dst, const float *src, float min, float max, 
int len){
-    int i;
-    if(min < 0 && max > 0) {
-        vector_clipf_c_opposite_sign(dst, src, &min, &max, len);
-    } else {
-        for(i=0; i < len; i+=8) {
-            dst[i    ] = av_clipf(src[i    ], min, max);
-            dst[i + 1] = av_clipf(src[i + 1], min, max);
-            dst[i + 2] = av_clipf(src[i + 2], min, max);
-            dst[i + 3] = av_clipf(src[i + 3], min, max);
-            dst[i + 4] = av_clipf(src[i + 4], min, max);
-            dst[i + 5] = av_clipf(src[i + 5], min, max);
-            dst[i + 6] = av_clipf(src[i + 6], min, max);
-            dst[i + 7] = av_clipf(src[i + 7], min, max);
-        }
-    }
-}
-
 static int32_t scalarproduct_int16_c(const int16_t * v1, const int16_t * v2, 
int order)
 {
     int res = 0;
@@ -2822,7 +2777,6 @@ av_cold void ff_dsputil_init(DSPContext* c, 
AVCodecContext *avctx)
 #endif
     c->vector_fmul_reverse = vector_fmul_reverse_c;
     c->vector_fmul_add = vector_fmul_add_c;
-    c->vector_clipf = vector_clipf_c;
     c->scalarproduct_int16 = scalarproduct_int16_c;
     c->scalarproduct_and_madd_int16 = scalarproduct_and_madd_int16_c;
     c->apply_window_int16 = apply_window_int16_c;
diff --git a/libavcodec/dsputil.h b/libavcodec/dsputil.h
index 22d6a17..39f71f8 100644
--- a/libavcodec/dsputil.h
+++ b/libavcodec/dsputil.h
@@ -352,8 +352,6 @@ typedef struct DSPContext {
     void (*vector_fmul_reverse)(float *dst, const float *src0, const float 
*src1, int len);
     /* assume len is a multiple of 8, and src arrays are 16-byte aligned */
     void (*vector_fmul_add)(float *dst, const float *src0, const float *src1, 
const float *src2, int len);
-    /* assume len is a multiple of 16, and arrays are 16-byte aligned */
-    void (*vector_clipf)(float *dst /* align 16 */, const float *src /* align 
16 */, float min, float max, int len /* align 16 */);
     /**
      * Calculate the scalar product of two vectors of floats.
      * @param v1  first vector, 16-byte aligned
diff --git a/libavcodec/x86/dsputil_mmx.c b/libavcodec/x86/dsputil_mmx.c
index 7ac6ecb..43dc37b 100644
--- a/libavcodec/x86/dsputil_mmx.c
+++ b/libavcodec/x86/dsputil_mmx.c
@@ -1892,40 +1892,6 @@ static void vorbis_inverse_coupling_sse(float *mag, 
float *ang, int blocksize)
     }
 }
 
-static void vector_clipf_sse(float *dst, const float *src,
-                             float min, float max, int len)
-{
-    x86_reg i = (len - 16) * 4;
-    __asm__ volatile (
-        "movss          %3, %%xmm4      \n\t"
-        "movss          %4, %%xmm5      \n\t"
-        "shufps $0, %%xmm4, %%xmm4      \n\t"
-        "shufps $0, %%xmm5, %%xmm5      \n\t"
-        "1:                             \n\t"
-        "movaps   (%2, %0), %%xmm0      \n\t" // 3/1 on intel
-        "movaps 16(%2, %0), %%xmm1      \n\t"
-        "movaps 32(%2, %0), %%xmm2      \n\t"
-        "movaps 48(%2, %0), %%xmm3      \n\t"
-        "maxps      %%xmm4, %%xmm0      \n\t"
-        "maxps      %%xmm4, %%xmm1      \n\t"
-        "maxps      %%xmm4, %%xmm2      \n\t"
-        "maxps      %%xmm4, %%xmm3      \n\t"
-        "minps      %%xmm5, %%xmm0      \n\t"
-        "minps      %%xmm5, %%xmm1      \n\t"
-        "minps      %%xmm5, %%xmm2      \n\t"
-        "minps      %%xmm5, %%xmm3      \n\t"
-        "movaps     %%xmm0,   (%1, %0)  \n\t"
-        "movaps     %%xmm1, 16(%1, %0)  \n\t"
-        "movaps     %%xmm2, 32(%1, %0)  \n\t"
-        "movaps     %%xmm3, 48(%1, %0)  \n\t"
-        "sub           $64, %0          \n\t"
-        "jge            1b              \n\t"
-        : "+&r"(i)
-        : "r"(dst), "r"(src), "m"(min), "m"(max)
-        : "memory"
-    );
-}
-
 #endif /* HAVE_INLINE_ASM */
 
 int32_t ff_scalarproduct_int16_mmxext(const int16_t *v1, const int16_t *v2,
@@ -2268,8 +2234,6 @@ static void dsputil_init_sse(DSPContext *c, 
AVCodecContext *avctx, int mm_flags)
     }
 
     c->vorbis_inverse_coupling = vorbis_inverse_coupling_sse;
-
-    c->vector_clipf = vector_clipf_sse;
 #endif /* HAVE_INLINE_ASM */
 
 #if HAVE_YASM
diff --git a/libavutil/arm/float_dsp_init_neon.c 
b/libavutil/arm/float_dsp_init_neon.c
index 16ea471..473bf45 100644
--- a/libavutil/arm/float_dsp_init_neon.c
+++ b/libavutil/arm/float_dsp_init_neon.c
@@ -35,10 +35,14 @@ void ff_vector_fmul_scalar_neon(float *dst, const float 
*src, float mul,
 void ff_vector_fmul_window_neon(float *dst, const float *src0,
                                 const float *src1, const float *win, int len);
 
+void ff_vector_clipf_neon(float *dst, const float *src, float min, float max,
+                          int len);
+
 void ff_float_dsp_init_neon(AVFloatDSPContext *fdsp)
 {
     fdsp->vector_fmul = ff_vector_fmul_neon;
     fdsp->vector_fmac_scalar = ff_vector_fmac_scalar_neon;
     fdsp->vector_fmul_scalar = ff_vector_fmul_scalar_neon;
     fdsp->vector_fmul_window = ff_vector_fmul_window_neon;
+    fdsp->vector_clipf       = ff_vector_clipf_neon;
 }
diff --git a/libavutil/arm/float_dsp_neon.S b/libavutil/arm/float_dsp_neon.S
index 540cfc6..75504a8 100644
--- a/libavutil/arm/float_dsp_neon.S
+++ b/libavutil/arm/float_dsp_neon.S
@@ -193,3 +193,29 @@ function ff_vector_fmul_window_neon, export=1
         vst1.32         {d22,d23},[ip,:128], r5
         pop             {r4,r5,pc}
 endfunc
+
+function ff_vector_clipf_neon, export=1
+VFP     vdup.32         q1,  d0[1]
+VFP     vdup.32         q0,  d0[0]
+NOVFP   vdup.32         q0,  r2
+NOVFP   vdup.32         q1,  r3
+NOVFP   ldr             r2,  [sp]
+        vld1.f32        {q2},[r1,:128]!
+        vmin.f32        q10, q2,  q1
+        vld1.f32        {q3},[r1,:128]!
+        vmin.f32        q11, q3,  q1
+1:      vmax.f32        q8,  q10, q0
+        vmax.f32        q9,  q11, q0
+        subs            r2,  r2,  #8
+        beq             2f
+        vld1.f32        {q2},[r1,:128]!
+        vmin.f32        q10, q2,  q1
+        vld1.f32        {q3},[r1,:128]!
+        vmin.f32        q11, q3,  q1
+        vst1.f32        {q8},[r0,:128]!
+        vst1.f32        {q9},[r0,:128]!
+        b               1b
+2:      vst1.f32        {q8},[r0,:128]!
+        vst1.f32        {q9},[r0,:128]!
+        bx              lr
+endfunc
diff --git a/libavutil/float_dsp.c b/libavutil/float_dsp.c
index cf33df3..9105a0e 100644
--- a/libavutil/float_dsp.c
+++ b/libavutil/float_dsp.c
@@ -16,8 +16,11 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
+#include <stdint.h>
+
 #include "config.h"
 
+#include "common.h"
 #include "float_dsp.h"
 
 static void vector_fmul_c(float *dst, const float *src0, const float *src1,
@@ -71,6 +74,61 @@ static void vector_fmul_window_c(float *dst, const float 
*src0,
     }
 }
 
+static inline uint32_t clipf_c_one(uint32_t a, uint32_t mini, uint32_t maxi,
+                                   uint32_t maxisign)
+{
+
+    if (a > mini)
+        return mini;
+    else if ((a ^ (1U << 31)) > maxisign)
+        return maxi;
+    else
+        return a;
+}
+
+static void vector_clipf_c_opposite_sign(float *dst, const float *src,
+                                         float *min, float *max, int len)
+{
+    int i;
+    uint32_t mini        = *(uint32_t *)min;
+    uint32_t maxi        = *(uint32_t *)max;
+    uint32_t maxisign    = maxi ^ (1U << 31);
+    uint32_t *dsti       = (uint32_t *)dst;
+    const uint32_t *srci = (const uint32_t *)src;
+
+    for (i = 0; i < len; i += 8) {
+        dsti[i + 0] = clipf_c_one(srci[i + 0], mini, maxi, maxisign);
+        dsti[i + 1] = clipf_c_one(srci[i + 1], mini, maxi, maxisign);
+        dsti[i + 2] = clipf_c_one(srci[i + 2], mini, maxi, maxisign);
+        dsti[i + 3] = clipf_c_one(srci[i + 3], mini, maxi, maxisign);
+        dsti[i + 4] = clipf_c_one(srci[i + 4], mini, maxi, maxisign);
+        dsti[i + 5] = clipf_c_one(srci[i + 5], mini, maxi, maxisign);
+        dsti[i + 6] = clipf_c_one(srci[i + 6], mini, maxi, maxisign);
+        dsti[i + 7] = clipf_c_one(srci[i + 7], mini, maxi, maxisign);
+    }
+}
+
+static void vector_clipf_c(float *dst, const float *src, float min, float max,
+                           int len)
+{
+    int i;
+
+    if (min < 0 && max > 0) {
+        vector_clipf_c_opposite_sign(dst, src, &min, &max, len);
+    } else {
+        for (i = 0; i < len; i += 8) {
+            dst[i    ] = av_clipf(src[i    ], min, max);
+            dst[i + 1] = av_clipf(src[i + 1], min, max);
+            dst[i + 2] = av_clipf(src[i + 2], min, max);
+            dst[i + 3] = av_clipf(src[i + 3], min, max);
+            dst[i + 4] = av_clipf(src[i + 4], min, max);
+            dst[i + 5] = av_clipf(src[i + 5], min, max);
+            dst[i + 6] = av_clipf(src[i + 6], min, max);
+            dst[i + 7] = av_clipf(src[i + 7], min, max);
+        }
+    }
+}
+
 void avpriv_float_dsp_init(AVFloatDSPContext *fdsp, int bit_exact)
 {
     fdsp->vector_fmul = vector_fmul_c;
@@ -78,6 +136,7 @@ void avpriv_float_dsp_init(AVFloatDSPContext *fdsp, int 
bit_exact)
     fdsp->vector_fmul_scalar = vector_fmul_scalar_c;
     fdsp->vector_dmul_scalar = vector_dmul_scalar_c;
     fdsp->vector_fmul_window = vector_fmul_window_c;
+    fdsp->vector_clipf       = vector_clipf_c;
 
 #if ARCH_ARM
     ff_float_dsp_init_arm(fdsp);
diff --git a/libavutil/float_dsp.h b/libavutil/float_dsp.h
index 1cc70cc..07e8fc1 100644
--- a/libavutil/float_dsp.h
+++ b/libavutil/float_dsp.h
@@ -100,6 +100,22 @@ typedef struct AVFloatDSPContext {
      */
     void (*vector_fmul_window)(float *dst, const float *src0,
                                const float *src1, const float *win, int len);
+
+    /**
+     * Clip a vector of floats to a given range.
+     * Source and destination vectors must overlap exactly or not at all.
+     *
+     * @param dst result vector
+     *            constraints: 16-byte aligned
+     * @param src source vector
+     *            constraints: 16-byte aligned
+     * @param min minimum value
+     * @param max maximum value
+     * @param len length of vector
+     *            constraints: multiple of 16
+     */
+    void (*vector_clipf)(float *dst, const float *src, float min, float max,
+                         int len);
 } AVFloatDSPContext;
 
 /**
diff --git a/libavutil/x86/float_dsp_init.c b/libavutil/x86/float_dsp_init.c
index 5078af3..7b0711e 100644
--- a/libavutil/x86/float_dsp_init.c
+++ b/libavutil/x86/float_dsp_init.c
@@ -48,6 +48,42 @@ extern void ff_vector_fmul_window_avx(float *dst, const 
float *src0,
                                       const float *src1, const float *win,
                                       int len);
 
+#if HAVE_INLINE_ASM
+static void vector_clipf_sse(float *dst, const float *src, float min,
+                             float max, int len)
+{
+    x86_reg i = (len - 16) * 4;
+    __asm__ volatile (
+        "movss          %3, %%xmm4      \n\t"
+        "movss          %4, %%xmm5      \n\t"
+        "shufps $0, %%xmm4, %%xmm4      \n\t"
+        "shufps $0, %%xmm5, %%xmm5      \n\t"
+        "1:                             \n\t"
+        "movaps   (%2, %0), %%xmm0      \n\t" // 3/1 on intel
+        "movaps 16(%2, %0), %%xmm1      \n\t"
+        "movaps 32(%2, %0), %%xmm2      \n\t"
+        "movaps 48(%2, %0), %%xmm3      \n\t"
+        "maxps      %%xmm4, %%xmm0      \n\t"
+        "maxps      %%xmm4, %%xmm1      \n\t"
+        "maxps      %%xmm4, %%xmm2      \n\t"
+        "maxps      %%xmm4, %%xmm3      \n\t"
+        "minps      %%xmm5, %%xmm0      \n\t"
+        "minps      %%xmm5, %%xmm1      \n\t"
+        "minps      %%xmm5, %%xmm2      \n\t"
+        "minps      %%xmm5, %%xmm3      \n\t"
+        "movaps     %%xmm0,   (%1, %0)  \n\t"
+        "movaps     %%xmm1, 16(%1, %0)  \n\t"
+        "movaps     %%xmm2, 32(%1, %0)  \n\t"
+        "movaps     %%xmm3, 48(%1, %0)  \n\t"
+        "sub           $64, %0          \n\t"
+        "jge            1b              \n\t"
+        : "+&r"(i)
+        : "r"(dst), "r"(src), "m"(min), "m"(max)
+        : "memory"
+    );
+}
+#endif /* HAVE_INLINE_ASM */
+
 void ff_float_dsp_init_x86(AVFloatDSPContext *fdsp)
 {
     int mm_flags = av_get_cpu_flags();
@@ -56,6 +92,9 @@ void ff_float_dsp_init_x86(AVFloatDSPContext *fdsp)
         fdsp->vector_fmul = ff_vector_fmul_sse;
         fdsp->vector_fmac_scalar = ff_vector_fmac_scalar_sse;
         fdsp->vector_fmul_scalar = ff_vector_fmul_scalar_sse;
+#if HAVE_INLINE_ASM
+        fdsp->vector_clipf = vector_clipf_sse;
+#endif
     }
     if (EXTERNAL_SSE2(mm_flags)) {
         fdsp->vector_dmul_scalar = ff_vector_dmul_scalar_sse2;
-- 
1.7.1

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to