aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJacob Bramley <jacob.bramley@arm.com>2020-07-02 14:23:08 +0100
committerJacob Bramley <jacob.bramley@arm.com>2020-07-02 15:39:38 +0000
commit4606adc3f68d4e8ca1366d39894b025aec197d0f (patch)
tree2d272ebe5c0375f09f66f44ad0c85bfe7f242380 /src
parent5a5e71f38f87ef19ca3729158f972aa1a5afaae3 (diff)
downloadvixl-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.cc62
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;