2012-03-12 379 views
0

我优化OpenRISC C代码,我想手动prereserve在寄存器中的一些计算值,伪代码看起来像这样:的内联汇编使用寄存器

external loop 
    compute eight values (heavy calculations) 
    internal loop 
     use values computed above 

当我看着GCC ABI为OpenRISC我看到两组寄存器:被保存的和临时的?我应该使用哪些寄存器来存储这八个值?我的意思是,哪些寄存器可以放入内联asm中的clobbered列表?

我需要努力注册,因为我们在自定义的OpenRISC上运行可执行文件。

回答

1

答案是:无论你喜欢什么。

如果你使用callee-save寄存器,那么编译器会为你保存它们(只要你标记它们被破坏)。

如果您使用临时寄存器(a.k.a. caller-save),那么编译器将被强制保存它们,如果您进行函数调用。请注意,编译器也倾向于将这些用于其他变量,所以如果你使用了保存调用者的函数,它将不得不使用callee-save来处理其他事情,所以它最终可能会产生同样的变化。

在一天结束时,如果您正在进行繁重的计算,那么在您开始之前保存一些寄存器堆栈并不会有什么大不了的。

有些寄存器包含重要值(如堆栈指针),您不能覆盖它们。其他的,比如GOT表格指针不那么重要,编译器会在你完成时恢复它的值(只要确保在这个过程中你不需要它)。

真的,虽然你不需要去解决它自己:编译器可以为您选择寄存器:

int a, b, c; 

asm volatile ("whatever" : "=&w" (a), "=&w" (b), "=&w" (c)); 

不需要的变量,但他们必须分配寄存器,所以他们有效地保留任何你想要一个寄存器中的&表示“early-clobber”,这意味着它们不能像输入寄存器那样共享相同的寄存器(不是我的示例显示了任何内容)。