【发布时间】:2018-05-05 21:21:44
【问题描述】:
使用x86 assembler: floating point compare 的示例,我编写了以下 NASM 代码,它比较两个双精度并选择两者中较小的一个:
fld qword[a]
fld qword[b]
fcomip
fstp qword [float_temp_var] ; to clear stack
jge minmax1_next
movsd xmm0,[b]
movsd [minval],xmm0
jmp minmax1_out
minmax1_next:
movsd xmm0,[a]
movsd [minval],xmm0
minmax1_out:
唯一的问题是结果不一致。有时它会正确识别较小的值,有时则不能。根据上面网址的帖子,我不需要存储或弹出标志寄存器,所以我不知道我做错了什么。研究没有发现问题。
【问题讨论】:
-
您阅读了链接到代码的问题还是阅读了答案?您链接到的问题有一个错误。他们使用了签名比较,这是你在这里犯的一个错误。
-
考虑到使用相同解决方案的问题完全相同,我将冒险将其标记为您链接到的问题的重复项。
-
既然您已经在使用 SIMD (SSE2) 指令,有什么理由不使用 SIMD comparison 并停止使用 x87 FPU 指令?
-
@Michael Petch,谢谢。我将更改为无符号比较,我还将尝试 SIMD 比较。我宁愿使用 SIMD 而不是 x87。我认为我不会重复链接到的问题,因为它的解决方案在这里不起作用,并且您说它有相同的错误(未签名与已签名)。我会尽快发布结果。再次感谢。
-
提示:What is the instruction that gives branchless FP min and max on x86?:使用
movsd xmm0, [a]/minsd xmm0, [b]可以更轻松地做到这一点。 (或者将两者都加载到 regs 中,这样你就可以使用minsd和maxsd。)或者使用comisd xmm0, xmm1以与fcomi相同的方式设置标志。
标签: assembly nasm x86-64 intel