[英]Better way to store or extract scalar int result using SSE2 intrinsic
我想知道在使用 SSE2 時如何有效地加載和存儲變量。
在這個例子中,我想對 C function 執行pclmulqdq
指令(進行較少的乘法,對多項式算術有用),所以我需要與標准 function 相同的“調用約定”。
a 和 b 是 16 位有效位,結果將有 32 位有效位
#include <wmmintrin.h>
int GFpoly_mul_i(int a, int b) {
__m128i xa = _mm_loadu_si128( (__m128i*) a);
__m128i xb = _mm_loadu_si128((__m128i*) b);
__m128i r = _mm_clmulepi64_si128(xa, xb, 0);
_MM_ALIGN16 int result[4];
__m128i* ptr_result = (__m128i*)result;
_mm_store_si128(ptr_result, r);
return result[0];
}
使用 _mm_cvtsi128_si32 可以輕松地從向量的最低部分提取 32 位_mm_cvtsi128_si32
:
return _mm_cvtsi128_si32(r);
可以使用“相反”操作_mm_cvtsi32_si128
將 32 位 integer 加載到向量的最低部分:
__m128i xa = _mm_cvtsi32_si128(a);
無法使用_mm_loadu_si128( (__m128i*) a)
將 integer a
加載到向量中,這會將a
轉換為指針並取消引用它(讀取 128 位向量),但a
只是一個 integer 值並且不指向任何地方很有用,除了可能是偶然的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.