我想知道 Neon 指令中与 SSE 指令等效的指令/代码是什么。
__m128i a,b,c;
c = _mm_packs_epi32(a, b);
将 a 和 b 中的 8 个带符号的 32 位整数打包成带符号的 16 位整数并饱和。
我检查了 ARM 网站上的等效指令,但没有找到任何等效指令。 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204j/Bcfjicfj.html
我想知道 Neon 指令中与 SSE 指令等效的指令/代码是什么。
__m128i a,b,c;
c = _mm_packs_epi32(a, b);
将 a 和 b 中的 8 个带符号的 32 位整数打包成带符号的 16 位整数并饱和。
我检查了 ARM 网站上的等效指令,但没有找到任何等效指令。 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0204j/Bcfjicfj.html
没有指令可以直接执行您想要的操作,但是构建一个的所有构建块都在那里:
饱和/窄指令是:
int16x4_t vqmovn_s32 (int32x4_t)
此内在函数从带符号的 32 位整数到带符号的 16 位整数饱和,在 64 位宽的变量中返回四个窄整数。
将这些组合到您的 _mm_packs_epi32 中很容易:只需为 a 和 b 执行此操作,然后组合结果:
int32x4_t a,b;
int16x8_t c;
c = vcombine_s16 (vqmovn_s32(a), vqmovn_s32(b));
您可能必须交换 vcombine_s16 参数的顺序。
此打包/饱和操作属于 NEON 中的MOV指令类别:
VQMOVN (Vector Saturating Move and Narrow) copies each element of the operand vector to the corresponding element of the destination vector. The result element is half the width of the operand element, and values are saturated to the result width.