簡體   English   中英

內聯匯編錯誤:在重新加載“asm”時在 class 'GENERAL_REGS' 中找不到寄存器

[英]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,因為因為RBPRSP用於幀/堆棧指針,並且可能用於全局偏移量的表RBXRAX保留用於返回)而沒有意識到寄存器重用的潛力。

您可以通過執行以下操作來解決問題:

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.

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