[英]inline assembly error: can't find a register in class 'GENERAL_REGS' while reloading 'asm'
我有一個內聯AT&T樣式的匯編塊,它適用於XMM寄存器,並且在我的XCode項目的發布配置中沒有問題,但是我在調試配置中偶然發現了這個奇怪的錯誤(據說是GCC錯誤)...我可以以某種方式修復它嗎? 匯編代碼沒什么特別的,但是我用了很多memory約束( 12個約束),會不會導致這個問題?
Debug 配置默認使用-O0
。 由於此標志禁用優化,編譯器可能無法根據您的內聯匯編代碼指定的約束分配寄存器,從而導致寄存器不足。
一種解決方案是指定不同的優化級別,例如-Os
,這是發布配置中默認使用的優化級別。
不是一個完整的答案,對不起,但評論部分太短了......
您可以發布一個示例asm("...":::)
行來演示該問題嗎?
使用 XMM 寄存器不是問題,錯誤消息表明 GCC 想要創建代碼,例如:
movdqa (%rax),%xmm0
即 memory 通過保存在通用寄存器中的指針加載/存儲,並且您指定的 memory 位置比可用的通用 regs 更多(在調試模式下可能為 12,因為因為RBP
, RSP
用於幀/堆棧指針,並且可能用於全局偏移量的表RBX
和RAX
保留用於返回)而沒有意識到寄存器重用的潛力。
您可以通過執行以下操作來解決問題:
void *all_mem_args_tbl[16] = { memarg1, memarg2, ... };
void *trashme;
asm ("movq (%0), %1\n\t"
"movdqa (%1), %xmm0\n\t"
"movq 8(%0), %1\n\t"
"movdqa (%1), %xmm1\n\t"
...
: "r"all_mem_args_tbl : "r"(trashme) : ...);
即把所有的內存位置放到一個你作為操作數傳遞的表中,然后你自己管理實際的通用寄存器使用。 它可能是通過間接表訪問兩個指針,但是如果不知道完整的匯編代碼段,很難說這是否會有所不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.