我需要使用指令 lddqu 將 128 位值從地址 [rsi - 0x80] 移動到下面的 dest 變數,并且遇到錯誤“`lddqu'的運算元型別不匹配”。我知道之前有一些關于使用較低運算元大小的 stackoverflow 的問題,但是我應該在指令中使用什么后綴才能獲取變數中該地址處的值。
__int128 dst = 0, src = 0;
asm volatile ("lddqu -0x80(%%rsi), %0\n\t"
: "=r" (dst)
: "r" (src));
只是為了概述整個問題,這只是一個更大的圖演算法的一部分,該演算法可以找到兩個頂點之間的最短路徑。src 變數是多余的,如果它增加了歧義,可以將其洗掉。我正在設計一個硬體預取器(在處理器模擬器中)以根據當前訪問的地址預測未來的記憶體地址。一旦我可以在像 dst 這樣的變數中獲得地址,我就有了一種技術,可以自動預測未來的地址并觸發對該地址的記憶體請求。
該模式的較大版本是一系列加載和存盤,如下所示:
lddqu xmm0,[rsi-0x80]
movdqu XMMWORD PTR [rdi-0x80],xmm0
lddqu xmm0,[rsi-0x70]
movdqu XMMWORD PTR [rdi-0x70],xmm0
lddqu xmm0,[rsi-0x60]
movdqu XMMWORD PTR [rdi-0x60],xmm0
lddqu xmm0,[rsi-0x50]
movdqu XMMWORD PTR [rdi-0x50],xmm0
現在,我正在研究如何使行內 asm 與 Intel 語法一起作業。
uj5u.com熱心網友回復:
lddqu只能加載到向量暫存器中,不能加載到通用暫存器中。使用=x代替=rfordst的約束。
此外,您的來源看起來很可疑,因為您忽略了src并且只是從您對其內容一無所知的暫存器的任意偏移量加載。
在你的 asm 陳述句周圍查看編譯器生成的 asm,看看__int128 dst在你強制它進入 XMM 暫存器后編譯器如何回傳記憶體或整數暫存器,例如在https://godbolt.org/ 上,尤其是使用 -O2啟用優化。
像這樣使用行內 asm 的效率可能比使用 SSE 內在函式更糟糕_mm_loadu_si128- 另請參閱https://gcc.gnu.org/wiki/DontUseInlineAsm
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/399346.html
