[英]Loading and storing YMM registers using gcc inline assembly
為了將 __m256i 存儲到特定的 YMM 寄存器(比如 YMM10),我使用以下代碼
__m256i addr; //load value to addr asm ("vmovdqa %0,%%ymm10\n\t": : "x" (addr):);
為了將 YMM10 中的值加載到變量中,我使用以下代碼
__m256i readbuff; asm ("vmovdqa %%ymm10,%0\n\t"\: "=x" (readbuff)\:\:);
我在這里面臨的問題是,在我用一個值加載 YMM10 之后,我只使用了加載值的寄存器的一半。 我的意思是只加載了 128 位,而另一半全為零。
我做錯什么了嗎? 我不確定要使用什么指令 - vmovdqa、vmovaps、vmovups。 請就此給我建議。
你似乎試圖用內聯匯編做的整體設計被打破了。 這不是內聯匯編的工作方式。 這可能是一個 XY 問題; 你想讓你的代碼做一些事情,而你選擇了一種不可行的方法。
我的意思是只加載了 128 位,而另一半全為零。
聽起來像veroupper
在某個地方做了一個驗證,可能在你的 asm 語句之間的 function 調用邊界。 您沒有告訴 GCC YMM10 是您希望稍后閱讀的 output 。 (有點類似於GCC 不會在我的內聯匯編 function 調用周圍推送寄存器,即使我有 clobbers錯誤地使用內聯匯編)。 在這種情況下,GCC 踩到了您的數據; 在其他情況下,您可以破壞 GCC 放在那里的一些數據,稍后再讀取。
__m256i
您真的想說服編譯器制作更糟糕的register __m256i ymm10 asm("ymm10")
而不是__m256i
變量像往常一樣注冊。
但真的不要。 您可以使用 gcc -S foo.c -o-查看GCC 的 asm gcc -S foo.c -o- | less
gcc -S foo.c -o- | less
或什么的。 (不要忘記通常的-O3 -march=native
或其他)。 如何從 GCC/clang 程序集 output 中刪除“噪音”? 在某些 YMM 寄存器上使用您自己的vmovdqa
指令,而 GCC 出於自己的目的使用其他 YMM 寄存器,只會使 asm 變得更糟。 https://gcc.gnu.org/wiki/DontUseInlineAsm
另請參閱https://stackoverflow.com/tags/inline-assembly/info了解如何正確使用 GNU C 內聯匯編的指南和文檔。 (但您可能根本不需要 asm。)
Note that "x" (addr)
requires GCC to already have __m256i addr
in another YMM register, so it's not even "loading" from memory, it's just copying YMM registers after GCC already loaded it from memory if necessary. 這就是為什么我如此強烈地說這是沒有意義的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.