簡體   English   中英

_mm_load_si128 以相反的順序加載數據

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

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