[英]_mm_load_si128 loads data in reverse order
我正在編寫一個帶有 SSE2 內在函數的 C function 以基本上比較 4 個 32 位整數並檢查哪些大於零,並以 16 位掩碼的形式給出該結果。 我正在使用以下代碼來執行此操作
#include <x86intrin.h>
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
static void cmp_example(void) {
const uint32_t byte_vals[] = {0, 5, 0, 3};
__m128i got_data = _mm_load_si128((__m128i const*)byte_vals);
__m128i cmp_data = _mm_setzero_si128();
__m128i result = _mm_cmpgt_epi32 (got_data, cmp_data);
int mask_result = _mm_movemask_epi8(result);
printf("Result 0x%x\n", mask_result & 0xFFFF);
}
但是,當我編譯並運行它時,它會打印0xf0f0
。 我希望結果遵循從 memory 加載的相同順序。 為了進一步檢查,我添加了一些調試語句,如下所示:
const uint32_t byte_vals[] = {0, 5, 0, 3};
__m128i got_data = _mm_load_si128((__m128i const*)byte_vals);
printf("0x%llx 0x%llx\n", got_data[0], got_data[1]);
__m128i cmp_data = _mm_setzero_si128();
__m128i result = _mm_cmpgt_epi32 (got_data, cmp_data);
printf("0x%llx 0x%llx\n", result[0], result[1]);
int mask_result = _mm_movemask_epi8(result);
printf("Result 0x%x\n", mask_result & 0xFFFF);
此運行打印
0x500000000 0x300000000
0xffffffff00000000 0xffffffff00000000
Result 0xf0f0
因此,這里的罪魁禍首似乎是_mm_load_si128
。
基於此,如何讓_mm_load_si128
以與 memory 中排列的順序相同的順序加載數據?
_mm_load_si128
以小端格式加載數據。 字 0 至少在概念上指向 xmm 寄存器中的元素 0。
但是當這些值打印為十六進制值時,它們以大端格式打印。 xmm 寄存器got_data[0]
的第一個 int64_t 元素包含字節 stream 00 00 00 00 05 00 00 00
,即 0x(000000)0500000000ull。
根據上下文,必須從左到右或從右到左讀取值。 掩碼的第 0 個半字節 (0x000F) 對應於result
的第 0 個字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.