gpt4 book ai didi

assembly - 使用英特尔 SSE 执行分支的最佳方法是什么?

转载 作者:行者123 更新时间:2023-12-04 14:17:11 25 4
gpt4 key购买 nike

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

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 标签)进行比较时的行为方式相同。当然,我更喜欢最快的指令来实现这一目标。

最佳答案

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 的条件代码。并将它们与您需要的跳跃相匹配。

关于assembly - 使用英特尔 SSE 执行分支的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9558200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com