diff options
author | Michael Forney <mforney@mforney.org> | 2021-08-17 13:14:54 -0700 |
---|---|---|
committer | Quentin Carbonneaux <quentin@c9x.me> | 2021-08-27 10:45:13 +0200 |
commit | 804921a3ab463848aa0ffbe495ca542b3789c841 (patch) | |
tree | 17419e724fe59ab12eb16c3404d211ceb523b89c /test/double.ssa | |
parent | 3cbad4d9c465d3f298cbe19c46f7c16f6a9b9f0f (diff) | |
download | roux-804921a3ab463848aa0ffbe495ca542b3789c841.tar.gz |
amd64/isel: fix floating < and <= result with NaN
When the two operands are Unordered (for instance if one of them is NaN), ucomisd sets ZF=1, PF=1, and CF=1. When the result is LessThan, it sets ZF=0, PF=0, and CF=1. However, jb[e]/setb[e] only checks that CF=1 [or ZF=1] which causes the result to be true for unordered operands. To fix this, change the operand swap condition for these two floating point comparison types: always rewrite x < y as y > x, and never rewrite x > y as y < x. Add a test to check the result of cltd, cled, cgtd, cged, ceqd, and cned with arguments that are LessThan, Equal, GreaterThan, and Unordered. Additionally, check three different implementations for equality testing: one that uses the result of ceqd directly, one that uses the result to control a conditional jump, and one that uses the result both as a value and for a conditional jump. For now, unordered equality tests are still broken so they are disabled.
Diffstat (limited to 'test/double.ssa')
0 files changed, 0 insertions, 0 deletions