【问题标题】:Subject: FCOMIP does not return consistent results [duplicate]主题:FCOMIP 不返回一致的结果 [重复]
【发布时间】: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 中,这样你就可以使用 minsdmaxsd。)或者使用 comisd xmm0, xmm1 以与 fcomi 相同的方式设置标志。

标签: assembly nasm x86-64 intel


【解决方案1】:

您需要使用 jae 而不是 jge。有关这两个指令之间的区别,请参阅此问题Difference between JA and JG in assembly。虽然浮点比较是有符号的,但它设置标志的方式与无符号比较相同,因此需要使用无符号分支指令。

【讨论】:

  • 您和 Michael Petch 以上给出的答案是解决方案。问题是签名与未签名。非常感谢所有回复的人。
猜你喜欢
  • 2016-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
相关资源
最近更新 更多