Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(237)

Unified Diff: src/s390/simulator-s390.h

Issue 1773813002: S390: Fixed condition code handling on FP->INT and FP rounding in simulator. (Closed) Base URL: https://github.com/v8/v8.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/s390/simulator-s390.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/s390/simulator-s390.h
diff --git a/src/s390/simulator-s390.h b/src/s390/simulator-s390.h
index 1da49ed279189436bd95824fccdd7260e6e719dd..f8d0d565896c7ac2e5796b35955d492d73af42bf 100644
--- a/src/s390/simulator-s390.h
+++ b/src/s390/simulator-s390.h
@@ -317,6 +317,66 @@ class Simulator {
bool DecodeSixByteArithmetic(Instruction* instr);
bool S390InstructionDecode(Instruction* instr);
+ // Used by the CL**BR instructions.
+ template <typename T1, typename T2>
+ void SetS390RoundConditionCode(T1 r2_val, T2 max, T2 min) {
+ condition_reg_ = 0;
+ double r2_dval = static_cast<double>(r2_val);
+ double dbl_min = static_cast<double>(min);
+ double dbl_max = static_cast<double>(max);
+
+ if (r2_dval == 0.0)
+ condition_reg_ = 8;
+ else if (r2_dval < 0.0 && r2_dval >= dbl_min && std::isfinite(r2_dval))
+ condition_reg_ = 4;
+ else if (r2_dval > 0.0 && r2_dval <= dbl_max && std::isfinite(r2_dval))
+ condition_reg_ = 2;
+ else
+ condition_reg_ = 1;
+ }
+
+ template <typename T1>
+ void SetS390RoundConditionCode(T1 r2_val, int64_t max, int64_t min) {
+ condition_reg_ = 0;
+ double r2_dval = static_cast<double>(r2_val);
+ double dbl_min = static_cast<double>(min);
+ double dbl_max = static_cast<double>(max);
+
+ // Note that the IEEE 754 floating-point representations (both 32 and
+ // 64 bit) cannot exactly represent INT64_MAX. The closest it can get
+ // is INT64_max + 1. IEEE 754 FP can, though, represent INT64_MIN
+ // exactly.
+
+ // This is not an issue for INT32, as IEEE754 64-bit can represent
+ // INT32_MAX and INT32_MIN with exact precision.
+
+ if (r2_dval == 0.0)
+ condition_reg_ = 8;
+ else if (r2_dval < 0.0 && r2_dval >= dbl_min && std::isfinite(r2_dval))
+ condition_reg_ = 4;
+ else if (r2_dval > 0.0 && r2_dval < dbl_max && std::isfinite(r2_dval))
+ condition_reg_ = 2;
+ else
+ condition_reg_ = 1;
+ }
+
+ // Used by the CL**BR instructions.
+ template <typename T1, typename T2, typename T3>
+ void SetS390ConvertConditionCode(T1 src, T2 dst, T3 max) {
+ condition_reg_ = 0;
+ if (src == static_cast<T1>(0.0)) {
+ condition_reg_ |= 8;
+ } else if (src < static_cast<T1>(0.0) && static_cast<T2>(src) == 0 &&
+ std::isfinite(src)) {
+ condition_reg_ |= 4;
+ } else if (src > static_cast<T1>(0.0) && std::isfinite(src) &&
+ src < static_cast<T1>(max)) {
+ condition_reg_ |= 2;
+ } else {
+ condition_reg_ |= 1;
+ }
+ }
+
template <typename T>
void SetS390ConditionCode(T lhs, T rhs) {
condition_reg_ = 0;
« no previous file with comments | « no previous file | src/s390/simulator-s390.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698