簡體   English   中英

使用 gcc 內聯匯編加載和存儲 YMM 寄存器

[英]Loading and storing YMM registers using gcc inline assembly


我正在嘗試使用 gcc 內聯匯編加載和存儲 YMM 寄存器。 我使用 vmovdqa 來執行此操作。

為了將 __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.

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