我一直在尝试使用微软的SSE内置函数来优化我的代码。优化代码时最大的问题之一是每当我想要使用常量时都会发生LHS。有一些关于生成特定常量的信息(这里和这里 - 第13.4节),但都是汇编语言(我宁愿避免使用)。问题在于,当我尝试使用内置函数实现相同的功能时,MSVC会抱怨不兼容的类型等。是否有人知道使用内置函数的等效技巧?例如 - 生成{1.0,1.0,1.0,1.0}。
这会生成一堆关于不兼容类型(__m128 vs _m128i)的错误。由于我对此很陌生,所以我相信我肯定漏掉了一些明显的东西。有人能帮忙吗?
简而言之 - 我如何使用ms内部函数生成一个填充有单精度常量浮点数的__m128向量?
谢谢阅读 :)
//pcmpeqw xmm0,xmm0
__m128 t = _mm_cmpeq_epi16( t, t );
//pslld xmm0,25
_mm_slli_epi32(t, 25);
//psrld xmm0,2
return _mm_srli_epi32(t, 2);
这会生成一堆关于不兼容类型(__m128 vs _m128i)的错误。由于我对此很陌生,所以我相信我肯定漏掉了一些明显的东西。有人能帮忙吗?
简而言之 - 我如何使用ms内部函数生成一个填充有单精度常量浮点数的__m128向量?
谢谢阅读 :)
t
之前生成一个pxor指令将其清零,即使您正在尝试使用未初始化的变量。根据编译器的不同,您可能更容易从_mm_set1_epi16(-1)
开始,因为编译器知道如何使用pcmpge进行操作。还有_mm_undefined_si128()
,专门用于此类情况,但并非所有编译器都支持它。例如,clang-3.5不支持,但clang-3.8支持。 - Peter Cordes