2013-10-06 65 views
1

我想要做的是加载四个char值并将它们添加到4个浮点数的向量中。起初我所做的就是这样的事情:是否有与char *的_mm_loadu_ps等价的?

// char b[1024] is defined somewhere else 
__declspec(align(16)) float d[3]; 
__declspec(align(16)) float a[4]; 
__m128* pSrcDst1 = (__m128*) d; 
__m128* pSrc2 = (__m128*) a; 

a[0] = b[i ]; 
a[1] = b[i+1]; 
a[2] = b[i+2]; 
a[3] = b[i+3]; 

*pSrcDst1 = _mm_add_ps(*pSrcDst1, *pSrc2); 

我想采取的类似_mm_loadu_pschar*的优势,所以我可以做的:

// char b[1024] is defined somewhere else 
__declspec(align(16)) float d[3]; 
__declspec(align(16)) float a[4]; 
__declspec(align(16)) char c[4]; 
__m128* pSrcDst1 = (__m128*) d; 
__m128* pSrc2 = (__m128*) a; 
__m64* pSrc3 = (__m64*) c; 

*pSrc3 = _mm_loadu_ps(&b[i]); 
*pSrc2 = _mm_cvtpu8_ps(*pSrc3); 
*pSrcDst1 = _mm_add_ps(*pSrcDst1, *pSrc2); 

什么是这样做的正确的&优化的方式?

+0

为您添加一个字符到一个浮点数意味着什么? –

+0

@JohnZwinck - 对不起,没有说清楚 - 它的8位无符号int – zenpoy

回答

2

从我可以告诉你,你首先需要扩展你的uint8_t值为uint32_t值,然后你可以加载它们并做任何你喜欢的操作。有关详细信息,请参见此处:SSE: convert short integer to float

+0

+1是正确的,并链接到我的答案。 ;-) –

相关问题