ifelse
2022-09-17
来自浙江
学习打卡
有学识的兔子
2021-09-20
这些临时变量在调用callee之前需要caller进行spill从寄存器写入内存,在调用完成callee之后需要caller进行reload从内存加载到寄存器。这个过程对于callee来说是不可见的,寄存器的保护交给callee,它也没法完成。
chris
2021-09-15
使用callee保护的寄存器则方法在prolog之后需要对它做保留, epilog中做恢复; 使用caller-save寄存器, 则由当前函数自己决定是否需要在调用前后对其做保留恢复, 如果寄存器的值不跨调用活跃, 就不需要保留恢复了, 这样性能更好
qinsi
2021-09-15
个人理解:Caller保护的寄存器在函数返回之后会由Caller恢复,所以在函数执行时可以随便改;Callee保护的寄存器需要确保进入函数时和函数返回时寄存器中的值是不变的,所以要么函数执行时不要去动它们,要动的话Callee就要负责保存和恢复。相比之下用Caller保护的寄存器成本更低,优先使用,不够用的时候再用Callee保护的寄存器。
奋斗的蜗牛
2021-09-15
优先使用caller保护的寄存器,可能可以在函数内联优化时,去掉callee的寄存器保护代码
罗 乾 林
2021-09-15
使用Callee保护的寄存器作为临时变量必定涉及寄存器的保存和恢复,存在内存访问开销 优先使用Caller保护的寄存器,如果Caller中未使用该寄存器将不用保存和恢复