我正在写一个编译器,我必须输出浮点值上的分支条件代码。例如,要编译这种代码:

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的条件代码,并将其与所需的跳转相匹配。

10-08 14:52