Geo*_*rey 7 c++ sse intrinsics
我正在编写一个执行音频处理的SSE方法的问题.我在这里基于英特尔的论文实现了一个SSE随机函数:
我还有一个使用SSE执行从Float到S16的转换的方法,转换执行非常简单,如下所示:
unsigned int Float_S16LE(float *data, const unsigned int samples, uint8_t *dest)
{
int16_t *dst = (int16_t*)dest;
const __m128 mul = _mm_set_ps1((float)INT16_MAX);
__m128 rand;
const uint32_t even = count & ~0x3;
for(uint32_t i = 0; i < even; i += 4, data += 4, dst += 4)
{
/* random round to dither */
FloatRand4(-0.5f, 0.5f, NULL, &rand);
__m128 rmul = _mm_add_ps(mul, rand);
__m128 in = _mm_mul_ps(_mm_load_ps(data),rmul);
__m64 con = _mm_cvtps_pi16(in);
memcpy(dst, &con, sizeof(int16_t) * 4);
}
}
Run Code Online (Sandbox Code Playgroud)
FloatRand4定义如下:
static inline void FloatRand4(const float min, const float max, float result[4], __m128 *sseresult = NULL)
{
const float delta = (max - min) / 2.0f;
const float factor = delta / (float)INT32_MAX;
...
}
Run Code Online (Sandbox Code Playgroud)
如果sseresult != NULL在__m128返回结果和result未使用.这在第一个循环上表现完美,但在下一个循环delta变为-1.#INF而不是1.0.如果我注释掉这条线__m64 con = _mm_cvtps_pi16(in);,问题就会消失.
我认为FPU正在进入一个未知的状态.
混合SSE整数算术和(常规)浮点数学.可以产生奇怪的结果,因为它们都在相同的寄存器上运行.如果您使用:
_mm_empty()
Run Code Online (Sandbox Code Playgroud)
FPU重置为正确状态.Microsoft提供了何时使用EMMS的指南
| 归档时间: |
|
| 查看次数: |
530 次 |
| 最近记录: |