汇编 – 使用英特尔SSE执行分支的最佳方法是什么?

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

if(a <= b){
    //1. DO something
} else {
    //2. Do something else
}

当a和b是浮点变量时.如果条件不正确,我只需要跳到2,否则降到1.我正在考虑编译器级别的优化,考虑1和2中的内容.

我需要一些适用于所有比较运算符的东西>,> =,<,< =,==和!= 我发现进行比较的一种方法是使用CMPLTSD(以及其他关系运算符的其他等效指令).但是,我必须使用SSE寄存器,特别是结果,然后我必须在通用寄存器(例如eax)上移动它的值,最后将值与0进行比较. 我还看到UCOMISD指令应该正确设置标志,但显然它不像我想象的那样工作. 那么,处理这样的代码的最佳方法是什么?有没有比我的第一个解决方案更好的指示? 最好的,我的意思是,这个问题的一般解决方案.如果可能的话,我希望代码的行为与对整数进行比较的方式相同(cmp a,b; jge label).当然,我更希望用最快的指令来实现这一目标.

ucomisd的条件代码不对应有符号整数比较代码,而是对应无符号整数(在奇偶校验标志中为“无序”).我承认,这有点奇怪,但都清楚地记录在案.
如果你真的想要分支的代码可能是这样的< =:

ucomisd a,b
  ja else     ; greater
  jp else     ; unordered
  ; code for //1 goes here
  jmp end
else:
  ; code for //2 goes here
end:

对于&lt ;:

jae else   ; greater or equal
jp else    ; unordered

如果你真的想要,我可以列出所有这些,但你可以查看ucomisd的条件代码,并将它们与你需要的跳转相匹配.

相关文章
相关标签/搜索