【发布时间】:2012-03-04 19:43:40
【问题描述】:
我正在编写一个编译器,我必须输出用于浮点值分支条件的代码。例如,要编译这种代码:
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 标签)时的行为方式相同。当然,我更喜欢最快的指令来实现这一点。
【问题讨论】:
-
最好的方法取决于你在做什么。例如,
//DO something块内是什么? “最好的方法”往往取决于看全局,而不是试图逐行翻译你的代码。 -
我在帖子中添加了详细信息以回答您的两个问题。
-
如果你真的想分支,UCOMISD(实际上是 SSE2)似乎是答案,它有什么问题?无序结果?
-
UCOMISD的问题是根据比较的结果不知道怎么跳转。我尝试用 jle 跳跃,但没有得到预期的结果。我必须使用特殊的条件跳转指令吗?
标签: assembly compiler-construction intel sse