Bap*_*cht 6 compiler-construction assembly sse intel
我正在编写一个编译器,我必须输出浮点值的分支条件代码.例如,要编译这种代码:
if(a <= b){
//1. DO something
} else {
//2. Do something else
}
Run Code Online (Sandbox Code Playgroud)
当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:
Run Code Online (Sandbox Code Playgroud)
用于<:
jae else ; greater or equal
jp else ; unordered
Run Code Online (Sandbox Code Playgroud)
如果你真的想要,我可以列出所有这些,但你可以查看条件代码ucomisd并将它们与你需要的跳跃相匹配.