我正在写一个编译器,我必须输出浮点值上的分支条件代码。例如,要编译这种代码:
if(a <= b){
//1. DO something
} else {
//2. Do something else
}
当a和b是float变量时。如果条件不成立,我只需要跳到2,否则就跳到1。我在这里考虑在编译器级别考虑1和2中的内容进行优化。
我需要适用于所有比较运算符>,> =,
我发现进行比较的一种方法是使用CMPLTSD(以及其他关系运算符的其他等效指令)。但是,为此,我必须特别将SSE寄存器用于结果,然后将其值移动到通用寄存器(例如eax)上,最后将值与0进行比较。
我还看到UCOMISD指令应该正确设置标志,但是显然它不能按照我的想法工作。
那么,处理这样的代码的最佳方法是什么?是否有比第一个解决方案更好的说明?
我的意思是,最好的办法是解决这个问题。如果可能,我希望代码的行为与对整数(cmp a,b; jge标签)进行比较时的行为相同。当然,我希望有最快的说明来实现这一目标。
最佳答案
ucomisd
的条件代码不与带符号的整数比较码相对应,而是与无符号的比较码相对应(在奇偶校验标志中带有“无序”)。我承认,这有点奇怪,但是所有文件都清楚地记录在案。
如果您实际上想要分支,则代码可能类似于<=
:
ucomisd a,b
ja else ; greater
jp else ; unordered
; code for //1 goes here
jmp end
else:
; code for //2 goes here
end:
对于
<
:jae else ; greater or equal
jp else ; unordered
如果您确实需要,我可以列出所有内容,但是您可以查看
ucomisd
的条件代码,并将其与所需的跳转相匹配。