diff options
author | Jacob Bramley <jacob.bramley@arm.com> | 2020-07-02 14:23:08 +0100 |
---|---|---|
committer | Jacob Bramley <jacob.bramley@arm.com> | 2020-07-02 15:39:38 +0000 |
commit | 4606adc3f68d4e8ca1366d39894b025aec197d0f (patch) | |
tree | 2d272ebe5c0375f09f66f44ad0c85bfe7f242380 /src | |
parent | 5a5e71f38f87ef19ca3729158f972aa1a5afaae3 (diff) | |
download | vixl-4606adc3f68d4e8ca1366d39894b025aec197d0f.tar.gz |
Fix simulation of FCMNE.
FCMNE can return true when the comparison is unordered.
Change-Id: Ic1fa9a83cd9bde23faf2b13b69d3a7e9d1426a12
Diffstat (limited to 'src')
-rw-r--r-- | src/aarch64/logic-aarch64.cc | 62 |
1 files changed, 31 insertions, 31 deletions
diff --git a/src/aarch64/logic-aarch64.cc b/src/aarch64/logic-aarch64.cc index 48d97e8b..cab02573 100644 --- a/src/aarch64/logic-aarch64.cc +++ b/src/aarch64/logic-aarch64.cc @@ -4915,41 +4915,41 @@ LogicVRegister Simulator::fcmp(VectorFormat vform, bool result = false; T op1 = src1.Float<T>(i); T op2 = src2.Float<T>(i); - T nan_result = FPProcessNaNs(op1, op2); + bool unordered = IsNaN(FPProcessNaNs(op1, op2)); - if (cond == uo) { - result = IsNaN(nan_result); + switch (cond) { + case eq: + result = (op1 == op2); + break; + case ge: + result = (op1 >= op2); + break; + case gt: + result = (op1 > op2); + break; + case le: + result = (op1 <= op2); + break; + case lt: + result = (op1 < op2); + break; + case ne: + result = (op1 != op2); + break; + case uo: + result = unordered; + break; + default: + // Other conditions are defined in terms of those above. + VIXL_UNREACHABLE(); + break; } - if (!IsNaN(nan_result)) { - switch (cond) { - case eq: - result = (op1 == op2); - break; - case ge: - result = (op1 >= op2); - break; - case gt: - result = (op1 > op2); - break; - case le: - result = (op1 <= op2); - break; - case lt: - result = (op1 < op2); - break; - case ne: - result = (op1 != op2); - break; - case uo: - // do nothing. - VIXL_ASSERT(result == false); - break; - default: - VIXL_UNREACHABLE(); - break; - } + if (result && unordered) { + // Only `uo` and `ne` can be true for unordered comparisons. + VIXL_ASSERT((cond == uo) || (cond == ne)); } + dst.SetUint(vform, i, result ? MaxUintFromFormat(vform) : 0); } return dst; |