我正在编写一个编译器,我必须输出浮点值分支条件的代码。例如,要编译这种类型的代码:使用Intel 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)时的行为相同。当然,我宁愿用最快的指令来实现这一点。
最好的办法*取决于你在做什么*。如在里面,'// DO something'块里面是什么? “最好的方式”通常取决于看整张图片,而不是试图逐行翻译你的代码。 – jalf 2012-03-04 19:48:43
我在帖子中添加了详细信息来回答你的两个问题。 – 2012-03-04 19:56:42
如果你真的想分支,UCOMISD(实际上是SSE2)似乎是答案,它有什么问题?无序的结果? – harold 2012-03-04 20:02:21