Mercurial > libavcodec.hg
comparison dsputil.c @ 10104:0fa3d21b317e libavcodec
SSE optimized vector_clipf(). 10% faster TwinVQ decoding.
author | vitor |
---|---|
date | Thu, 27 Aug 2009 14:49:36 +0000 |
parents | a1f5f022adba |
children | 7775f6627612 |
comparison
equal
deleted
inserted
replaced
10103:2066cbe806ef | 10104:0fa3d21b317e |
---|---|
4091 int i; | 4091 int i; |
4092 for(i=0; i<len; i++) | 4092 for(i=0; i<len; i++) |
4093 dst[i] = src[i] * mul; | 4093 dst[i] = src[i] * mul; |
4094 } | 4094 } |
4095 | 4095 |
4096 static inline uint32_t clipf_c_one(uint32_t a, uint32_t mini, | |
4097 uint32_t maxi, uint32_t maxisign) | |
4098 { | |
4099 | |
4100 if(a > mini) return mini; | |
4101 else if((a^(1<<31)) > maxisign) return maxi; | |
4102 else return a; | |
4103 } | |
4104 | |
4105 static void vector_clipf_c_opposite_sign(float *dst, float *src, float *min, float *max, int len){ | |
4106 int i; | |
4107 uint32_t mini = *(uint32_t*)min; | |
4108 uint32_t maxi = *(uint32_t*)max; | |
4109 uint32_t maxisign = maxi ^ (1<<31); | |
4110 uint32_t *dsti = (uint32_t*)dst; | |
4111 uint32_t *srci = (uint32_t*)src; | |
4112 for(i=0; i<len; i+=8) { | |
4113 dsti[i + 0] = clipf_c_one(srci[i + 0], mini, maxi, maxisign); | |
4114 dsti[i + 1] = clipf_c_one(srci[i + 1], mini, maxi, maxisign); | |
4115 dsti[i + 2] = clipf_c_one(srci[i + 2], mini, maxi, maxisign); | |
4116 dsti[i + 3] = clipf_c_one(srci[i + 3], mini, maxi, maxisign); | |
4117 dsti[i + 4] = clipf_c_one(srci[i + 4], mini, maxi, maxisign); | |
4118 dsti[i + 5] = clipf_c_one(srci[i + 5], mini, maxi, maxisign); | |
4119 dsti[i + 6] = clipf_c_one(srci[i + 6], mini, maxi, maxisign); | |
4120 dsti[i + 7] = clipf_c_one(srci[i + 7], mini, maxi, maxisign); | |
4121 } | |
4122 } | |
4123 static void vector_clipf_c(float *dst, float *src, float min, float max, int len){ | |
4124 int i; | |
4125 if(min < 0 && max > 0) { | |
4126 vector_clipf_c_opposite_sign(dst, src, &min, &max, len); | |
4127 } else { | |
4128 for(i=0; i < len; i+=8) { | |
4129 dst[i ] = av_clipf(src[i ], min, max); | |
4130 dst[i + 1] = av_clipf(src[i + 1], min, max); | |
4131 dst[i + 2] = av_clipf(src[i + 2], min, max); | |
4132 dst[i + 3] = av_clipf(src[i + 3], min, max); | |
4133 dst[i + 4] = av_clipf(src[i + 4], min, max); | |
4134 dst[i + 5] = av_clipf(src[i + 5], min, max); | |
4135 dst[i + 6] = av_clipf(src[i + 6], min, max); | |
4136 dst[i + 7] = av_clipf(src[i + 7], min, max); | |
4137 } | |
4138 } | |
4139 } | |
4140 | |
4096 static av_always_inline int float_to_int16_one(const float *src){ | 4141 static av_always_inline int float_to_int16_one(const float *src){ |
4097 int_fast32_t tmp = *(const int32_t*)src; | 4142 int_fast32_t tmp = *(const int32_t*)src; |
4098 if(tmp & 0xf0000){ | 4143 if(tmp & 0xf0000){ |
4099 tmp = (0x43c0ffff - tmp)>>31; | 4144 tmp = (0x43c0ffff - tmp)>>31; |
4100 // is this faster on some gcc/cpu combinations? | 4145 // is this faster on some gcc/cpu combinations? |
4667 c->vector_fmul = vector_fmul_c; | 4712 c->vector_fmul = vector_fmul_c; |
4668 c->vector_fmul_reverse = vector_fmul_reverse_c; | 4713 c->vector_fmul_reverse = vector_fmul_reverse_c; |
4669 c->vector_fmul_add_add = ff_vector_fmul_add_add_c; | 4714 c->vector_fmul_add_add = ff_vector_fmul_add_add_c; |
4670 c->vector_fmul_window = ff_vector_fmul_window_c; | 4715 c->vector_fmul_window = ff_vector_fmul_window_c; |
4671 c->int32_to_float_fmul_scalar = int32_to_float_fmul_scalar_c; | 4716 c->int32_to_float_fmul_scalar = int32_to_float_fmul_scalar_c; |
4717 c->vector_clipf = vector_clipf_c; | |
4672 c->float_to_int16 = ff_float_to_int16_c; | 4718 c->float_to_int16 = ff_float_to_int16_c; |
4673 c->float_to_int16_interleave = ff_float_to_int16_interleave_c; | 4719 c->float_to_int16_interleave = ff_float_to_int16_interleave_c; |
4674 c->add_int16 = add_int16_c; | 4720 c->add_int16 = add_int16_c; |
4675 c->sub_int16 = sub_int16_c; | 4721 c->sub_int16 = sub_int16_c; |
4676 c->scalarproduct_int16 = scalarproduct_int16_c; | 4722 c->scalarproduct_int16 = scalarproduct_int16_c; |