簡體   English   中英

使用 SSE2 intrinsic 存儲或提取標量 int 結果的更好方法

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM