我在编译器资源管理器中摆弄,发现传递给std::min的参数顺序改变了发出的程序集
下面是Godbolt编译器资源管理器上的示例
双标准最小xy(双x,双y){
返回标准::最小值(x,y);
}
双标准最小值(双x,双y){
返回标准::最小值(y,x);
}
这是编译的(例如,clang 9.0.0上的-O3),目的是:
std_min_xy(双精度,双精度):#@std_min_xy(双精度,双精度)
分钟xmm1,xmm0
movapd xmm0,xmm1
ret
标准最小值(双精度,双精度):#@标准最小值(双精度,双精度)
分钟xmm0,xmm1
ret
如果我将std::min更改为旧式三值运算符,这种情况将持续存在。它也适用于我试用过的所有现代编译器(clang、gcc、icc)
基本指令是minsd。阅读文档时,minsd的第一个参数也是答案的目的地。显然,xmm0是我的函数应该放置其返回值的地方,因此如果xmm0用作第一个参数,则不需要movapd。但是如果xmm0是第二个参数,那么它必须movapd xmm0,xmm1才能将值转换为xmm0。(编者注:是的,x86-64系统V在xmm0、xmm1等中传递FP参数,并在xmm0中返回。)
我的问题:为什么编译器不切换参数本身的顺序,这样就不需要这个movapd?它当然必须知道,minsd的争论顺序不会改变答案?有没有我不欣赏的副作用
answer=“64083083”的数据