【发布时间】:2017-06-13 11:36:41
【问题描述】:
【问题讨论】:
标签: compiler-construction clang llvm inline-assembly
【问题讨论】:
标签: compiler-construction clang llvm inline-assembly
一个被破坏的寄存器是一个被丢弃的寄存器,即被内联汇编器以不可预知的方式修改。这通常发生在您需要临时工时。注册或使用特定指令,该指令恰好将某些寄存器修改为副产品。
通常程序员显式声明被他的内联汇编代码破坏的寄存器,但有些可能被认为默认被丢弃,这就是getClobbers发挥作用的地方。
getClobbers 为大多数目标返回空结果。在 MIPS 上,GCC 历来没有在生成的代码中使用 $1,因此大多数程序员都懒得将其声明为已破坏。为了降低可移植性成本,LLVM 认为$1 总是在内联汇编中被破坏。另一个例子是算术标志寄存器 (cc),它是 GCC 在 i386 和 x86_64 目标上的 considered to be always clobbered by inline asm。
【讨论】:
"cc",因为许多整数指令不可避免地会写入它们。我知道您并不想列出详尽的清单,但这是针对主要 ISA 的清单。