[英]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.